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