2017-03-01 130 views
0

我正在通过将来自3dsmax的两个导出的假人设置为使用其matrixWorld属性来切换摄像头。更新摄像头帮助程序投影矩阵(three.js)

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

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

它不允许我在帮助程序本身上运行updateProjectionMatrix()。我已经尝试将助手教育给原始相机。我也尝试将helper.matrixWorld设置为同一个dummy_shot1.matrixWorld。获得助手更新以及为其创建的相机更新的最佳方式是什么?

+0

所以'camera_foreground'和'dummy_shot1'都是'THREE.Camera'对象,我说得对吗? – neeh

+0

'dummy_shot1'的类是什么? – neeh

回答

0

3dsmax collada导出器不支持3dsmax相机/相机动画。为了解决这个问题,我正在输出已经用于所述相机的傻瓜(从max到threejs)。我担心这些假人会在没有动画的情况下出现(因为父母(3dsmax相机)会被忽略)。

傻瓜通过罚款(我想过),因为相机的位置/旋转工作正常时,复制矩阵three.js相机。尝试让助手执行相同操作时出现问题(通过调试摄像头查看场景时很明显)。

看起来three.js中的camera_helper对象与这些特殊假人的矩阵并不能很好地配合(可能是因为在3dsmax中他们正在从父母那里偷窃)。奇怪的是,相机(如上所述)工作正常。

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

感谢Neeh的帮助和问题。这是重建测试场景上传,我注意到新的假人(不是摄像机父亲)与帮手很好地工作。

0

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

鉴于两个摄像头:camera1camera2,你可以从camera1CameraHelper转型切换到camera2这样的:

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

注意

,似乎更方便您另一种解决方案,将是为每台摄像机创建一个THREE.CameraHelper,并将当前显示的帮助器切换为:

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

另外,THREE.Layers也可用于控制当前显示的帮助程序。

+0

感谢您的反馈。我试过'camera_foreground_helper.update()',但它似乎没有任何区别。我不是在切换相机,而是在两个假人之间移动相同的相机,例如'camera_foreground.matrixWorld =(dummy_shot1.matrixWorld);'。我也尝试过为helper'camera_foreground_helper.maxtrix =(dummy_shot1.matrixWorld);'然后'camera_foreground_helper做同样的事情。更新();' –

+0

我得到的凸轮_helper与前景相机抵消的唯一方法是不断重新创建它(一个可怕的黑客)。 FOV在我的调试视图中更新更新,但是当前景摄像机移动到新的虚拟矩阵时,助手会留下并且只继承FOV –

+0

您可以创建[fiddle](https://jsfiddle.net/),以便我可以看到哪里问题? – neeh