【问题标题】:Can't get Three.js camera up direction无法让 Three.js 相机向上方向
【发布时间】:2020-02-13 19:52:34
【问题描述】:

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

我试过了:

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

一旦我设法让绿色箭头指向相机助手蓝色三角形的顶部,我就可以开始了

【问题讨论】:

    标签: three.js 3d


    【解决方案1】:

    在正常的渲染流程中,阴影相机矩阵作为渲染阴影贴图的一部分进行更新 (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
    

    【讨论】:

    • 立即尝试:D
    • dl.shadow.updateMatrices() 需要一个 viewportIndex 参数...我可以将它设置为 0 吗?
    • 我已经更新了沙箱,以深绿色显示你的方向,我在获取值之前调用了整个帧渲染并尝试了不同的 viewportIndex 值......仍然没有运气
    • @L.Trabacchin 抱歉,我错过了updateMatrices 的参数 文档和类型文件与代码不匹配...LightShadow.updateMatrices 的参数只需要一个灯。无论如何,它是dl.shadow.updateMatrices(dl)。试一试,看看你会得到什么。
    • 完成!更改了let updateFn = this.directionalLight.shadow.updateMatrices as ( this: THREE.DirectionalLightShadow, light: THREE.Light ) =&gt; void; updateFn.call(this.directionalLight.shadow, this.directionalLight); 但它仍然没有指向正确的方向......
    【解决方案2】:

    通过反复试验,我发现给我正确结果的是:

    打电话

    directionalLight.shadow.updateMatrices(...)
    

    然后

    new THREE.Vector3(0,1,0).applyQuaternion(directionalLight.shadow.camera.quaternion)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-03
      • 2013-01-26
      • 2012-12-11
      • 1970-01-01
      • 2021-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多