WASD to move. Q/E to rotate dog. (If you want full quality at full performance you can use TurboWarp and drop max pen size) See https://scratch.mit.edu/projects/1126846750 for more technical notes Dog made in Blender (note: I haven't made an animal or much of anything in Blender for pretty much 10 years). Of course with the textures baked it's kinda less useful; baking a room interior would be more useful. So I guess I code lighting sometime. The main reason for baking is I thought it's an easy way to make something that looks pretty! Rotation, perspective matrices etc. from OpenGL man pages! I used Wikipedia to get a closed-form inverse of a 3x3 matrix. The rest was basically figuring stuff on pencil and paper and a bunch of trial and error. This has Z-buffering, and I added double-buffering to fix the appearance when pen size >1 (but I think double-buffering makes it feel smoother anyway; it can be disabled) Sorry that some of the code/variables are still messy. There are probably also some trivial optimizations to make. Edges of texture mapped portions are not perfect.