2014-04-11 80 views
0

我有一个THREE.Scene添加了两个网格,meshAmeshB,其中每个都以不同的方式旋转。我的目标是从场景中删除meshB,并将其重新添加为meshA的子项,同时保留其全局位置和旋转 - 换句话说,meshB的位置和旋转在该代码之前和之后应该看起来相同。Three.js - 计算相对旋转

我现在,几乎工作尝试如下:

var globalOffset = new THREE.Vector3().subVectors(meshB.position, meshA.position); 
var localOffset = meshA.worldToLocal(meshB.position); 

var rotationOffset = meshA.quaternion.clone().inverse(); 
var rotation = meshB.quaternion.clone().multiply(rotationOffset); 

scene.remove(meshB); 
meshA.add(meshB); 

meshB.position = localOffset; 
meshB.rotation.setFromQuaternion(rotation); 

定位工作正常;只有当meshAmeshB围绕同一个轴旋转时,旋转才起作用 - 如果meshAmeshB已围绕不同的轴旋转,meshB在此代码之前和之后似乎会改变旋转角度。

任何想法,我可以如何纠正上面的代码(或不同的方法的想法),使meshB仍然具有相同的“全局”旋转之前和之后被删除和重新添加到场景?

谢谢!

回答

2

有可供正是这样做的three.js所工具:

THREE.SceneUtils.detach(child, parent, scene); // remove child from parent and add to scene 

THREE.SceneUtils.attach(child, scene, parent); // remove child from scene and add to parent 

全球取向不变。

three.js r.66