我找到了很多解决方案,但它只能适用于PerspectiveCamera,因为OrthographicCamera没有fov。 有没有解决方案?
答案 0 :(得分:3)
正如@gaitat所说,使用THREE.OrthographicCamera
,您需要调整它的平截头体尺寸以适合您想要放大的对象的大小。
直截了当的做法是使用geometry.boundingSphere
并基于此设置相机top
,left
,bottom
和up
。更容易做的是使用camera.zoom
来完成工作,即
// center camera on the object (ellipse in this case)
var boundingSphere = ellipse.geometry.boundingSphere
// aspect equals window.innerWidth / window.innerHeight
if( aspect > 1.0 )
{
// if view is wider than it is tall, zoom to fit height
camera.zoom = viewHeight / ( boundingSphere.radius * 2 )
}
else
{
// if view is taller than it is wide, zoom to fit width
camera.zoom = viewWidth / ( boundingSphere.radius * 2 )
}
// Don't forget this
camera.updateProjectionMatrix()
这会将缩放级别设置为使对象(在这种情况下为椭圆)完全适合您的相机的截头体。
然而,您还必须通过以下任一方式将相机置于对象中心:
由于翻译相机更容易做到这两者,THREE.OrthographicCamera
主要用于显示场景的2D表示(即用于UI或与平行于相机的平面上发生的其他事情) ),这是代码:
camera.position.copy(boundingSphere.center)
// The number here is more or less arbitrary
// as long as all objects that need to be visible
// end up within the frustum
camera.position.z = 15
这假设您的对象位于与XY平面平行的某个平面中,并且相机的位置与Z轴平行(默认情况下)。
这是在XY平面中显示小网格和椭圆的codepen。在鼠标按下时,相机将缩放到椭圆,在鼠标上,它将恢复到原来的状态:
答案 1 :(得分:0)
正交相机的定义包括实际定义相机边界的left
,right
,top
,bottom
平截头体平面。因此,您需要将对象的边界框与相机的边界相匹配。对象的x-axis
边界框的长度应小于或等于right-left
,并且对象的y-axis
边界框的长度应小于或等于{{1} }。
如果按照这些长度的比例缩放对象,则对象应该适合您的相机。