Normals for smoothing groups issue

Started by
2 comments, last by paulg568 12 years, 2 months ago
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;
}
}
}
Advertisement
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
...
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 http://www.pawlowskipinball.com/pinballeternal

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.

This topic is closed to new replies.

Advertisement