.position 属性是否真的将值存储在本地 space 或世界 space 中的 three.js 中?
Does the .position attribute really stores the values in local space or in world space in three.js?
https://threejs.org/docs/#api/en/core/Object3D.position
根据上面的文档
- .translateX “按距离单位在对象 space 中沿 x 轴平移对象”
- .position storse “表示对象局部位置的 Vector3” and
- .rotateX “在局部 space 中围绕 x 轴旋转对象”。
所以这些methods/attributes都是指对象的局部坐标系。这就是我不理解的地方。
我用 .rotateX(2) 旋转了一个对象。然后我应用了.translateY(2)。结果如下:
.rotation 属性包含以下内容:
.rotation
矩阵世界是这样的:
.matrixWorld
并且位置属性包含:
.position
所以我希望 position 属性包含 x: 0, y: 2, z: 0 因为文档说 .position 在本地坐标中并且 translate-method 也适用于本地坐标。但对我来说,看起来 .translate 确实在本地坐标中工作,但 .position 存储的位置不是在本地坐标中,而是在世界坐标中。支持这个观点的是,这些值与WorldMatrix中最后一列的值完全匹配。
所以我很困惑,想问是否有人可以向我解释为什么文档说的与我预期的不同。
想一想站在大格子上的人从高处往下看。他们的脚在 0, 0
。向前迈出一步将使它们位于 0, 1
(这告诉您它们面向 +Y
方向)。
现在,您希望它们最终到达位置 -2, 0
,并面向 +X
(0, 0
)。你知道要做到这一点,他们需要在 -X
方向移动 2
个空格,并顺时针转动 body 90°
。所以,你给他们指示:
translateX(-2) and rotateZ(Math.PI/2)
将其转化为该人参考框架的本地指令,您将得到:
Take 2 steps to the left and turn 90° to the right
看起来不错吧?除非那个人处决他们,否则他们最终会在 0, 2
并面对 1, 2
。
发生了什么事??
嗯,指令很好,除了它们是同时执行的。发生这种情况时,旋转总是首先发生。所以说明真的是:
Turn 90° to the right THEN take 2 steps to the left
当人第一步转身时,“左”(人的局部)不再是-X
方向,而是+Y
方向
您的平移和旋转也发生了同样的事情。计算平移矩阵时,旋转使局部 X-axis
指向您未预料到的平移方向。这导致您的 x
和 y
值看起来好像不在正确的位置。但是,如果您查看调用 object.position.length()
的结果,您会发现返回的值确实是 2
,这是您要移动的数量。
有关矩阵的更多信息,以及它们如何受平移、旋转甚至缩放的影响:http://www.opengl-tutorial.org/beginners-tutorials/tutorial-3-matrices/
https://threejs.org/docs/#api/en/core/Object3D.position
根据上面的文档
- .translateX “按距离单位在对象 space 中沿 x 轴平移对象”
- .position storse “表示对象局部位置的 Vector3” and
- .rotateX “在局部 space 中围绕 x 轴旋转对象”。
所以这些methods/attributes都是指对象的局部坐标系。这就是我不理解的地方。
我用 .rotateX(2) 旋转了一个对象。然后我应用了.translateY(2)。结果如下:
.rotation 属性包含以下内容: .rotation
矩阵世界是这样的: .matrixWorld
并且位置属性包含: .position
所以我希望 position 属性包含 x: 0, y: 2, z: 0 因为文档说 .position 在本地坐标中并且 translate-method 也适用于本地坐标。但对我来说,看起来 .translate 确实在本地坐标中工作,但 .position 存储的位置不是在本地坐标中,而是在世界坐标中。支持这个观点的是,这些值与WorldMatrix中最后一列的值完全匹配。
所以我很困惑,想问是否有人可以向我解释为什么文档说的与我预期的不同。
想一想站在大格子上的人从高处往下看。他们的脚在 0, 0
。向前迈出一步将使它们位于 0, 1
(这告诉您它们面向 +Y
方向)。
现在,您希望它们最终到达位置 -2, 0
,并面向 +X
(0, 0
)。你知道要做到这一点,他们需要在 -X
方向移动 2
个空格,并顺时针转动 body 90°
。所以,你给他们指示:
translateX(-2) and rotateZ(Math.PI/2)
将其转化为该人参考框架的本地指令,您将得到:
Take 2 steps to the left and turn 90° to the right
看起来不错吧?除非那个人处决他们,否则他们最终会在 0, 2
并面对 1, 2
。
发生了什么事??
嗯,指令很好,除了它们是同时执行的。发生这种情况时,旋转总是首先发生。所以说明真的是:
Turn 90° to the right THEN take 2 steps to the left
当人第一步转身时,“左”(人的局部)不再是-X
方向,而是+Y
方向
您的平移和旋转也发生了同样的事情。计算平移矩阵时,旋转使局部 X-axis
指向您未预料到的平移方向。这导致您的 x
和 y
值看起来好像不在正确的位置。但是,如果您查看调用 object.position.length()
的结果,您会发现返回的值确实是 2
,这是您要移动的数量。
有关矩阵的更多信息,以及它们如何受平移、旋转甚至缩放的影响:http://www.opengl-tutorial.org/beginners-tutorials/tutorial-3-matrices/