After recently getting an OuyaÂ device, I got inspired to make a game. Â Then I realized two things: I don’t have any skill with 3d, and I learn by doing.
Here’s a quick guide to what I’ve done so far: wannabe, a multiplatform 3d engine, for losers, by losers.
The image above is generated by the Swing version of wannabe. Â The only version so far, but I hope to port to Android soon.
Right now, this is simply a collection of little classes.
- A Position holds x, y, and z locations.
- AÂ VoxelÂ is a Position and a color.
- AÂ GridÂ is a collection of Voxels
Then there’s how to display these:
- A Camera keeps track of where we’re looking.
- A Projection converts a Position to a pixel location, given a Camera and a “pixel” size. Â There’s Flat, Isometric, and (still-in-progress) Perspective Projections.
- A UI keeps track of the Grid, the Camera, and the Projection, and actually renders the result.
Right now, you can run SwingWannabe, a java-AWT and Swing implementation that I’m using as my testbed. Â It loads a heightmapÂ and displays the resulting Grid. Â I went ahead and implemented 8 different render modes (shown here with the Isometric projection).
wannabe rendering the upper-left 50×50 pixels or so. Â Render modes: circles, rounded-squares, squares, and “3d” squares.
And there’s non-filled versions of the same shapes:
The filled 3d squares effect is quite nice, I must say, but I haven’t looked to see if Android supports that natively. Â It’d be possible to do fairly easily on other platforms, though, if need be.
Of course there’s tons more work to be done. Â Next thing on my list is a simple cube-like structure that will help me implement a perspective Projection.
As you can see from the samples, this isn’t really meant to be a photorealistic engine. It’s geared more for pixel-art and retro-style games, but allows for some nifty things.
My expectation is that the camera will always be looking down the z-axis. The position of the camera may change, but not the direction.
I don’t have a better answer here than what I’ve said. This is a way to learn some little bits about 3d graphics while working in a simple space. And potentially it can be a good platform from which to develop, perhaps, one or more small games.