physics test2

This commit is contained in:
2025-10-16 09:53:52 +03:00
parent a60d94fe66
commit 49e0486277
12 changed files with 283 additions and 169 deletions
+104
View File
@@ -0,0 +1,104 @@
import * as RAPIER from '@dimforge/rapier3d'
// export type PhysicsObject = {
// mesh: THREE.Mesh
// collider: Rapier.Collider
// rigidBody: Rapier.RigidBody
// fn?: Function
// autoAnimate: boolean
// }
class Physics{
constructor(){
}
init = async ()=>{
let gravity = { x: 0.0, y: -9.81, z: 0.0 };
let world = new RAPIER.World(gravity);
// Create Ground.
let bodyDesc = RAPIER.RigidBodyDesc.fixed();
let body = world.createRigidBody(bodyDesc);
let colliderDesc = RAPIER.ColliderDesc.cuboid(100.0, 0.1, 100.0);
world.createCollider(colliderDesc, body.handle);
this.world = world;
this.physicsObjects = [];
return this;
}
add = (mesh, rigidBodyType, autoAnimate = true, postPhysicsFn, colliderType, colliderSettings) => {
const rigidBodyDesc = RAPIER.RigidBodyDesc[rigidBodyType]()
rigidBodyDesc.setTranslation(mesh.position.x, mesh.position.y, mesh.position.z)
// * Responsible for collision response
const rigidBody = this.world.createRigidBody(rigidBodyDesc)
let colliderDesc
switch (colliderType) {
case 'cuboid':
{
const { width, height, depth } = colliderSettings
colliderDesc = RAPIER.ColliderDesc.cuboid(width, height, depth)
}
break
case 'ball':
{
const { radius } = colliderSettings
colliderDesc = RAPIER.ColliderDesc.ball(radius)
}
break
case 'capsule':
{
const { halfHeight, radius } = colliderSettings
colliderDesc = RAPIER.ColliderDesc.capsule(halfHeight, radius)
}
break
default:
{
colliderDesc = RAPIER.ColliderDesc.trimesh(
mesh.geometry.attributes.position.array,
mesh.geometry.index?.array
)
}
break
}
if (!colliderDesc) {
console.error('Collider Mesh Error: convex mesh creation failed.')
}
// * Responsible for collision detection
const collider = this.world.createCollider(colliderDesc, rigidBody)
const physicsObject = { mesh, collider, rigidBody, fn: postPhysicsFn, autoAnimate }
this.physicsObjects.push(physicsObject)
return physicsObject
}
step(){
this.world.step()
for (let po of this.physicsObjects) {
const autoAnimate = po.autoAnimate
if (autoAnimate) {
const mesh = po.mesh
const collider = po.collider
mesh.position.copy(collider.translation())
mesh.quaternion.copy(collider.rotation() )
}
const fn = po.fn
fn && fn()
}
}
}
export { Physics }