Javascript Ortographic相机在调整大小时的纵横比

Javascript Ortographic相机在调整大小时的纵横比,javascript,graphics,three.js,Javascript,Graphics,Three.js,是否在THREE.JS中设置ortographic摄像头,以便: 1) 它保持恒定的纵横比。即使我对窗口进行了调整。此纵横比应始终保持不变,与窗尺寸和纵横比无关,并避免变形 2) 无论窗口大小,场景始终完全可见 多谢各位 假设您拥有当前相机,并且希望确保整个场景都适合其视图。在正交摄影机中可以更改的变量有左、右、上、下、近、远。通常需要确保left=-right和top=-bottom。您需要确保该比率等于窗口的纵横比。因此,您所能更改的基本上是单个刻度值 要确定这一点,我们要做的是:获取场景中

是否在THREE.JS中设置ortographic摄像头,以便:

1) 它保持恒定的纵横比。即使我对窗口进行了调整。此纵横比应始终保持不变,与窗尺寸和纵横比无关,并避免变形

2) 无论窗口大小,场景始终完全可见


多谢各位

假设您拥有当前相机,并且希望确保整个场景都适合其视图。在
正交摄影机中可以更改的变量有
左、右、上、下、近、远。通常需要确保
left=-right
top=-bottom
。您需要确保该比率等于窗口的纵横比。因此,您所能更改的基本上是单个刻度值

要确定这一点,我们要做的是:获取场景中的所有点,并将它们转换为摄影机空间。然后,x、y和z的最小值和最大值分别给出相机的最小边界。然后我们只需要确保纵横比是正确的

现在,对所有点执行此操作通常计算量太大。相反,我们可以使用以
c
为中心的半径为
r
的边界球体来近似场景。您可以在应用程序开始时计算这些值一次,也可以将它们与场景一起保存。然后,我们不再确保场景适合视图,而是确保整个边界球体适合视图

对于正交摄影机来说,这样做其实很简单。我们只需要将球体的中心转换为摄影机坐标:

var cInCameraSpace = new THREE.Vector3(); //do this once at initialization

//transform sphere center to camera space
cInCameraSpace.copy(c);
cInCameraSpace.applyMatrix4(camera.matrixWorldInverse)
然后我们可以找到边界:

var halfWidth = Math.abs(cInCameraSpace.x) + r;
var halfHeight = Math.abs(cInCameraSpace.y) + r;
camera.near = -cInCameraSpace.z - r;
camera.far = -cInCameraSpace.z + r;
现在,让我们确保保留纵横比。我假设我们已经知道窗口的纵横比为
windowAspect

if(halfWidth / halfHeight > windowAspect) {
    camera.right = halfWidth;
    camera.top = halfWidth / windowAspect;
} else {
    camera.top = halfHeight;
    camera.right = halfHeight * windowAspect;
}
camera.bottom = -camera.top;
camera.left = -camera.right;

我不明白。如果要避免扭曲,必须使投影适应窗口。你能详细说明一下你的要求吗?我已经这样做了,但我想这样做,无论我调整窗口的大小有多小,在不扭曲场景的情况下,整个场景都是可见的,并且已经在这个问题上困扰了好几天。你的场景是静态的还是动态的?你知道范围吗?场景是动态的,我可以将对象移入和移出场景,但我必须确保在调整窗口大小时,其中的一些对象始终可见。因此,对象的初始位置很重要,并且它必须始终将对象包含在其初始位置嗨,谢谢你的回答,我明白了,我只是不确定如何得到边界球,我发现的所有方法都很复杂,你能帮我吗?这取决于你的场景。也许你只知道一个近似的边界球?如果不是,那么我通常只是一个近似值,因为我们不需要一个超精确的球体。因此,我首先计算轴对齐的边界框(只取所有点的最小值和最大值),然后计算该框的边界球体(相同的中心,半径为对角线长度的一半)。另一方面,您也可以根据边界框进行相机调整。工作稍微多了一点,但没有太复杂(可能会让你看得更清楚)。嗨,我按照你说的那样实现了它,但它会扭曲场景,无论如何,这样做不会造成扭曲?嗨,没关系,忘了更新ProjectionMatrix,它正在工作,非常感谢!