Skip to content
This repository has been archived by the owner on Apr 5, 2023. It is now read-only.
/ 3d-simple Public archive

Very simple 3d engine in Python via Jupyter Lab

Notifications You must be signed in to change notification settings

alinanorakari/3d-simple

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

3d-simple

Very simple 3d engine in Python via Jupyter Lab

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

About

Very simple 3d engine in Python via Jupyter Lab

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published