Skip to main content
GameDev.net gamedev.net
🔒 Locked

Normals for smoothing groups issue

Started by paulg568 Jan 23, 2012 at 5:31 AM 2 replies 2.9k views
Original Post
paulg568
paulg568
I have been creating an obj loader. I have pretty much everything working except for smoothing groups. They partially work.

I go through all the faces and check if their indicies are part of multiple smoothing groups. If so I mark what index was part of a separate smoothing group. Then I go through again and duplicate that vertex and update the faces array to use that new vertex.

I hope that makes sense.

Here is a screenshot of two chess pieces. In it you can see the knight and the rook have certain areas that are smoothing nicely and others that you can clearly see the polygons. I feel like I am duplicating vertices too many times if they are part of too many faces but I can't seem to fix it. If anyone has any idea what I am doing wrong I would greatly appreciate it. Code is below the picture. Thanks for the help.

FYXRj.png

Here is the code for finding shared vertices and the how I duplicate them.
It probably looks confusing and is.... so if you want me to explain it more I can. Thanks for the help.


void ObjFileReader::findSharedVertices(int numberOfObjects, int sizeOfVerts, QVector<int> *faces, QVector<int> *repeatedIndices, QVector<int> *repeatsInsideFaces, QVector<int> *smoothingGroups){
QVector<int> *smooths = new QVector<int>[numberOfObjects];
for(int i = 0; i < numberOfObjects; i++){
repeatedIndices.resize(sizeOfVerts);
smooths.resize(sizeOfVerts);
for(int j = 0; j < faces.size(); j++){
repeatedIndices[faces[j]]++;
if(repeatedIndices[faces[j]] > 1){
if(smooths[faces[j]] == smoothingGroups[j]){
repeatedIndices[faces[j]]--;
} else {
repeatsInsideFaces.append(j);
}
} else {
smooths[faces[j]] = smoothingGroups[j];
}
}
}
}
void ObjFileReader::duplicateSharedVertices(int numberOfObjects, QVector<int> *smoothingGroupIndices, QVector<int> *faces, QVector<Point3d> *m_points, QVector<int> *uvCoordinateIndexing, QVector<int> *repeatedIndices, QVector<int> *repeatsInsideFaces){
int total = 0;
for(int i = 0; i < numberOfObjects; i++){
for(int j = 0; j < repeatsInsideFaces.size(); j++){
m_points->append((*m_points)[faces[repeatsInsideFaces[j]]]);
faces[repeatsInsideFaces[j]] = m_points->size()-1;
}
}
}
Ashaman73
Ashaman73
I do it the other way around. First I give every tri its own copy of its 3 vertices. Then I compare all vertex pairs at the same position (considering a small tolerance threshold) and merge them, when they meet some criteria like
- same texture and texture coord
- same normal
- same smoothing group
...
dpadam450
dpadam450
I do it by hand when I make the model. Any non-smooth parts I specifically separate and then put them back together as one model. You might want to try doing that as it might be easier and is visually driven rather than behind the scenes in code.
NBA2K, Madden, Maneater, Killing Floor, Sims 
paulg568
paulg568
Well I want the obj reader to be able to handle objects from maya, max, blender and what ever else, so handling just my models won't be good enough( I downloaded the chess pieces from turbosquid.com ). I am trying to follow the format for the obj file spec so maybe I will try generating my normals the other way around like ashman.

Thanks everyone I'll let you know my progress.

Topic Locked

This topic has been locked by a moderator. New replies are not allowed.

Sign in to reply to this topic.