Need Help or Found an Issue?
Overview
Steel Target Simulator is an interactive steel range with full ballistics and steel target physics. Shoot at reactive steel racks from 100 to 1760 yards (1 mile) with 4DOF trajectory simulation, wind presets, spin effects, and realistic target responses. Features dual scopes (rifle + spotting), MRAD/MOA dial adjustments, optional heat mirage effects, wind flags, dust/metal effects, and a HUD.
Quick Start
1. Click Start to begin
2. Click inside either scope (rifle scope bottom-right, spotting scope bottom-left) to enter aiming mode
3. Move mouse to aim, click to fire (rifle scope only)
4. Use Tab to switch between rifle and spotting scopes
5. Use arrow keys to adjust elevation/windage dials
6. Press Esc to exit scope mode
Controls
Desktop - Scope Controls:
- Click inside either scope (rifle scope bottom-right, spotting scope bottom-left) to enter scope mode
- The active scope shows a dull red border to indicate which one you're controlling
- Tab Switch between rifle and spotting scopes (only when in scope mode)
- Move mouse to pan/aim the active scope
- Mouse Wheel or +/- Zoom in/out the active scope (4× to 40× magnification)
- Click to fire (rifle scope only - spotting scope is for observation only)
- Esc to exit scope mode (releases pointer lock)
- FFP reticle scales with zoom (maintains angular subtensions)
Desktop - Dial Controls:
- ArrowUp/ArrowDown dial elevation (0.1 MRAD or 0.25 MOA; hold Shift for 1.0)
- ArrowLeft/ArrowRight dial windage (0.1 MRAD or 0.25 MOA; hold Shift for 1.0)
- R reset both dials to zero (only when in rifle scope mode)
- On-screen dial buttons (U/D/L/R/⟲) next to HUD work anytime
Desktop - Focus/Range Finder:
- F or Right-click refocus the active scope at center crosshair distance
- Sets the focal distance for mirage and depth-of-field blur effects (when optical effects enabled)
- Focal distance is displayed in the bottom-right corner of each scope as a red digital readout (yards) when Smart Scope is enabled
- The active scope is indicated by the dull red border
Mobile/Touch:
- Single-finger drag: Pan the scope view
- Pinch: Zoom in/out (4× to 40× magnification)
- Tap: Fire a shot (rifle scope, quick tap < 150ms)
- Long press (≈ 450ms): Refocus at press point (requires Mirage enabled)
- Dial buttons (U/D/L/R/⟲): Tap or hold for fast-dial
Fullscreen:
- Use the Fullscreen button for immersive play
- Canvas automatically adapts to your screen's aspect ratio
- Note: May not work on iOS Safari. Desktop and Android work best.
Gameplay
Target Racks:
Multiple target racks positioned from 100 to 1760 yards (1 mile) with various target sizes and configurations. Targets include both rectangular and oval shapes with sizes ranging from ~2" chips up to large ~6‑ft gongs, roughly spanning 0.5–2+ MOA depending on distance and rack configuration.
Target Physics:
- Each target hangs from two chains (damped springs: 10,000 N/m, 200 N·s/m damping)
- Bullet impacts transfer momentum to targets
- Center hits cause mostly linear motion; edge hits create rotation
- Smaller targets respond more dramatically than larger ones
Hunting Mode:
- Enable via the "Hunting" checkbox in settings
- Must restart game for changes to take effect
Prairie Dogs:
- Scattered from 100 to 1000 yards, approximately 16 inches tall
- Randomly pop up and down (roughly 30% up, 70% down)
- Each state lasts 5-90s seconds before changing
- When hit: quick upward jump + red mist effect, respawn after ~1 minute
Boars:
- Spawn randomly between 150-1200 yards
- Walk randomly across the range, avoiding obstacles
- When hit: fade out animation and respawn at new random locations
Settings
Ballistic Parameters:
- MV: Muzzle velocity (fps) - critical for trajectory
- BC: Ballistic coefficient - higher = less drift/drop
- Drag Function: G7 (modern boat-tail) or G1 (flat-base/older)
- Diameter/Weight/Length: For spin calculations
- Twist: Barrel twist rate (inches per turn)
- MV σ: Muzzle velocity standard deviation (fps)
- Accuracy: Rifle+shooter precision in MOA
- Zero Distance: Distance at which rifle is zeroed (yards)
- Scope Height: Height of scope above bore (inches)
- Wind Preset: Controls wind patterns affecting trajectory
Scope Type (MRAD/MOA):
- Select in the settings bar to change reticle tick spacing and dial units
- MRAD mode: 0.5 MRAD minor ticks, 1.0 MRAD major ticks, 0.1 MRAD clicks
- MOA mode: 2.0 MOA minor ticks, 4.0 MOA major ticks, 0.25 MOA clicks
- HUD displays dial values in the selected units
Mirage/Optical Effects:
- Toggle via the checkbox in the settings bar
- Simulates realistic heat mirage/shimmer visible through the scope
- Mirage moves with the wind—watch it to read wind direction and speed
- Higher magnification = stronger mirage (just like a real scope)
- Farther distances = stronger mirage (more air to look through)
- Very strong wind reduces mirage visibility (turbulence breaks up pattern)
- Also includes depth-of-field blur based on focus distance
- Focus distance is set using F or Right-click (displayed when Range Finder is enabled)
- Increases GPU load; turn off on low-power devices
Range Finder:
- Toggle via the checkbox in the settings bar (enabled by default)
- Displays red digital readout in bottom-right of both scopes showing focal distance in yards
- Updates when you focus using F or Right-click
- Helps judge distance to targets and understand mirage/depth-of-field effects
- Disable to reduce visual clutter if desired
BDC (Bullet Drop Compensator):
- Toggle via the checkbox in the settings bar (enabled by default)
- Shows red circle on vertical crosshair indicating predicted bullet impact point
- Only visible in rifle scope (not spotting scope)
- Uses ballistics table to calculate drop at current focal distance
- Like a real scope with a dope card, the BDC is an estimate; small errors are expected
- Disable for a more traditional shooting experience
Hunting:
- Toggle via the checkbox in the settings bar
- Enables/disables boars and prairie dogs
- Must restart game for changes to take effect
- Increases GPU load; turn off on low-power devices
HUD (Top-Left):
- Elevation: Current dial setting (U = up, D = down)
- Windage: Current dial setting (R = right, L = left)
- Impact Status: "IMPACT" (green) or "MISS" (red)
- Units displayed match selected Scope Type
Tips for Success
- Start with the 100-yard rack to confirm your zero
- Use wind flags at multiple distances to read wind gradients
- Watch target movement after impacts to understand hit location
- Make small dial adjustments for precise corrections
- Use Shift+Arrow for larger adjustments (1.0 MRAD/MOA)
- Higher BC bullets drift less in the wind
- Lower MV σ = more consistent impacts
- Practice at shorter distances before attempting 1760 yards (1 mile)
Technical Details
Physics Engine:
- Custom rigid body physics in C++ (WebAssembly) with quaternion-based orientation
- Targets use momentum transfer with linear and angular damping
Rendering:
- 3-pass composition: background scene → scope with zoom → reticle overlay
- Three.js WebGL with 4× MSAA anti-aliasing
- Vertex positions computed in C++ and transferred via typed memory views
Impact Detection:
- Spatial binning system (10m bins) for efficient collision detection
- Raycasting from trajectory segments detects target intersections
Mirage Model:
- 3D simplex noise sampled on a sphere around the shooter in angular coordinates
- Noise advected horizontally by crosswind at focal distance, with upward drift for rising heat
- Multi-octave noise (fast + slow) creates fine shimmer and larger wave structures
- Causes both image distortion (UV displacement) and brightness shading
- Attenuation factors: distance to focal plane, magnification, focal distance, wind speed
- Wind sampled at 80%, 90%, and 100% of focal distance and averaged
Depth-of-Field Model:
- Thin-lens circle of confusion (CoC): CoC = |(F²/(N·(df-F)))·((d-df)/d)|
- Lens: 56mm objective, focal length and f-number derived from FOV/zoom
- Separable Gaussian blur (horizontal + vertical passes) for O(2n) performance
- Depth texture from scene render, decoded using THREE.js perspective depth
- Default focus: 100 yards; blur scales with zoom level
- Resolution-independent calculations for consistent appearance