An on-rails 3D arcade jet combat game built with Godot 4. Fly a reference-informed J-36 prototype through coastal, mountain, and city missions while fighting F-35A and Su-57 formations, missiles, drones, and an aerial-fortress boss.
| Coastal Assault | Mountain Pass | Skies Over the City |
![]() |
![]() |
![]() |
- Fast third-person rail combat with smooth chase-camera movement, banking, barrel rolls, camera shake, and afterburner FOV.
- Cannon heat, lock-on missiles, enemy projectiles, homing missiles, shield regeneration, hull damage, and missile warnings.
- F-35A and Su-57 enemy formations, progressive waves, drones, radar, scoring, combos, and an aerial-fortress boss.
- Three connected environments with animated water, atmospheric fog, a carrier deck, alpine formations, and a dusk city.
- Procedural combat audio plus explosions, contrails, speed lines, bloom, tracers, sparks, smoke, and fire effects.
| Action | Controls |
|---|---|
| Steer | Mouse, WASD, or arrow keys |
| Cannon | Left mouse button or Space |
| Locked missile | Right mouse button or E |
| Afterburner | Shift |
| Airbrake | Ctrl |
| Barrel roll / missile dodge | R |
| Pause / resume | P or Esc |
| Fullscreen | F |
Open the project in Godot 4.6 or newer and run the main scene, or launch it from a terminal:
godot --path .Run the deterministic combat-rule test with:
godot --headless --path . -- --self-testThe Web export preset writes the browser build to dist/3dfighter.html. Serve the directory over HTTP instead of opening the file directly with file://:
python3 -m http.server 8067 --directory distThen open http://localhost:8067/3dfighter.html.
Aircraft references and generated assets
The aircraft are original, reference-informed game assets rather than redistributed photography. Real photographs under assets/references/aircraft/ are used only for research and are excluded from distribution. The J-36 model follows the photographed tailless, three-engine, diamond/double-delta prototype; its public designation and configuration remain provisional.
Reference sources:
- J-36: The Aviationist — second test flight
- F-35A: Wikimedia Commons image via Wikipedia
- Su-57: Wikimedia Commons image via Wikipedia
| Asset | In-game scale | Geometry | Path |
|---|---|---|---|
| J-36 player aircraft | 23 m provisional length | 28,172 triangles | assets/generated/aircraft/j36.glb |
| F-35A enemy aircraft | 15.7 m length | 29,052 triangles | assets/generated/aircraft/f35a.glb |
| Su-57 enemy aircraft | 20.1 m length | 28,468 triangles | assets/generated/aircraft/su57.glb |
All three GLBs passed glTF validation and import successfully in Godot. Each uses an opaque PBR material with 2048×2048 base-color, normal, and metallic/roughness textures. Static model previews are stored in artifacts/model_previews/.
Real-world scenic photographs similarly guide environment shape, lighting, density, and atmosphere but are not bundled as runtime textures. Sources and art notes are documented in docs/environment-references.md.
Asset generation setup
Copy .env.example to .env, then set IMAGE_API_KEY and TRIPO3D_API_KEY. The local .env, Vercel metadata, signing material, caches, and research-only photos are ignored by Git and must not be committed.
The initial three-aircraft Tripo3D batch used $0.90 in credits, plus image-provider billing for the three reference renders.


