Javascript Three.JS:获取旋转对象的位置

Javascript Three.JS:获取旋转对象的位置,javascript,vector,3d,rotation,three.js,Javascript,Vector,3d,Rotation,Three.js,在Three.JS中,我能够围绕其原点旋转对象。例如,如果我对一条线执行此操作,则该线会旋转,但其顶点的位置不会随其新位置而更新。是否有方法将旋转矩阵应用于顶点的位置,以找到点的新位置?假设我将点位于(0,0,0)和(0100100)的直线在x轴上旋转45°,在y轴上旋转20°,在z轴上旋转100°。如何找到顶点相对于整个场景的实际位置 谢谢是的,“整个场景”意味着世界位置 3.Vector3()有一个applyMatrix4()方法 为了将顶点投影到世界空间,可以执行与着色器相同的操作 you

在Three.JS中,我能够围绕其原点旋转对象。例如,如果我对一条线执行此操作,则该线会旋转,但其顶点的位置不会随其新位置而更新。是否有方法将旋转矩阵应用于顶点的位置,以找到点的新位置?假设我将点位于(0,0,0)和(0100100)的直线在x轴上旋转45°,在y轴上旋转20°,在z轴上旋转100°。如何找到顶点相对于整个场景的实际位置


谢谢

是的,“整个场景”意味着世界位置

3.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);
如果你需要一个很好的教程,我建议你在引擎盖下做些什么

Alteredq发布了关于three.js矩阵的所有信息

编辑

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

编辑2

如果要移动示例中的线点,而不是将其应用于粒子,请将其应用于

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)

是的,“整个场景”意味着世界位置

3.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);
如果你需要一个很好的教程,我建议你在引擎盖下做些什么

Alteredq发布了关于three.js矩阵的所有信息

编辑

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

编辑2

如果要移动示例中的线点,而不是将其应用于粒子,请将其应用于

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)

是的,“整个场景”意味着世界位置

3.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);
如果你需要一个很好的教程,我建议你在引擎盖下做些什么

Alteredq发布了关于three.js矩阵的所有信息

编辑

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

编辑2

如果要移动示例中的线点,而不是将其应用于粒子,请将其应用于

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)

是的,“整个场景”意味着世界位置

3.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);
如果你需要一个很好的教程,我建议你在引擎盖下做些什么

Alteredq发布了关于three.js矩阵的所有信息

编辑

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

编辑2

如果要移动示例中的线点,而不是将其应用于粒子,请将其应用于

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)

谢谢,我会尝试一下。我的代码在dev.kaufer.org/angle。在控制台中,当我调用applyRotation(0,Math.PI/4,0)时,该点将在y轴上将直线旋转45°,不会移动。但是,如果我调用
applyrotion(0,Ma