【发布时间】:2016-09-23 14:24:51
【问题描述】:
我有一个数组,其中包含一个编码旋转和位置数据的 4x4 变换矩阵(我已经确认该矩阵表示 Octave 中的有效变换)。我想使用这个数组的内容设置一个three.js对象(Object3D)的matrixWorld属性,即根据变换矩阵设置对象的位置和旋转。
根据three.js 文档中的this page 和此处提出的各种问题(例如this one 和this one),似乎关键是将nameOfObject.matrixAutoUpdate 设置为false。然而,考虑到这一点,我尝试了多种方法来设置nameOfObject.matrixWorld,但它们都没有改变对象的渲染位置:它保持在原点,没有旋转,就像matrixWorld 的情况一样是 4x4 单位矩阵。
这是我尝试过的(此代码在调用 render() 之前的更新方法中):
// Setting up a three.js matrix
var tempMatrix = new THREE.Matrix4();
tempMatrix.fromArray(arrayContainingTransformationMatrix);
// Values are set as expected
console.log(tempMatrix.elements);
// Note that the approaches below were tried one at a time
// First approach (doesn't work)
nameOfObject.matrixAutoUpdate = false;
nameOfObject.matrixWorld.copy(tempMatrix);
// Second approach (also doesn't work)
// Based on the second SO question linked above
nameOfObject.matrixAutoUpdate = false;
nameOfObject.matrix.copy(tempMatrix);
nameOfObject.updateMatrixWorld(true);
// Third approach (this doesn't work either, unfortunately)
nameOfObject.matrixAutoUpdate = false;
nameOfObject.matrixWorld.fromArray(arrayContainingTransformationMatrix);
// Appears to be set correctly regardless of which approach is used
console.log(sphere1.matrixWorld.elements);
几点说明:
- 我认为实际上没有必要在每次迭代中将
matrixAutoUpdate设置为 false,但现在我这样做只是为了安全起见。 - 如果
nameOfObject.position基于变换矩阵第四列中的值而不是更改matrixWorld进行修改,则对象的位置会按预期更改,因此这似乎不是渲染问题。 - 我在多个位置读到过,在手动设置矩阵时不应调用
updateMatrix(),因为它会根据position和rotation属性覆盖它。我假设updateMatrixWorld()也有类似的考虑,但我没有找到关于它的作用的太多讨论。
任何建议将不胜感激!最坏的情况,我会查看源代码,但到目前为止,three.js 一直很容易使用,我怀疑我只是遗漏了一些东西。
【问题讨论】:
-
只能设置对象的矩阵。您不能设置对象的世界矩阵。这是你的问题吗? “如何设置
object.matrix以使其产生特定的object.matrixWorld- 考虑到对象父母的变换?” -
如果对象的世界矩阵是只读的,那就回答了我的问题。我认为可以设置它,因为Object3D docs 中的
matrixWorld属性未标记为“只读”(其他只读属性的描述,例如id,以“只读”开头)。 -
它不是只读的。渲染器正在重置它。
-
是否可以阻止渲染器这样做? (鉴于
SceneUtils中的attach和detach方法,我意识到这不是必需的。)matrixAutoUpdate的描述似乎暗示将其设置为false 应该防止matrix和matrixWorld更新,但这似乎只会阻止matrix被更新。 -
我正在尝试了解您想要实现的目标。如果您在我的第一条评论中回答问题,那将很有帮助。
标签: javascript matrix 3d three.js transform