unify parent-child relative tranformations

This commit is contained in:
2026-04-10 17:14:56 +03:00
parent 2a24b47dca
commit eadd0bbf20
+15 -11
View File
@@ -32,27 +32,31 @@ 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]()
let position, quaternion, scale = new Vector3(1,1,1); let position, quaternion, scale;
// if (colliderSettings.root){ // if (colliderSettings.root){
// // mesh.getWorldPosition(position = new Vector3()); // // mesh.getWorldPosition(position = new Vector3());
// // mesh.getWorldQuaternion(quaternion = new Quaternion()); // // mesh.getWorldQuaternion(quaternion = new Quaternion());
// position = colliderSettings.root.position; // position = colliderSettings.root.position;
// quaternion = colliderSettings.root.quaternion; // quaternion = colliderSettings.root.quaternion;
// }else{ // }else{
position = mesh.position; position = mesh?.position?.clone();
quaternion = mesh.quaternion; quaternion = mesh?.quaternion?.clone();
scale = mesh?.scale?.clone();
//} //}
if (colliderSettings.root){ if (colliderSettings.root){
mesh.updateWorldMatrix(true);
let p = mesh; let p = mesh;
while (p != colliderSettings.root.parent) { let m = p.matrix.clone();
scale.multiply(p.scale); while (p != colliderSettings.root) {
p = p.parent; p = p.parent;
m.premultiply(p.matrix)
} }
m.decompose(position, quaternion, scale)
} }
rigidBodyDesc.setTranslation(position.x, position.y, position.z) rigidBodyDesc.setTranslation(mesh.position.x, mesh.position.y, mesh.position.z)
quaternion && rigidBodyDesc.setRotation(quaternion) mesh.quaternion && rigidBodyDesc.setRotation(mesh.quaternion)
// * Responsible for collision response // * Responsible for collision response
const rigidBody = this.world.createRigidBody(rigidBodyDesc) const rigidBody = this.world.createRigidBody(rigidBodyDesc)
@@ -84,8 +88,8 @@ class Physics{
const vertex = new Vector3(); const vertex = new Vector3();
const position = mesh.geometry.getAttribute( 'position' ); const position = mesh.geometry.getAttribute( 'position' );
for ( let i = 0; i < position.count; i ++ ) { for ( let i = 0; i < position.count; i ++ ) {
vertex.fromBufferAttribute( position, i ); vertex.fromBufferAttribute( position, i ).multiply(scale);
vertices.push( vertex.x * scale.x, vertex.y * scale.x, vertex.z * scale.x ); vertices.push( vertex.x, vertex.y, vertex.z );
} }
// if the buffer is non-indexed, generate an index buffer // if the buffer is non-indexed, generate an index buffer
@@ -110,8 +114,8 @@ class Physics{
// * Responsible for collision detection // * Responsible for collision detection
const collider = this.world.createCollider(colliderDesc, rigidBody) const collider = this.world.createCollider(colliderDesc, rigidBody)
if (colliderSettings.root){ if (colliderSettings.root){
collider.setTranslationWrtParent(colliderSettings.root.position) collider.setTranslationWrtParent(position)
collider.setRotationWrtParent(colliderSettings.root.quaternion) collider.setRotationWrtParent(quaternion)
//console.log(colliderSettings.root.position, mesh.position) //console.log(colliderSettings.root.position, mesh.position)
} }
const physicsObject = { mesh, collider, rigidBody, fn: postPhysicsFn, autoAnimate } const physicsObject = { mesh, collider, rigidBody, fn: postPhysicsFn, autoAnimate }