| Object | Dimensions | 
|---|---|
| 1 foot | 16 units | 
| Maximum Climbable Step | 24 units or 45.573* degree slope | 
| Small Vent | 64×64 | 
| Small Hallway | 192 wide | 
| Large Hallway | 384 wide | 
| Very Large Hallway | 896 wide | 
| Standard heavy door | 32×128×160 | 
| Vault door | 16×160×160 | 
*The exact maximum slope angle is arccos(0.7).
| Creatures | Dimensions | 
|---|---|
| Marine | 32×32×72* | 
| Colonist | 26×26×72 | 
| Drone (all variants) | 40×40×69 | 
| Ranger | 40×40×69 | 
| Buzzer | 20×20×20* | 
| Boomer | 60×60×110 | 
| Parasite | 24×24×12 | 
| Shieldbug | 80×80×72 | 
| Mortarbug | 46×46×69 | 
| Harvester | 46×46×69 | 
| Xenomite | 24×24×12 | 
| Grub | 24×24×12 | 
| Mender | 32×32×64 | 
| Queen | 240×240×160 | 
| Antlion (both) | 32×32×64 | 
| Antlion Guard (both) | 60×60×110 | 
| Headcrab (all variants) | 24×24×12 | 
| Headcrab Zombie (all variants) | 26×26×72 | 
| Combine Soldier (all variants) | 26×26×72 | 
| Combine Hunter | 44x44x100 | 
| Combine Strider, Dropship, Gunship | 76x76x76* | 
| Combine Scanner, Claw Scanner | 20x20x20* | 
*Marine hulls are biased 2 units south (regardless of camera orientation).
*Flying creature hulls are vertically centered. All other hulls start at the origin and go up. Striders are considered to be flying creatures.
With asw_controls 1, the camera has a fixed angle when moving the mouse. Unless explicitly disabled in asw_gamerules, players can rotate the camera's yaw axis in 90 degree increments. For other values of asw_controls, the player has full control of the camera angle.
The player can also change the center point of their view on the X and Y axes by moving their mouse. The default values for maximum camera shifting offsets are 300 left/right, 200 forward, and 380 back.
<script> const inputs = {}; ["calculator", "result1", "result2", "pitch", "dist", "fov", "aspect_w", "aspect_h", "test_z"].forEach(name => { const el = document.getElementById(name); inputs[name] = el; if (el.nodeName === "INPUT") { el.addEventListener("input", recalculate, false); } }); function recalculate() { if (!inputs.calculator.reportValidity()) { return; } const pitch = Math.PI - inputs.pitch.valueAsNumber * Math.PI / 180; const camOffsetY = -inputs.dist.valueAsNumber * Math.cos(pitch); // camera -> feet const camOffsetZ = -inputs.dist.valueAsNumber * Math.sin(pitch); // camera -> feet const aspect = inputs.aspect_w.valueAsNumber / inputs.aspect_h.valueAsNumber; const halfFOVY = inputs.fov.valueAsNumber * Math.PI / 360; const halfFOVX = Math.atan(aspect * Math.tan(halfFOVY)); const angleTop = pitch + halfFOVY; // +z sin, +y cos const angleBottom = pitch - halfFOVY; // +z sin, +y cos const testZ = inputs.test_z.valueAsNumber + camOffsetZ; // camera -> floor const floorTopY = testZ / Math.tan(angleTop) - camOffsetY; const floorBottomY = testZ / Math.tan(angleBottom) - camOffsetY; const floorTopX = -testZ * Math.sin(halfFOVX) / Math.sin(angleTop); const floorBottomX = -testZ * Math.sin(halfFOVX) / Math.sin(angleBottom); if (floorTopY <= floorBottomY) { inputs.result1.textContent = "The player cannot see a floor that is " + inputs.test_z.valueAsNumber.toFixed(1) + " units above their feet."; inputs.result2.textContent = ""; } else { inputs.result1.textContent = "The player can see a floor that is " + inputs.test_z.valueAsNumber.toFixed(1) + " units above their feet from " + floorTopY.toFixed(1) + " units in front of them to " + (-floorBottomY).toFixed(1) + " units behind them."; inputs.result2.textContent = "At the far end, the player can see " + floorTopX.toFixed(1) + " units to the left and right on the floor, and at the near end, the player can see " + floorBottomX.toFixed(1) + " units to the left and right on the floor."; } } recalculate();