【问题标题】:updating camera helper projection matrix (three.js)更新相机助手投影矩阵(three.js)
【发布时间】:2018-08-18 20:51:34
【问题描述】:

我通过将相机设置为使用它们的 matrixWorld 属性,在从 3dsmax 导出的两个假人之间切换相机。

camera_foreground.matrixWorld = (dummy_shot1.matrixWorld);
camera_foreground.updateProjectionMatrix();

这很好用,但我创建的 camera_helper 不会继承矩阵更改。

它不允许我在助手本身上运行 updateProjectionMatrix()。我已经尝试将帮助者养育成原始相机。我还尝试将 helper.matrixWorld 设置为相同的 dummy_shot1.matrixWorld。让助手与为其创建/来自的相机一起更新的最佳方法是什么?

【问题讨论】:

  • 所以camera_foregrounddummy_shot1 都是THREE.Camera 对象,我是对的吗?
  • dummy_shot1 的类是什么?

标签: camera three.js helper


【解决方案1】:

3dsmax collada 导出器不支持 3dsmax 相机/相机动画。为了解决这个问题,我正在导出这些相机的父对象(从 max 到 threejs)。我曾担心假人会在没有动画的情况下通过(因为忽略了父母(3dsmax 相机))。

由于在将矩阵复制到三个.js 相机时相机位置/旋转工作正常,所以假人很好(我认为)。当试图让助手做同样的事情时出现了问题(通过调试相机查看场景时很明显)。

似乎 three.js 中的 camera_helper 对象不能很好地处理这些特定虚拟对象的矩阵(可能是因为在 3dsmax 中它们是从父对象继承而来的)。奇怪的是相机(如上所述)工作正常。

为了解决这个问题,我使用了一个很棒的 maxscript (http://www.breidt.net/scripts/mb_collapse.mcr) 将所有父关键帧数据从 3dsmax 相机复制/烘焙到它的虚拟(不再继承)。然后将 collada 友好的假人导出到 three.js,相机和它的助手都可以很好地工作。

感谢 Neeh 的帮助和问题。它正在重建一个要上传的测试场景,我注意到新的假人(不是相机的父母)与助手配合得很好。

【讨论】:

    【解决方案2】:

    您可以使用THREE.CameraHelper.update() 更新相机助手的截锥体。

    给定两个摄像头:camera1camera2,您可以将 CameraHelper 转换从 camera1 切换到 camera2,如下所示:

    cameraHelper.camera = camera2;
    cameraHelper.matrix = camera2.matrixWorld;
    cameraHelper.update();
    

    注意

    另一个对您来说似乎更方便的解决方案是为每个摄像头创建一个 THREE.CameraHelper 并使用以下命令切换当前显示的帮助程序:

    camera1.helper.visible = false;
    camera2.helper.visible = true;
    

    另外,THREE.Layers也可以用来控制当前显示的helper。

    【讨论】:

    • 感谢您的反馈。我试过camera_foreground_helper.update(),但似乎没什么区别。我不是在切换相机,而是在两个假人之间移动同一个相机,例如camera_foreground.matrixWorld = (dummy_shot1.matrixWorld);。我也试过对 helpercamera_foreground_helper.maxtrix = (dummy_shot1.matrixWorld);camera_foreground_helper.update(); 做同样的事情
    • 我让 cam _helper 与前景摄像头抵消的唯一方法是不断地重新创建它(一个可怕的 hack)。我的调试视图中的 FOV 更改更新很好,但是当前景摄像机移动到新的虚拟矩阵时,助手留在后面并且只继承 FOV
    • 你能创建一个fiddle 以便我看看问题出在哪里吗?
    • 所以在制作我的(第一个)小提琴的过程中,我用三个.js 制作的立方体替换了假人(通过 dae/collada 进来的)。这实际上按预期工作(我什至不需要在助手上运行 update() ,因为它只是通过显式设置矩阵来工作)。不知道为什么 matrixWorld 方法不适用于导入的虚拟对象,但它适用于相机本身?莫非假人有关键帧旋转动画?
    • 可能是因为你必须scene.add() 你的假人才能到现场。你能链接你的小提琴吗? :)
    猜你喜欢
    • 2015-04-11
    • 2018-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-05
    • 2019-04-12
    • 2014-07-31
    相关资源
    最近更新 更多