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();