This is a nice simple blog post, really enjoyed it
Despite knowing a lot of algebra it was nice to walk through a clear application in such a clean way
Perspective projection formulas are a walk in the park until you need to rotate things and compose rigid transformations, you better know how to build those quaternions and matrices ;)
You don’t need quaternions for affine transformations.
Does rotation not result in gimball lock without quaternions?
It sure does but quake1 and quake 2 happened on matrices and Euler angles so there’s a long way you can go before even thinking the letter q.
Recommended read for everyone into computer graphics: David F. Rogers, Mathematical elements for computer graphics.
I learnt this myself making visualisations in Winamp :)
This is great and I wished I found it a week ago.
I have spent the last week building a basic 3D rendering engine in C, though I restricted myself to isometric rendering which I considered the simplest form to implement. Especially since trying to talk shop with ChatGPT on the topic usually lead to very complicated design recommendations that far exceeded the amount of features I actually cared about in my proof of concept (e.g. variable camera position, adjustable field of view and more)
Now I only need to figure out how to cull unwanted triangles from my loaded .obj files
Check out cross product & dot product, basic stepping stones for 3D rendering (and culling). Then quaternions & lerp for rotations (you don’t want gimbal lock).
Good luck, it’s loads of fun (IMO)!
Writing rasterizer by hand is an incredible fun exercise. Get some basic reading on the graphics, don’t do gpt first. You will never see games as you had before.
Culling faces is simple: you have geometry in camera space. Take a dot product between a surface normal and view direction vector and if it’s negative then the normal is pointing away from you and the face is invisible.
Proper techniques with occlusion and stuff are more complicated, such as painter algorithm or z-budgeting or others
Thanks for the tip. I’ll have to try that out later when I have time.
After noticing that ChatGPT had quite a different vision than I did, I’ve mostly been brute forcing the projection math by drawing a cube on paper and seeing how the 3D coordinates are transformed to 2D space. The only useful thing it actually helped me with was figuring out which 3D file format was most compatible for parsing into my objects. It tried writing a parser for that format, which I looked at and then decided to do it myself with less lines of code ;D
Do you render with GPU or CPU? In any case, sort the vertices by distance and it should come together for you.
Just simple CPU calculations. I’m basically just mapping my points from 3D space to my 2D screen and drawing lines between them. Not sure if rendering engine is actually the correct term for what I am doing. The word engine kind of implies a larger scope than I am going for.
Of course, I had to massively complicate this for myself by setting out to use this for displaying basic wireframe graphics on embedded systems… Basically I currently need to figure out how to reduce my triangle based objects to ones that only have the silhouette lines or that only show triangles which are actually visible, except my line drawing setup does not allow for partially obscured faces as is.
It’s called projection, and culling, in that order if you want to search for help. But I would have built a ray marcher instead as that is more fun and useful if you are doing it to learn
Sounds great! I would still call it a rendering engine, I don’t think it matters how large the scope is. It looks like you’re on a good path forward, I’m sure you’ll get it soon! Don’t go too crazy on the optimizations is my only recommendation.
this thing looks so cool!




