我想保持一个对象在场景中的位置,并希望将该对象的父级从场景更改为任何其他网格。这是一个示例代码 http://plnkr.co/edit/fpjsUkOA0rH6FvG4DL6Z?p=preview
在这个例子中,当我试图将球体添加到盒子时它的position
正在改变。我想保持原始位置.try删除第35行中的注释,spehere正朝着box.i想要保持其位置,使球形盒子的孩子
http://plnkr.co/edit/fpjsUkOA0rH6FvG4DL6Z?p=preview
答案 0 :(得分:0)
如果将球体添加到组中,则只需要从球体的位置减去组的位置,使其保持在原始世界位置。
var material = new THREE.MeshLambertMaterial({color: 0x00ff00});
var boxGeometry = new THREE.BoxGeometry(5, 15, 5);
var box = new THREE.Mesh(boxGeometry, material);
var sphereGeometry = new THREE.SphereGeometry( 5, 32, 32 );
var sphere = new THREE.Mesh(sphereGeometry, material);
sphere.position.set(0, 10, 0);
sphere.updateMatrix();
var group = new THREE.Object3D();
group.translateX(6);
group.updateMatrix();
// if you add sphere to group object
group.add(box);
group.add(sphere);
scene.add(group);
var m = new THREE.Matrix4().getInverse(group.matrixWorld);
sphere.applyMatrix(m);
// if you add sphere to box
group.add(box);
box.add(sphere);
scene.add(group);
var m = new THREE.Matrix4().getInverse(box.matrixWorld);
sphere.applyMatrix(m);
console.log(group.position, sphere.position);
答案 1 :(得分:0)
如果问题仅依赖position
,那么Brakebein的答案可能是正确的。但如果您还需要还原scale
和rotation
,那么您应该做出类似这样的事情,我想:
var inversionMatrix = new THREE.Matrix4();
inversionMatrix.getInverse( parentObject.matrix );
childObject.applyMatrix(inversionMatrix);