Three.JS:获取旋转物体的位置

时间:2014-03-27 21:41:23

标签: javascript vector 3d rotation three.js

在Three.JS中,我能够旋转物体的原点。例如,如果我使用一条线来执行此操作,则该线会旋转,但其顶点的位置不会使用其新位置进行更新。有没有办法将旋转矩阵应用到顶点的位置以找到该点的新位置?假设我在(0,0,0)和(0,100,100)处旋转一条线,在x上为45°,在y上为20°,在z上为100°。我将如何找到相对于整个场景的顶点的实际位置。

由于

1 个答案:

答案 0 :(得分: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 matrices here

的所有信息

修改

有一点需要注意,如果你只想要旋转而不是平移,你需要使用模型世界矩阵的上部3x3部分,它是旋转矩阵。这可能稍微复杂一些。我忘记了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)