2014-03-27 100 views
0

在Three.JS中,我可以旋转物体的原点。例如,如果我要用一条直线来完成此操作,则该直线会旋转,但其顶点的位置不会随其新位置更新。有什么方法可以将旋转矩阵应用到顶点的位置以找到点的新位置?假设我在x轴上以(0,0,0)和(0,100,100)为点旋转45°,y轴上旋转20°,z轴上旋转100°。我将如何去寻找相对于整个场景的顶点的实际位置。Three.JS:获取旋转物体的位置

谢谢

回答

3

是的,'整个场景'是指世界的位置。

THREE.Vector3()具有applyMatrix4()方法,

你可以做同样的事情,着色器,以投射到顶点的世界空间,你会做这个

yourPoint.applyMatrix4(yourObject.matrixWorld); 
这样做

项目是进入相机的空间,您可以将此未来

yourPoint.applyMatrix4(camera.matrixWorld); 

获得在-1实际屏幕位置1

yourPoint.applyMatrix4(camera.projectionMatrix); 

你会访问你的观点是这样

var yourPoint = yourObject.geometry.vertices[0]; //first vertex 

也,而不是做了三次,你可以结合矩阵。没有对此进行测试,而是沿着这条线进行测试。可以走另一条路:

var neededPVMmatrix = new THREE.Matrix4().multiplyMatrices(yourObject.matrixWorld, camera.matrixWorld); 
neededPVMmatrix.multiplyMatrices(neededPVMmatrix, camera.projectionMatrix); 

,如果你需要什么这样做的引擎盖下一个很好的教程,我建议this

Alteredq发布一切有了解three.js所矩阵here

编辑

但有一点需要注意,如果您只想旋转,而不是翻译,则需要使用上面的3x3部分,即r选择矩阵,模型世界矩阵。这可能会稍微复杂一些。我忘了three.js给你的东西,但我认为normalMatrix会做到这一点,或者你可以将你的THREE.Vector3()转换为THREE.Vector4(),并将.w设置为0,这将阻止任何翻译被应用。

EDIT2

如果你想在你的榜样招行的点

,而不是把它应用到粒子,它适用于

var yourVertexWorldPosition = new THREE.Vector3().clone(geo.vertices[1]); //this is your second line point, to whatever you set it in your init function 
yourVertexWorldPosition.applyMatrix4();//this transforms the new vector into world space based on the matrix you provide (line.matrixWorld) 
+0

谢谢,我会尝试了这一点。 – mjkaufer

+0

我的代码位于dev.kaufer.org/angle。在控制台中,当我调用'applyRotation(0,Math.PI/4,0)'时,在y上旋转45°线,该点不移动。但是,如果我再次调用'applyRotation(0,Math.PI/2,0)',那么粒子就会移动到应该出现的位置。你可以运行'applyRotation'来查看它的代码。 – mjkaufer

+0

看看我的编辑,你需要将此应用到你的实际顶点,使行 – pailhead