Dzung Nguyen

Back

3D Mesh Editor

Posted on Mar 30, 2019

C++
OpenGL
QT Creator


In CIS 560 (Computer Graphics), I built a mini version of Autodesk Maya. The goal was to understand a geometric data structure called half-edge, which is a popular way to represent 3D geometry, and taking advantage of the relationships between components of a half-edge mesh to perform mesh editing algorithms such as extrusion, Catmull-Clark Subdivision, and triangulation. In addition, I implemented an OBJ loader to load any OBJ formatted 3D data into the editor. I also learned the structure of a skeleton-joint structure and how different methods of skinning works in order to implement linear-blend and dual quaternion skinning. This was one of my favorite projects in the course because I got to learn very important, fundamental concepts of computer graphics programming and because I am able to gain a better understanding of some of the tools that I use so much in 3D software like Max and Maya.

The biggest challenge that I encountered with the project was when I implemented Catmull-Clark subdivision. The concept sounds simple: just divide each face into quads and smooth vertices. Implementation-wise, it was fairly tricky. The hardest part was to ensure that the component pointers are set correctly, especially during quadrangulate, a process in which we divide each face of the geometry into quads. The end result is very satisfying. Smoothing meshes is a tool that exists in almost any 3D software in the market.

Mesh Editor
Beach ball featuring Catmull-Clark Subdivision.

These were JSON files containing joint parent and children relationships provided for us. I used Qt JSON parsing classes (QJsonArray, QJasonObject, QJasonDocument) to parse the files and create a skeleton structure from it.

Mesh Editor
Before smoothing and skinning.
Mesh Editor
After twisting and skinning (rotation of 60 degrees).

The skeleton can be bounded to the mesh and utilize quaternions for rotations.

I am finding time to add more features to the editor. Currently, I have added selecting components with ray tracing, but I am not completely satisfied with the result. I wanted to allow users to select the components on mouse click more accurately, and I am looking into "picking," an OpenGL method of selecting components with mouse click. I also would like to add inserting edge loops, bevel, and sharp-component subdivision tools.

1 / 3
Extruding faces.
2 / 3
Moving vertices.
3 / 3
Selecting edge loop.