【问题标题】:Three.JS: Get position of rotated object三.JS:获取旋转对象的位置
【发布时间】:2014-05-07 03:30:44
【问题描述】:

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

谢谢

【问题讨论】:

    标签: javascript vector 3d rotation three.js


    【解决方案1】:

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

    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
    

    另外,您可以将矩阵组合起来,而不是重复执行 3 次。没有对此进行测试,但与此类似。可能会走另一条路:

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

    如果你需要一个很好的教程,我推荐this

    Alteredq 发布了有关three.js 矩阵的所有信息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)
    

    【讨论】:

    • 谢谢,我试试看。
    • 我的代码位于 dev.kaufer.org/angle。在控制台中,当我调用applyRotation(0,Math.PI / 4, 0) 时,将线在 y 上旋转 45°,该点不会移动。但是,如果我再次调用applyRotation(0,Math.PI / 2, 0),粒子将移动到它应该在的位置。你可以运行applyRotation 来查看它的代码。
    • 看看我的编辑,你需要把它应用到你的实际顶点上
    • 我试过了,没有用。它似乎仍然在做同样的事情。
    • 我认为正在发生的事情是它正在应用新线点的位置以及它的旋转,这实际上是它的两倍。
    猜你喜欢
    • 2012-07-19
    • 2015-09-10
    • 2021-08-27
    • 2013-07-02
    • 1970-01-01
    • 2016-12-06
    • 2016-03-25
    • 2022-01-18
    • 2019-07-16
    相关资源
    最近更新 更多