📄️ Introduction
It's time.... for the final project!
📄️ AniGraph
Rasterization is weird. It is a huge complicated messy system designed to do very specific things incredibly fast. It is not designed to make doing those things easy---that is why engines like Unity and Unreal are incredibly successful: they hide away a lot of that messiness during development. This assignment will be a chance to peek behind that curtain. AniGraph is a framework I created to facilitate that peek in the setting of a large intro graphics course. It will make your life easier, but not as easy as a complete game engine would. You will still face plenty of messiness. The hope is that you will come out of that experience with a better understanding of how things actually work, which tends to make people better users of high-level tools and engines in the long run.
📄️ Starter Code
- The starter code is well-commented, so looking at the actual code is the best way to learn how it works!
📄️ Interaction Modes
Interaction Modes:
📄️ Interacting with Three JS
We do not want students to ``jailbreak" AniGraph and rely entirely on threejs because that tends to lead to heavy reliance on example code and LLMs, makes grading your work very difficult, and can make extending code bases hard. That being said, we are ok with students customizing threejs features that are already in AniGraph. On this page, we will give some additional guidance on how to do that.
📄️ Transparency
As mentioned in class, rasterization is not designed to support transparency---at least, not easily. It is possible to make it work, but it takes a bit of doing. To make matters worse, ThreeJS can have some surprising limitations when it comes to handling transparent objects, so I felt adding this page of guidance to the assignment docs was appropriate.
📄️ Features
We will approximately measure features on a point system, with the number of points needed for full completion depending on the number of members in your group. Our expectation is that larger groups should do more, but integrating a larger number of features can also be more work. To this end, the number of features we will look for to award full completion credit roughly scales with the number of members in a group, but larger groups may receive credit for integrating more features if this is done well. We are also reasonably open-minded here---implementing one very complex feature super well could be enough for a team of 4 if it is done very well and the work can reasonably be divided among 4 people (e.g., if you implemented a really impressive fluit simulation), but that would be the rare exception, not the rule. We will ask you to report who did what, and if contributions are especially uneven we may assign different grades to different group members.
📄️ Noise
I mentioned simplex noise briefly in a lecture earlier in the year, but it's basically an improved version of perlin noise. AniGraph imports a library that implements simplex noise which you are welcome to use.
📄️ Timed Actions & Tweens in AniGraph
You can add timed actions---meaning actions that occur at every time update for a certain finite duration of time---using AniGraph's AController.addTimedAction function. This makes the most sense to use on your scene controller. Here is a function that, when called from the scene controller, will cause sceneController.model.meshModel to spin according to a spline:
📄️ Loading 3D Models
This page is meant as helpful guidance, but there are tons of standards for encoding and exporting models out there. We make no guarantees for third party models. We have supplied some example models that work well, though, and this page describes some of what we learned while getting those models to work.
📄️ Shaders
-"Let's throw some shade"
📄️ Submission
Due December 13th at 11:59pm
📄️ From Previous Years
Example submissions from previous years.
📄️ Standouts 2025!
Brian Song, Tianyi Zhang, Harvey Zhu, & Jacky Pan