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