unify parent-child relative tranformations
This commit is contained in:
+15
-11
@@ -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 }
|
||||
|
||||
Reference in New Issue
Block a user