概述
只將某個物體縮放至整個螢幕, 十分常見的應用場景,這和相機視野有關,需要分透視相機和正交相機來分別說明。
透視相機
首先假定物體被相機視野覆蓋,有如下圖
首先必須知道物體所在的包圍球半徑 r, 其次相機角度是已知的,就是 camera.fov, fov 是角度制資料,簡單根據三角函式可以得出球心到相機的距離 s。
s = r/sin(fov)
使用程式碼來表達就是
const dir = new THREE.Vector3(0, 1, 0); // 方向
const dist = Math.abs(sphere.radius / Math.sin(((fov / 360) * Math.PI) / 2));
const temp = new THREE.Vector3();
temp.addVectors(sphere.center, dir.multiplyScalar(dist));
正交相機
正交相機和剖切很相似,除了 position、rotation 外,使用 left、top、right、bottom 來規定視野範圍
這個更加容易理解,對於螢幕都是矩形的電腦來說,這個縮放將會恰達好處(精確度高,透視相機因為用到了包圍球其實不是很精確)。
const left = -(boundingBox.max.x - boundingBox.min.x) / 2;
const right = (boundingBox.max.x - boundingBox.min.x) / 2;
const top = (boundingBox.max.z - boundingBox.min.z) / 2;
const bottom = -(boundingBox.max.z - boundingBox.min.z) / 2;
const camera = new THREE.OrthographicCamera(left, right, top, bottom, 1, 1000);
camera.lookAt(new THREE.Vector3(0, -100, 0));
用途: 製作小地圖