unify parent-child relative tranformations

This commit is contained in:
2026-04-10 17:14:56 +03:00
parent 2a24b47dca
commit eadd0bbf20
+16 -12
View File
@@ -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 }