Implementing "Reverse Perspective" via Stereographic Projection
If you've watched CodeParade’s devlogs for Hyperbolica, you’ve seen the "Farm Level" where distant trees grow massive and eventually flip upside down. This isn't a post-processing trick; it is a fundamental re-imagining of 3D space using Spherical Non-Euclidean Geometry. To replicate this in a modern engine, you must bypass the standard MVP (Model-View-Projection) matrix and move your math into the vertex shader.
1. The Concept: Living Inside a 3-Sphere
In standard games, we use Euclidean space ($\mathbb{R}^3$). In the Farm level, the world exists on the surface of a 4D hypersphere (a 3-Sphere).
- Euclidean: Distance increases, objects shrink toward a vanishing point.
- Spherical: Distance increases toward the "equator" (objects shrink), but as you pass it and approach the "antipode" (the opposite side of the world), objects begin to magnify. This is the "Reverse Perspective."
2. Step 1: Vertex Transformation to 4D Space
First, you must treat your 3D coordinates $(x, y, z)$ as angular offsets on a 4D sphere. You define a radius $W$ for your world-sphere. The vertex position is "wrapped" onto the hypersphere using sine and cosine functions:
$$P_{4D} = \begin{bmatrix} R \cdot \sin(d/R) \cdot (x/d) \\ R \cdot \sin(d/R) \cdot (y/d) \\ R \cdot \sin(d/R) \cdot (z/d) \\ R \cdot \cos(d/R) \end{bmatrix}$$
Where $d$ is the Euclidean distance from the origin and $R$ is the radius of your spherical universe.
3. Step 2: Stereographic Projection
Once your vertices are in 4D space, you need to project them back down to 3D so the GPU can render them. Standard linear projection causes massive distortion (linear interpolation artifacts). Instead, we use Stereographic Projection. This maps the 4D points onto a 3D "flat" space through the "North Pole" of the hypersphere.
The formula to project a 4D point $(x, y, z, w)$ to a 3D point $(x', y', z')$ is:
$$x' = \frac{x}{1 - w}, \quad y' = \frac{y}{1 - w}, \quad z' = \frac{z}{1 - w}$$
As $w$ approaches 1 (the antipode), the denominator approaches zero, causing the $x', y', z'$ values to explode toward infinity—this creates the "infinite growth" effect seen in the Farm level.
4. Technical Challenges: The "Upside Down" Problem
When an object passes the antipode, it technically "wraps around" the 4D sphere. In your shader, you must handle the W-clipping. If you don't, the math will flip the object's triangles inside out, causing a messy graphical "pop."
Fixing Depth Buffer Issues
Because distant objects grow larger, they can easily z-fight with closer objects. Most developers implementing this (including CodeParade) use a Logarithmic Depth Buffer or a custom depth-sorting pass to ensure that "magnified" distant objects stay behind local objects.
5. Implementation Summary
| Component | Standard Game | "Reverse" Spherical Game |
|---|---|---|
| Space Model | Euclidean ($\mathbb{R}^3$) | Spherical ($\mathbb{S}^3$) |
| Projection | Perspective Matrix | Stereographic Shader |
| Infinite Distance | Vanishing Point (0 size) | Antipode (Infinite size) |
Conclusion
To achieve the Hyperbolica effect, stop thinking of "distance" as a straight line. Treat your world as a set of rotations on a 4D sphere and use the Stereographic Projection formula in your vertex shader. It’s a heavy lift for your math brain, but the visual payoff is a world that feels truly alien.
