2013-05-30 94 views
1

我有一个加载了OBJLoader的复杂模型。我想移动并旋转其中心,让用户(我的应用程序的用户)将中心点放在他/她想要的位置。 我知道这个:old question,但对我来说不起作用。 这是一个小提琴的测试:fiddle exampleThree.js移动并旋转几何中心

在这个例子中按下按钮我期望中心被移动。 在按钮上的代码是:

objMesh.geometry.applyMatrix(new THREE.Matrix4().makeTranslation(new THREE.Vector3(1, 0.1, 0.1))); 

回答

3

我找到了解决方案经验,但我不明白为什么它的工作原理。 我发布的代码来帮助,也许有人可以解释我发现了什么。

下面的代码将x中心移动0.1个单位。

var x = 0.1; 
var y = 0; 
var z = 0; 

for (var i = 0; i < object.children.length; i++) 
{ 
    var geometry = object.children[i].geometry; 

    object.children[i].centroid.divideScalar(geometry.vertices.length); // Why this line ? 

    var offset = object.children[i].centroid.clone(); 
    object.children[i].geometry.applyMatrix(new THREE.Matrix4().makeTranslation(-offset.x+x, -offset.y+y, -offset.z+z)); 
    object.children[i].position.x -= x; 
    object.children[i].position.y -= y; 
    object.children[i].position.z -= z; 
    object.children[i].geometry.verticesNeedUpdate = true; 
} 
1

随着WebGLRenderer,您需要设置需要更新标记,而正确的ARG传递给makeTranslation()

objMesh.geometry.applyMatrix(new THREE.Matrix4().makeTranslation(1, 0.1, 0.1)); 
objMesh.geometry.verticesNeedUpdate = true; 

参见维基文章How to Update Things with WebGLRenderer

此外,可以考虑调用mesh.position.set(),而不是移动几何体的每个顶点。

three.js所r.58

+0

谢谢你的回答。我不想移动或调整形状,只能移动或旋转中心。 例如,我想将中心置于角落中的一个角落。或者例如旋转中心,使其不与世界坐标系统对齐。 – user2194221

+0

1.“旋转中心”是什么意思? 2.几何不具有“中心”属性。 – WestLangley

+0

我的意思是:如果您尝试旋转模型,它会围绕其中心旋转。我想移动这个中心。 问题是我从CAD系统导入模型,并且轴的方向与用边界框计算的中心不匹配。所以如果我试图旋转或拉伸(改变比例)一个导入的形状,结果是不正确的。 例如,如果我导入一个不与x,y,z轴对齐的立方体,rotare/resize的结果是完全错误的。我希望自己明确了 – user2194221