# 3d-simple Very simple 3d engine in Python via Jupyter Lab See resulting animations in the [lastfuture.de playground](https://playground.lastfuture.de/lf2/) ## Scope I've made this project for finding out if I could create a simple 3d engine from basically scratch purely based on what I know about 3d graphics and what my intuition tells me. Turns out: Yes, apparently I can. ⚠️ This 3d engine is neither complete nor optimized or production ready. Feel free to play around with it and have some fun. ## What it does This 3d engine - renders objects consisting of arbitrary n-gons with flat colors and an outlines - honors colors with alpha - supports perspective - tries to sort drawing order by z-depth of the faces - supports arbitrary rotation via euler angles - applies fuzzy dithering as an effect to simulate image noise - applies line shifting as an effect to simulate VCR tracking artefacts - supports very simple math based animations - renders any nummber of frames into a gif ## What it does not This 3d engine does not - load 3d model files - shade faces based on light sources or normal direction (because it knows nothing about normals) - render textures - have optimized image effects for faster than realtime rendering of frames - work well with extreme perspective values or coordinates in the far back - have easily changeable parameters for a lot of things ## What I would change This project met my needs and I got some nice animations out of it that I will use as logo animations for my next personal website. If I were to continue this project I would - create a more robust data format, probably split into a list of vertices and a list of faces referencing vertices - implement a more robust way to determine z-depth of a face - implement vertex colors (optional) - implement proper scaling or vertices based on depth so that they can't overshoot an arbitrary point but will shrink indefinitely the farther they are - implement a proper camera system - implement normal vectors for the faces to facilitate light based shading, fresnel shading and LUT based shading - implement rotation via quaternions - add keyframe based animation - put all the parts that should be variable into a nice config object - honestly … reimplement it in a more exeecution speed conscious programming laguage than Python (e.g. Rust) - think hard about why anyone would want to have a generalized simple 3d rendering engine that renders purely CPU based in a world where every computer supports opengl in some way