Three.js обновляет ротацию внука Object3D

Я пытаюсь заставить внука повернутого элемента 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). Это действует так, как будто ничего не было обновлено в этом случае. Я проверил документы и до сих пор не понимаю, почему это даже ничего не меняет.

Заранее благодарю за любую помощь!


person Alex    schedule 14.08.2017    source источник
comment
См. этот ответ.   -  person WestLangley    schedule 15.08.2017


Ответы (1)


Вы можете использовать эту функцию:

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);
            };
        }
    }
}();

Используйте его для объекта с повернутым родителем, например: (отметьте эту скрипту)

alwaysLookAtCamera(anyObjectFromTheScene, camera);

По сути, он переопределяет matrixWorld данного объекта перед его рендерингом.

Тем не менее, я не рекомендую использовать эту функцию, поскольку three.js не был создан для такого использования.

Проверьте ответ WestLangley для правильного решения

person neeh    schedule 15.08.2017
comment
Это здорово, спасибо большое. Я чувствую, что Три документа должны быть обновлены с этой информацией... - person Alex; 15.08.2017