.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

根据上面的文档

所以这些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 指向您未预料到的平移方向。这导致您的 xy 值看起来好像不在正确的位置。但是,如果您查看调用 object.position.length() 的结果,您会发现返回的值确实是 2,这是您要移动的数量。

有关矩阵的更多信息,以及它们如何受平移、旋转甚至缩放的影响:http://www.opengl-tutorial.org/beginners-tutorials/tutorial-3-matrices/