我正在尝试将旋转的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)旋转实际上没有发生任何变化。在这种情况下,它似乎没有任何更新。我检查了文档但仍然无法理解为什么它甚至没有改变任何东西。
提前感谢您的帮助!
答案 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是否有合适的解决方案