this post was submitted on 22 Sep 2026
151 points (100.0% liked)

Programming

28593 readers
673 users here now

Welcome to the main community in programming.dev! Feel free to post anything relating to programming here!

Cross posting is strongly encouraged in the instance. If you feel your post or another person's post makes sense in another community cross post into it.

Hope you enjoy the instance!

Rules

Rules

  • Follow the programming.dev instance rules
  • Keep content related to programming in some way
  • If you're posting long videos try to add in some form of tldr for those who don't want to watch videos

Wormhole

Follow the wormhole through a path of communities !webdev@programming.dev



founded 3 years ago
MODERATORS
top 16 comments
sorted by: hot top controversial new old
[–] panda_abyss@lemmy.ca 14 points 6 days ago

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

[–] Ad4mWayn3@sh.itjust.works 7 points 6 days ago (1 children)

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

[–] Unpigged@lemmy.dbzer0.com 2 points 5 days ago (1 children)

You don't need quaternions for affine transformations.

[–] offspec@lemmy.world 4 points 5 days ago (1 children)

Does rotation not result in gimball lock without quaternions?

[–] Unpigged@lemmy.dbzer0.com 2 points 4 days ago

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.

[–] Unpigged@lemmy.dbzer0.com 7 points 6 days ago

Recommended read for everyone into computer graphics: David F. Rogers, Mathematical elements for computer graphics.

[–] Scrath@lemmy.dbzer0.com 4 points 6 days ago* (last edited 6 days ago) (3 children)

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

[–] Valmond@lemmy.dbzer0.com 5 points 6 days ago

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)!

[–] Unpigged@lemmy.dbzer0.com 1 points 5 days ago* (last edited 5 days ago) (1 children)

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

[–] Scrath@lemmy.dbzer0.com 1 points 5 days ago

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

[–] AngryPancake@sh.itjust.works 1 points 6 days ago (1 children)

Do you render with GPU or CPU? In any case, sort the vertices by distance and it should come together for you.

[–] Scrath@lemmy.dbzer0.com 2 points 6 days ago (2 children)

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.

[–] KeenFlame@feddit.nu 1 points 4 days ago

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

[–] AngryPancake@sh.itjust.works 1 points 6 days ago

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.

[–] FishFace@piefed.social 3 points 6 days ago

I learnt this myself making visualisations in Winamp :)

[–] super_user_do@feddit.it 1 points 5 days ago

this thing looks so cool!