game elements
>> three
>> two
>> one
*

Stars

The background is simply a large sphere with a texture pasted onto the inside. Rather than make the sphere large enough to fit around the solar system, Z-buffering was disabled and the drawing order was fixed for the sphere so that it would always be rendered first, giving the impression of a much larger scale. To maintain the illusion, the sphere is repositioned around the camera once every game update.

Planets

We set up a simple table with data on each planet and wrote a script to load all of the relevant textures and perform the necessary scaling and positioning. Most of the planets are implemented using Blitz3D sphere primitives, some with a secondary "sky" sphere on which we pasted a different texture at a slightly larger radius. We also experimented with building our own planet meshes in Maya; both Mars and Venus were implemented in this way. Building our own meshes allowed us to deform the surface, creating mountains and valleys, but it also played havoc with the lighting.

Sounds

The sounds used in the game are all original, and were produced in a common score, but saved independently. They are all being played as loops, but depending on the user's action, their volumes are adjusted to emphasize that particular space. A bell is used to highlight the silence of enclosed space. Regular, internal, pulsating sounds are used to help make the user aware of him/herself. Slight counterparts, like an echo, help impel the user forward. A randomized deep tone helps maintain alertness. Expansive tones help project attention to distant objects in space. An electronic sound associates with flying through space.

Archery

Each of the nine primary planets has an associated sprite to represent it. We reposition these target sprites continuously by positioning them at the position of the arrow and then moving them a set distance towards the planets they represent. This has the effect of placing them in the sky along the line of sight to the planets they represent. When the user fires an arrow, a starting pivot is placed at the location of the bow so that if the player moves the arrow's flight path will not be affected. The arrow moves forwards at a rate calculated to take it to that predetermined set distance in a set number of seconds. A percentage calculation normalizes the arrow's progress from bow to target point into a number between -1 and 1, which can be applied to cause the arrow to follow a parabolic arc between the start and end point rather than just a straight line.

Planetary Rings

We used the same method employed by Celestia and other solar system simulations: a long strip one pixel wide was textured onto a dynamically generated mesh with vertices arranged in wedges between the inner and outer radius. Each polygon was drawn both clockwise and counter-clockwise to ensure full rendering from any perspective (except looking at it directly on edge).

Helixes

When the player is in the AT_SPACE state, the planets generate helixes by dropping a sprite at a rate proportional to the square of their distance from the sun. The sprites are managed as a particle system with a set lifetime and a transparency is applied based on how much longer they have; as soon as they fade completely, they are automatically deleted. The lifetimes are also proportional to the distance from the sun, so the farther planets generate more persistent helixes. The helixes are generated only for the planets and moons that the player has actually visited. A slightly different system is used for moons: instead of sprites, they are plotted as small circles of pixels projected from the 3D coordinates onto the 2D plane of the screen.

Links

The connections between planets are rendered as Blitz3D cylinder primitives, stretched along the Z axis and positioned in between the planets. Because the two endpoints of the links are constantly moving, the distance between them is variable and therefore the cylinder must be re-scaled at every update. In order to make the cylinder more visible in the final helix mode, its radius is doubled.

Character Animation

The character was rendered in Maya, but we were unable to import the bones and skeletal structure of the model into the game. As a workaround, we attempted to write our own frame-by-frame animation routine, but we were unable to export the frames from Maya in a way that Blitz3D could handle. We eventually gave up and used Milkshape to put together the animation sequence and package it as a B3D file. This involved painstakingly grouping all of the polygons of the model to reconstruct all of the skeleton pivots. Some of the polygons got their normal inverted in the way, but this is not noticeable. Muybridge's photographs helped figure out the galloping sequence, and pictures from several horse related pages helped us figure out the walking sequence. The texture of the character is nothing less than the milky way itself. Breathing and bow waving in the back of the archer as he runs, helped give a lively feeling to the animation. With that accomplished, we wrote a primitive animation handler to extract the proper sequences of animation using hard-coded frame numbers and to play them back in the appropriate order according to the player's input.

Bow & Arrow

These were also constructed in Maya. We fit them to a constant size and then positioned them next to the player, keeping them hidden until required. The drawing back of the arrow was implemented as a proportional movement based on the length of time the user holds down the firing button; the bow simultaneously scales along the Z axis to give the impression of stretching.

Alpha-Mapped Textures

These include the arrow glow, the clouds on several of the planets, the golden halo around the sun, and spiral textures for the transition between planets, selection and cursor sprites, and fog effects. These textures were made in Photoshop as one-color images with transparency in the alpha channel that produced very clean effects without duplicated edges and other artifacts.

Lens Flares

These are sprites positioned along a line projected from the center of the screen to the sun in 2D screen coordinates and spaced along that line at varying degrees of transparency and brightness. All of the code for this was adopted from an open source lens flares package by one of the users of the Blitz3D development forums, and but some minor positioning adjustments were required for stereo aspect and by the scale of the game.

Story & Help Screens

These are sprites positioned close to the camera and forced to the back of the rendering queue so that they are always drawn on top of everything else. They have an alpha component as well, blending slightly with their background. The spherical look of the text is a distortion in the image itself: they are actually completely flat.

Trade-offs

Much time was spent on debugging and tweaking the implementation of the game's finite state machines, which diverted attention from other tasks such as adding new features or further refining them through play-testing. Examples of ideas we thought would add to the experience but weren't able to implement include dust and fog effects on the planets; pitch distortion based on atmospheric density; allowing the user to jump and experience gravity on each planet; collecting objects such as solar panels and microchips from probes and landers in the solar system; links between planets falling with the helixes in the ending sequence; and user interface elements such as an hourglass for time and sliders for scale and speed; replacing the target sprites with small camera viewports showing the planets shadows in real time; animated sun flares, mapped onto spheres, with a texture ripple to make the sun appear more active; and third-person archery.