如何使用OrthographicCamera将对象装入threejs中的相机?

时间:2017-03-17 18:57:19

标签: three.js

我找到了很多解决方案,但它只能适用于PerspectiveCamera,因为OrthographicCamera没有fov。 有没有解决方案?

2 个答案:

答案 0 :(得分:3)

正如@gaitat所说,使用THREE.OrthographicCamera,您需要调整它的平截头体尺寸以适合您想要放大的对象的大小。

直截了当的做法是使用geometry.boundingSphere并基于此设置相机topleftbottomup。更容易做的是使用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()

这会将缩放级别设置为使对象(在这种情况下为椭圆)完全适合您的相机的截头体。

然而,您还必须通过以下任一方式将相机置于对象中心:

  • 旋转摄像机以指向boundingSphere中心
  • 翻译相机,使边界中心最终落在相机的平截头轴上

由于翻译相机更容易做到这两者,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。在鼠标按下时,相机将缩放到椭圆,在鼠标上,它将恢复到原来的状态:

https://codepen.io/anon/pen/aJEzew

答案 1 :(得分:0)

正交相机的定义包括实际定义相机边界的leftrighttopbottom平截头体平面。因此,您需要将对象的边界框与相机的边界相匹配。对象的x-axis边界框的长度应小于或等于right-left,并且对象的y-axis边界框的长度应小于或等于{{1} }。

如果按照这些长度的比例缩放对象,则对象应该适合您的相机。