2012-06-30 45 views
5

我有一個相機正在查看的CubeGeometry,並且我希望相機縮放以便該立方體完全可見,但不會更大。調整相機的可見Three.js形狀

我最初的嘗試是立方體verticies轉換到攝像機座標系,

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,θ,Φ)位置(球形極座標; r對我而言實際上是恆定的)。

回答

2

乘以camera.matrixWorldInverse給出相機座標中的矢量,但重要的是不適用透視。

function toCameraCoords(position) { 
    return camera.matrixWorldInverse.multiplyVector3(position.clone()); 
} 

我們可以找到適合場景中所有盒子角落的最小角度。 arctan(D.x/D.z)給出角度BCD,其中B是相機正在看什麼,C是相機的位置,D是想要在相機座標中可見的物體的位置。

就我而言,以下內容可確保立方體邊界框完全可見。

function ScaleInView() { 
    var tmp_fov = 0.0; 

    for (var i=0; i<8; i++) { 
    proj2d = toCameraCoords(boundbox.geometry.vertices[i]); 

    angle = 114.59 * Math.max(// 2 * (Pi/180) 
     Math.abs(Math.atan(proj2d.x/proj2d.z)/camera.aspect), 
     Math.abs(Math.atan(proj2d.y/proj2d.z)) 
    ); 
    tmp_fov = Math.max(tmp_fov, angle); 
} 

camera.fov = tmp_fov + 5; // An extra 5 degrees keeps all lines visible 
camera.updateProjectionMatrix(); 
} 
3

透視攝像機。如果攝像機中心和觀看立方體正面,定義從照相機

dist =距離到正面(重要)的立方體的

height =的高度立方體。

如果將相機領域的視圖如下

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

那麼立方體的高度將匹配可見高度。

Orthographic Camera。如果攝像機中心和觀看立方體正面,定義

aspect =你的窗口(即,寬度/高度)立方體的

height =高度的縱橫比。

然後構建你的相機是這樣的:

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

立方體高度將匹配可見高度。

在任何一種情況下,如果相機未居中,或以其他角度觀看立方體,則問題會更加複雜。另外,如果窗口比高度窄,那麼寬度是約束因素,問題就更復雜。

+0

我應該在我原來的問題中更加清楚。我想要做的是當相機在立方體周圍旋轉時自動放大或縮小。也就是說,它在一個角度觀察立方體時。我編輯了這個問題來澄清這一點。 – sn6uv

+0

如何找到立方體的高度?是通過計算邊界框嗎?我們將在相機初始化後獲取模型的邊界框。 –