Halo 1 uses a custom in-house physics engine which simulates the movement of dynamic objects like units, items, projectiles, and point_physics dynamics systems like particle_system and weather_particle_system. Unlike Halo 2 and later titles, Halo 1 does not use any middleware like Havok.

Different object interactions are simulated in different ways. For example, vehicles use physics to drive themselves, collide with scenery and the BSP, and collide with other vehicles, but their model_collision_geometry is used in collisions with projectiles, bipeds, and particles. The scenario_structure_bsp collision BSP is tested differently for vehicles and projectiles than it is for players, making phantom BSP more apparent.

Limits

Vehicles cannot move to the space below approximately -4,950 world units in the Z (vertical) axis. Vehicles spawned at this extreme distance will sit on an invisible floor and return to the floor if moved below. This is not far from the -5,000 world unit limit for the game camera. Vehicles can freely move beyond 5,000 units in a horizontal axis.

Related HaloScript

The following are related functions that you can use in your scenario scripts and/or debug globals that you can enter into the developer console for troubleshooting.

Function/global

Type

(collision_debug [boolean])

If enabled, a ray is continually shot from the camera (by default) to troubleshoot ray-object and ray-BSP collisions. A red normal-aligned marker will be shown where the ray collides with a surface. The collision surface itself, whether BSP or model, will be outline in red. Information about the collision surface will be shown in the top left corner of the screen, including plane and surface indices from the BSP structure, material type, and how many degrees the surface's normal differs from vertical.

The types of surfaces which the test ray hits or ignores can be toggled with the collision_debug_flag_* commands. The maximum range of the ray is controlled with collision_debug_length.

This feature can be frozen in place with collision_debug_repeat and also moved directly with the collision_debug_point_* and collision_debug_vector_* globals. A red ray is visible in these situations when the ray is no longer shot from the camera's point of view.

Global
(collision_debug_features [boolean])

Toggles the display of collision features near the camera, which can be spheres (red), cylinders (blue), or prisms (green). Collision size can be adjusted with collision_debug_width and collision_debug_height. The test point can be frozen in place using collision_debug_repeat.

Global
(collision_debug_flag_back_facing_surfaces [boolean])

When collision_debug or collision_debug_spray are enabled, causes the test rays to collide with back-facing surfaces (those facing away from the camera). Defaults to false.

Global
(collision_debug_flag_front_facing_surfaces [boolean])

When collision_debug or collision_debug_spray are enabled, causes the test rays to collide with front-facing surfaces (those facing towards the camera). Defaults to true. Disabling this will have no effect unless collision_debug_flag_back_facing_surfaces is also enabled.

Global
(collision_debug_flag_ignore_breakable_surfaces [boolean])

Toggles if collision debug rays ignore breakable surfaces. Defaults to false.

Global
(collision_debug_flag_ignore_invisible_surfaces [boolean])

Toggles if collision debug rays ignore invisible surfaces (e.g. collision-only player clipping). Defaults to true.

Global
(collision_debug_flag_ignore_two_sided_surfaces [boolean])

Toggles if collision debug rays ignore two-sided surfaces. Defaults to false.

Global
(collision_debug_flag_media [boolean])

Toggles if collision debug rays collide with water surfaces.

Global
(collision_debug_flag_objects [boolean])

Toggles if collision debug rays collide with any class of object's collision geometry. This setting will be ignored if any more specific object flag is enabled, such as collision_debug_flag_objects_equipment.

Global
(collision_debug_flag_objects_bipeds [boolean])

Toggles if collision debug rays collide with bipeds.

Global
(collision_debug_flag_objects_controls [boolean])

Toggles if collision debug rays collide with device_control.

Global
(collision_debug_flag_objects_equipment [boolean])

Toggles if collision debug rays collide with equipment.

Global
(collision_debug_flag_objects_light_fixtures [boolean])

Toggles if collision debug rays collide with device_light_fixture.

Global
(collision_debug_flag_objects_machines [boolean])

Toggles if collision debug rays collide with device_machine.

Global
(collision_debug_flag_objects_placeholders [boolean])

Toggles if collision debug rays collide with placeholders. This would require a custom placeholder to have an effect, since the placeholder tags that come with the HEK have no collision model.

Global
(collision_debug_flag_objects_projectiles [boolean])

Toggles if collision debug rays collide with projectiles. Note that most projectiles do not have a collision model.

Global
(collision_debug_flag_objects_scenery [boolean])

Toggles if collision debug rays collide with scenery.

Global
(collision_debug_flag_objects_vehicles [boolean])

Toggles if collision debug rays collide with vehicles.

Global
(collision_debug_flag_objects_weapons [boolean])

Toggles if collision debug rays collide with weapons.

Global
(collision_debug_flag_skip_passthrough_bipeds [boolean])

Unknown purpose. Does not seem to affect collision ray tests against bipeds.

Global
(collision_debug_flag_structure [boolean])

Toggles if collision debug rays collide with the structure BSP. Collisions with model_collision_geometry BSPs are unaffected.

Global
(collision_debug_flag_try_to_keep_location_valid [boolean])

Unknown purpose.

Global
(collision_debug_flag_use_vehicle_physics [boolean])

If enabled, collision debug rays will collide with vehicle physics spheres rather than their model_collision_geometry.

Global
(collision_debug_height <real>)

When and collision_debug_features is enabled, controls the height in world units of collision features. Defaults to 0.0.

Global
(collision_debug_length [real])

Sets the maximum test ray length for collision_debug and collision_debug_spray in world units. When the ray reaches this maxmimum, a floating green marker will be shown for collision_debug while spray rays will simply not be shown. Defaults to 100.0.

Global
(collision_debug_phantom_bsp [boolean])

Causes a floating pink cube and label "phantom bsp" to appear whenever a test ray from the center of the screen intersects with phantom BSP. It can be helpful to pair this with collision_debug_spray.

Global
(collision_debug_point_x [real])

Represents the current origin of the collision_debug test ray. While collision_debug is active, this value will be continually updated with the camera's location unless collision_debug_repeat is also enabled. In repeat mode, you are able to set this global to move the ray origin to any point you need. See also collision_debug_vector_i.

Global
(collision_debug_point_y [real])

See collision_debug_point_x.

Global
(collision_debug_point_z [real])

See collision_debug_point_x.

Global
(collision_debug_repeat [boolean])

Setting this to true will freeze the test rays and points for collision_debug, collision_debug_phantom_bsp, collision_debug_spray, and collision_debug_features, allowing you to move and view the debug information from another angle or manually set the origin and direction with the collision_debug_point_* and collision_debug_vector_* globals.

Global
(collision_debug_spray [boolean])

Setting this to true will cause collision ray tests to be performed in a dense grid from the viewport. This operates independently of the collision_debug setting, and only the destination hit markers are shown. Can be affected by collision flags, length, and frozen with collision_debug_repeat.

Global
(collision_debug_vector_i [real])

Represents the current direction of the collision_debug test ray as ijk vector components. While collision_debug is active, this value will be continually updated with the camera's direction unless collision_debug_repeat is also enabled. In repeat mode, you are able to set this global to orient the ray as needed.

Global
(collision_debug_vector_j [real])

See collision_debug_vector_i.

Global
(collision_debug_vector_k [real])

See collision_debug_vector_i.

Global
(collision_debug_width [real])

When collision_debug and collision_debug_features are enabled, controls the width in world units of collision features. Defaults to 0.0.

Global
(<void> physics_constants_reset)

Resets all physics constants to earthly values.

Function
(<real> physics_get_gravity)

Get the current global gravity acceleration relative to Halo standard gravity.

Function
(<void> physics_set_gravity <real>)

Set global gravity acceleration relative to Halo standard gravity. The change in gravity is NOT network synchronized.

Function
(<void> vehicle_hover <vehicle> <boolean>)
(vehicle_hover "vehicles\warthog\warthog" true)
(vehicle_hover "vehicles\warthog\warthog" false)

Stops the vehicle from running real physics and runs fake hovering physics instead

Function