我有一个相机正在看的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实际上是常数我的目的)。
答案 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 );
立方体高度将与可见高度匹配。
在任何一种情况下,如果相机没有居中,或者以某个角度观察立方体,那么问题就更复杂了。
另外,如果窗口比它高,那么宽度是约束因素,问题就更复杂了。