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.
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.
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.