diff --git a/src/lib/Physics.js b/src/lib/Physics.js index e0588f7..eca5ef7 100644 --- a/src/lib/Physics.js +++ b/src/lib/Physics.js @@ -32,27 +32,31 @@ class Physics{ add = (mesh, rigidBodyType, autoAnimate = true, postPhysicsFn, colliderType, colliderSettings = {}) => { const rigidBodyDesc = RAPIER.RigidBodyDesc[rigidBodyType]() - let position, quaternion, scale = new Vector3(1,1,1); + let position, quaternion, scale; // 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; + position = mesh?.position?.clone(); + quaternion = mesh?.quaternion?.clone(); + scale = mesh?.scale?.clone(); //} if (colliderSettings.root){ + mesh.updateWorldMatrix(true); let p = mesh; - while (p != colliderSettings.root.parent) { - scale.multiply(p.scale); + let m = p.matrix.clone(); + while (p != colliderSettings.root) { p = p.parent; - } + m.premultiply(p.matrix) + } + m.decompose(position, quaternion, scale) } - rigidBodyDesc.setTranslation(position.x, position.y, position.z) - quaternion && rigidBodyDesc.setRotation(quaternion) + rigidBodyDesc.setTranslation(mesh.position.x, mesh.position.y, mesh.position.z) + mesh.quaternion && rigidBodyDesc.setRotation(mesh.quaternion) // * Responsible for collision response const rigidBody = this.world.createRigidBody(rigidBodyDesc) @@ -84,8 +88,8 @@ class Physics{ const vertex = new Vector3(); const position = mesh.geometry.getAttribute( 'position' ); for ( let i = 0; i < position.count; i ++ ) { - vertex.fromBufferAttribute( position, i ); - vertices.push( vertex.x * scale.x, vertex.y * scale.x, vertex.z * scale.x ); + vertex.fromBufferAttribute( position, i ).multiply(scale); + vertices.push( vertex.x, vertex.y, vertex.z ); } // if the buffer is non-indexed, generate an index buffer @@ -110,8 +114,8 @@ class Physics{ // * Responsible for collision detection const collider = this.world.createCollider(colliderDesc, rigidBody) if (colliderSettings.root){ - collider.setTranslationWrtParent(colliderSettings.root.position) - collider.setRotationWrtParent(colliderSettings.root.quaternion) + collider.setTranslationWrtParent(position) + collider.setRotationWrtParent(quaternion) //console.log(colliderSettings.root.position, mesh.position) } const physicsObject = { mesh, collider, rigidBody, fn: postPhysicsFn, autoAnimate }