THREE.js如何将正交相机适配场景大小

3
我在stackoverflow上搜索了很多相关问题,但是没有找到解决这个问题的答案。
我的场景中有一个大而动态的Object3D组,使用正交相机从正面观察它们。
我想要一个简单的函数,当调用时,可以将正交相机的top/left/bottom/right/zoom属性与Object3D组适当地匹配。
我尝试了各种方法,但是我的代码都无法贴出。我需要从一个全新的角度来看待这个问题。我发现其他答案讨论了一旦你知道组的包围盒面到相机的距离就可以改变相机的fov,但是我不知道如何在正交相机中实现它,因为(据我所试)fov属性并不能使用(也许它实际上可以,只是我不知道)。
所以我不特别喜欢请求代码,但是我仍然希望有一个函数,可以自动调整传递给它作为参数的对象的适当属性,例如:
function fitOrthographicCameraToObject3DGroup(group) {
    //implement here (my question)
}

你在计算中使用过场景边界框大小吗? - gaitat
是的,我能够计算场景中所有对象的复合边界框;但是,我仍然不知道如何根据它自动调整正交相机的上/左/下/右/缩放属性。 - B''H Bi'ezras -- Boruch Hashem
请查看此答案,了解OrthographicCamera参数的含义。 - WestLangley
2个回答

6

计算您的网格的边界框并应用此代码。这对我有效。

        var camera = new THREE.OrthographicCamera(container.offsetWidth / -2, container.offsetWidth / 2, container.offsetHeight / 2, container.offsetHeight / -2, 100, 100000);

        //For centering the meshGroup
            var box = new THREE.Box3().setFromObject(meshGroup);
            box.center(meshGroup.position);
            meshGroup.localToWorld(box);
            meshGroup.position.multiplyScalar(-1);

       //For fitting the object to the screen when using orthographic camera

           Camera.zoom = Math.min(container.offsetWidth / (box.max.x - box.min.x),
                container.offsetHeight / (box.max.y - box.min.y)) * 0.4;
           Camera.updateProjectionMatrix();
           Camera.updateMatrix();

谢谢!我曾经试图找到一些适用于正交相机的方法,但是一直没有成功,让我有点疯狂了。 - Luis E. Fraguada
如果我从上往下看一个平面,box.max.y-box.min.y将会是0。这个解决方案看起来并不通用。 - Amritesh Anand

1
一旦您拥有边界框,设置正交相机的顶部/左侧/底部/右侧不应该成为问题。只需取边界框的一半长度即可。
缩放是个问题,为此,您可以通过适当的比例缩放场景,将其限制在单位立方体中,具体取决于边界框大小。然后,您就不必担心缩放,上述顶部/左侧/底部/右侧值变为0.5 / 0.5 / -0.5 / -0.5。

一旦我将视锥体设置为正确的尺寸,您建议如何将相机对准组? - B''H Bi'ezras -- Boruch Hashem
而且如果该组适应一个单位立方体,那么截锥的尺寸不应该是.5/.5/-.5,-.5吗? - B''H Bi'ezras -- Boruch Hashem
你说你是从正面看场景,所以我假设相机在z轴上,因此不需要对齐。已更新第二条评论。 - gaitat
没错,我撤回我的评论 :) - B''H Bi'ezras -- Boruch Hashem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接