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