Normals for smoothing groups issue

This topic is 2824 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

Recommended Posts

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.

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; } } } 

Share on other sites
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
...

Share on other sites
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.

Share on other sites
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.

• Game Developer Survey

We are looking for qualified game developers to participate in a 10-minute online survey. Qualified participants will be offered a \$15 incentive for your time and insights. Click here to start!

• 16
• 11
• 9
• 24
• 45