无法获得三.js相机向上的方向

  • 本文关键字:方向 相机 js three.js 3d
  • 更新时间 :
  • 英文 :


我需要让相机朝上方向,我已经尝试了很多方法都没有运气,我不是四元数专家,所以我怀疑我做对了。

我试过:

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)

最新更新