Add maxStepHeight option to RapierCollisionWorld and update autostep settings
This commit is contained in:
@@ -20,6 +20,7 @@ import type { RuntimeBrushTriMeshCollider, RuntimeSceneCollider } from "./runtim
|
|||||||
|
|
||||||
const CHARACTER_CONTROLLER_OFFSET = 0.01;
|
const CHARACTER_CONTROLLER_OFFSET = 0.01;
|
||||||
const CHARACTER_CONTROLLER_SNAP_TO_GROUND_DISTANCE = 0.2;
|
const CHARACTER_CONTROLLER_SNAP_TO_GROUND_DISTANCE = 0.2;
|
||||||
|
const AUTOSTEP_MIN_WIDTH_FACTOR = 0.4285714286;
|
||||||
const COLLISION_EPSILON = 1e-5;
|
const COLLISION_EPSILON = 1e-5;
|
||||||
const CAMERA_COLLISION_EPSILON = 1e-3;
|
const CAMERA_COLLISION_EPSILON = 1e-3;
|
||||||
const MAX_WALKABLE_SLOPE_RADIANS = Math.PI * 0.25;
|
const MAX_WALKABLE_SLOPE_RADIANS = Math.PI * 0.25;
|
||||||
@@ -326,7 +327,13 @@ export async function initializeRapierCollisionWorld(): Promise<typeof RAPIER> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export class RapierCollisionWorld {
|
export class RapierCollisionWorld {
|
||||||
static async create(colliders: RuntimeSceneCollider[], playerShape: FirstPersonPlayerShape): Promise<RapierCollisionWorld> {
|
static async create(
|
||||||
|
colliders: RuntimeSceneCollider[],
|
||||||
|
playerShape: FirstPersonPlayerShape,
|
||||||
|
options: {
|
||||||
|
maxStepHeight?: number;
|
||||||
|
} = {}
|
||||||
|
): Promise<RapierCollisionWorld> {
|
||||||
const rapier = await initializeRapierCollisionWorld();
|
const rapier = await initializeRapierCollisionWorld();
|
||||||
const world = new rapier.World({
|
const world = new rapier.World({
|
||||||
x: 0,
|
x: 0,
|
||||||
@@ -345,14 +352,23 @@ export class RapierCollisionWorld {
|
|||||||
|
|
||||||
const playerCollider = createPlayerCollider(world, rapier, playerShape);
|
const playerCollider = createPlayerCollider(world, rapier, playerShape);
|
||||||
const characterController = playerCollider === null ? null : world.createCharacterController(CHARACTER_CONTROLLER_OFFSET);
|
const characterController = playerCollider === null ? null : world.createCharacterController(CHARACTER_CONTROLLER_OFFSET);
|
||||||
|
const maxStepHeight = Math.max(0, options.maxStepHeight ?? 0.35);
|
||||||
|
|
||||||
if (characterController !== null) {
|
if (characterController !== null) {
|
||||||
characterController.setUp({ x: 0, y: 1, z: 0 });
|
characterController.setUp({ x: 0, y: 1, z: 0 });
|
||||||
characterController.setSlideEnabled(true);
|
characterController.setSlideEnabled(true);
|
||||||
characterController.enableSnapToGround(
|
characterController.enableSnapToGround(
|
||||||
CHARACTER_CONTROLLER_SNAP_TO_GROUND_DISTANCE
|
Math.max(CHARACTER_CONTROLLER_SNAP_TO_GROUND_DISTANCE, maxStepHeight)
|
||||||
);
|
);
|
||||||
characterController.enableAutostep(0.35, 0.15, false);
|
|
||||||
|
if (maxStepHeight > COLLISION_EPSILON) {
|
||||||
|
characterController.enableAutostep(
|
||||||
|
maxStepHeight,
|
||||||
|
maxStepHeight * AUTOSTEP_MIN_WIDTH_FACTOR,
|
||||||
|
false
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
characterController.setMaxSlopeClimbAngle(MAX_WALKABLE_SLOPE_RADIANS);
|
characterController.setMaxSlopeClimbAngle(MAX_WALKABLE_SLOPE_RADIANS);
|
||||||
characterController.setMinSlopeSlideAngle(Math.PI * 0.5);
|
characterController.setMinSlopeSlideAngle(Math.PI * 0.5);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user