Three.js更新Object3D的孙子的旋转

时间:2017-08-14 21:40:54

标签: javascript three.js rotation

我正在尝试将旋转的Object3D元素的孙子带到相机的lookAt()

我尝试了很多方法。 Three.js Object3D.lookAt()函数的源代码明确指出:// This method does not support objects with rotated and/or translated parent(s)

我理解为场景中渲染图的一部分。我试过复制lookAt()代码。

我的结构类似于Object3D() [已旋转] - > Object3d() - > Object3D() [文字网格我想在每个框架中面对相机]

lookAt(textObject, artistProps) {
    let m1 = textObject.matrixWorld.clone();
    textObject.matrixAutoUpdate = false;
    m1.lookAt(textObject.localToWorld(textObject.position), Props.camera.position, THREE.Object3D.DefaultUp);
    textObject.quaternion.setFromRotationMatrix(m1);
    textObject.matrixWorld.makeRotationFromQuaternion(textObject.quaternion);
    textObject.matrixWorldNeedsUpdate = true;
    textObject.updateMatrixWorld();
}

这只是我尝试过的一个例子。显然我的方法都是错的。我现在在想,我需要将子对象保存在他们自己的场景级别容器中,这样它们就可以独立于旋转的父级与世界空间相关联。

文本网格(孙子Object3D)旋转实际上没有发生任何变化。在这种情况下,它似乎没有任何更新。我检查了文档但仍然无法理解为什么它甚至没有改变任何东西。

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您可以使用此功能:

var alwaysLookAtCamera = function () {
    var worldPos = new THREE.Vector3();
    if (+THREE.REVISION > 85) {
        return function (object, camera) {
            object.onBeforeRender = function() {
                worldPos.setFromMatrixPosition(object.matrixWorld);
                object.matrixWorld.lookAt(camera.position, worldPos, THREE.Object3D.DefaultUp);
                object.modelViewMatrix.multiplyMatrices(camera.matrixWorldInverse, object.matrixWorld);
                object.normalMatrix.getNormalMatrix(object.modelViewMatrix);
            };
        };
    } else {
        return function (object, camera) {
            object.onBeforeRender = function() {
                worldPos.setFromMatrixPosition(object.matrixWorld);
                object.matrixWorld.lookAt(camera.position, worldPos, THREE.Object3D.DefaultUp);
            };
        }
    }
}();

在具有旋转父级的对象上使用它,如下所示:(检查this fiddle

alwaysLookAtCamera(anyObjectFromTheScene, camera);

基本上,它在渲染之前会覆盖给定对象的matrixWorld

但是,我不建议使用此功能,因为没有像这样使用.js。

检查WestLangley's answer是否有合适的解决方案