This commit is contained in:
2025-11-21 17:32:21 +02:00
parent 9ebc602819
commit c67ffd774b
+34 -9
View File
@@ -1,8 +1,17 @@
import * as RAPIER from '@dimforge/rapier3d' import * as RAPIER from '@dimforge/rapier3d'
import { Vector3 } from 'three'; import { Quaternion, Vector3 } from 'three';
class Physics{ class Physics{
constructor(engine){ constructor(engine){
this.engine = engine this.engine = engine
this.started = false;
}
start(){
this.started = true;
}
stop(){
this.started = false;
} }
init = async ()=>{ init = async ()=>{
@@ -10,11 +19,11 @@ class Physics{
let world = new RAPIER.World(gravity); let world = new RAPIER.World(gravity);
// Create Ground. // Create Ground.
let bodyDesc = RAPIER.RigidBodyDesc.fixed(); // let bodyDesc = RAPIER.RigidBodyDesc.fixed();
let body = world.createRigidBody(bodyDesc); // let body = world.createRigidBody(bodyDesc);
let colliderDesc = RAPIER.ColliderDesc.cuboid(100, 0, 100); // let colliderDesc = RAPIER.ColliderDesc.cuboid(100, 0, 100);
//bodyDesc.setTranslation(-50,0,-50); // //bodyDesc.setTranslation(-50,0,-50);
world.createCollider(colliderDesc, body.handle); // world.createCollider(colliderDesc, body.handle);
this.world = world; this.world = world;
this.physicsObjects = []; this.physicsObjects = [];
this.eventQueue = new RAPIER.EventQueue(true); this.eventQueue = new RAPIER.EventQueue(true);
@@ -23,8 +32,18 @@ class Physics{
add = (mesh, rigidBodyType, autoAnimate = true, postPhysicsFn, colliderType, colliderSettings = {}) => { add = (mesh, rigidBodyType, autoAnimate = true, postPhysicsFn, colliderType, colliderSettings = {}) => {
const rigidBodyDesc = RAPIER.RigidBodyDesc[rigidBodyType]() const rigidBodyDesc = RAPIER.RigidBodyDesc[rigidBodyType]()
rigidBodyDesc.setTranslation(mesh.position.x, mesh.position.y, mesh.position.z) let position, quaternion;
mesh.quaternion && rigidBodyDesc.setRotation(mesh.quaternion) // if (colliderSettings.root){
// // mesh.getWorldPosition(position = new Vector3());
// // mesh.getWorldQuaternion(quaternion = new Quaternion());
// position = colliderSettings.root.position;
// quaternion = colliderSettings.root.quaternion;
// }else{
position = mesh.position;
quaternion = mesh.quaternion;
//}
rigidBodyDesc.setTranslation(position.x, position.y, position.z)
quaternion && rigidBodyDesc.setRotation(quaternion)
// * Responsible for collision response // * Responsible for collision response
const rigidBody = this.world.createRigidBody(rigidBodyDesc) const rigidBody = this.world.createRigidBody(rigidBodyDesc)
@@ -82,7 +101,10 @@ class Physics{
// * Responsible for collision detection // * Responsible for collision detection
const collider = this.world.createCollider(colliderDesc, rigidBody) const collider = this.world.createCollider(colliderDesc, rigidBody)
mesh.quaternion && collider.setRotationWrtParent(mesh.quaternion) if (colliderSettings.root){
collider.setTranslationWrtParent(colliderSettings.root.position)
collider.setRotationWrtParent(colliderSettings.root.quaternion)
}
const physicsObject = { mesh, collider, rigidBody, fn: postPhysicsFn, autoAnimate } const physicsObject = { mesh, collider, rigidBody, fn: postPhysicsFn, autoAnimate }
this.physicsObjects.push(physicsObject) this.physicsObjects.push(physicsObject)
@@ -99,6 +121,9 @@ class Physics{
} }
step(){ step(){
if (!this.started){
return;
}
this.world.step(this.eventQueue) this.world.step(this.eventQueue)
for (let po of this.physicsObjects) { for (let po of this.physicsObjects) {