调整相机以获得可见的Three.js形状

时间:2012-06-30 13:17:15

标签: javascript three.js

我有一个相机正在看的CubeGeometry,我希望相机可以放大,这样立方体就完全可见,但不会更大。

我最初的尝试是将立方体顶点转换为相机坐标系

function toScreenXY(position, camera) {
  var pos = position.clone();
  var projScreenMat = new THREE.Matrix4();
  projScreenMat.multiply(camera.projectionMatrix, camera.matrixWorldInverse);
  projScreenMat.multiplyVector3( pos );

  return pos;
}
function ScaleInView() {
  camera.fov = 0.0;
  for (var i=0; i<8; i++) {
    proj2d = toScreenXY(cube.geometry.vertices[i],camera);
    angle = 57.296 * Math.max(Math.atan(proj2d.x/proj2d.z), Math.atan(proj2d.y/proj2d.z));
    camera.fov = Math.max(camera.fov,angle);
  }
  camera.updateProjectionMatrix();
}

我认为这样可行,但有时它太小了,有时太大(取决于相机的位置)。

我还需要为正射相机做这件事。

修改 我知道当立方体面向相机时如何做到这一点,当相机移动到某个任意(r,theta,phi)位置时,我正在寻找一种方法(球面极坐标; r实际上是常数我的目的)。

1 个答案:

答案 0 :(得分:4)

透视相机。如果摄像机居中并正面观看立方体,请定义

dist =从相机到立方体的正面(重要!)的距离

height =立方体的高度。

如果您按如下方式设置摄像机视野

fov = 2 * Math.atan( height / ( 2 * dist ) ) * ( 180 / Math.PI );

然后立方体高度将与可见高度匹配。

正交相机。如果摄像机居中并正面观看立方体,请定义

aspect =窗口的宽高比(即宽度/高度)

height =立方体的高度。

然后以这种方式构建你的相机:

camera = new THREE.OrthographicCamera( -aspect * height/2, aspect * height/2, height/2, -height/2, near, far );

立方体高度将与可见高度匹配。

在任何一种情况下,如果相机没有居中,或者以某个角度观察立方体,那么问题就更复杂了。

另外,如果窗口比它高,那么宽度是约束因素,问题就更复杂了。