我需要使摄像机向上,我已经尝试了很多运气,我不是四元数专家,所以我怀疑我做对了。
我尝试过:
camera.up
camera.up.applyMatrix4(camera.matrixWorld);
new THREE.Vertex3(0,1,0).applyMatrix4(camera.matrixWorld);
camera.up.normalize().applyMatrix4(camera.matrixWorld);
此后,我创建了两架经过我感兴趣的两点的飞机,并将飞机助手添加到场景中,我可以看到它们离我期望的位置很远。 (我期望两个平面看起来像摄像机视锥的顶部和底部)。
P.s。相机是定向光的阴影相机,因此是正交相机,在执行此操作之前,我会操纵定向光的位置和目标,但是我在光源,目标和相机上对updateMatrixWorld
进行了调用我也打电话给相机updateProjectionMatrix
...仍然没有结果
我制作了一个沙箱,以查看到目前为止我已经尝试过的内容,并更好地可视化我想要实现的目标:
https://codesandbox.io/embed/throbbing-cache-j5yse
一旦我设法使绿色箭头指向相机助手的蓝色三角形的顶部,我就很好了
在正常渲染流程中,阴影摄影机矩阵会作为渲染阴影贴图(WebGLShadowMap.render
)的一部分进行更新。
但是,如果要更新的矩阵值之前渲染,则需要手动更新它们(您已经了解了此部分。)>
因为阴影摄像机是DirectionalLight
的property
updateMatrixWorld
的child),所以它没有遵循关于shadow
的相同规则。相反,您需要调用updateMatrices
属性的LightShadow.updateMatrices
方法(从LightShadow.updateMatrices
继承)。const dl = new THREE.DirectionalLight(0xffffff, 1) dl.shadow.updateMatrices() // <<------------------------ Updates the shadow camera
这将用
DirectionalLight
自己的矩阵及其目标矩阵中的信息更新阴影照相机,以正确地调整阴影照相机的方向。
最后,看起来您正在尝试使相机变得“真实”。就个人而言,我将使用便捷功能localToWorld
:
let up = new THREE.Vector3(0, 1, 0)
dl.shadow.camera.localToWorld(up) // destructively converts "up" from local-to-camera into world coordinates