2012-06-30 8 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); 

を次のようにカメラの視野を設定する場合は、キューブの高さが目に見える高さに一致します。

正書カメラ。カメラが中心とキューブヘッドオンを見ている場合、

aspect

=あなたのウィンドウ(すなわち、幅/高さ)キューブの

height

=高さのアスペクト比を定義します。

次に、あなたのカメラをこのように構築:

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

キューブの高さが目に見える高さに一致します。

いずれの場合でも、カメラが中央にない場合、またはある角度で立方体を見ると、問題はより複雑になります。

また、ウィンドウが幅よりも狭い場合は、幅が制約要因になり、問題はより複雑になります。

+0

私の元の質問ではっきりしていたはずです。私がしようとしていることは、カメラがキューブの周りを回転するときに自動的にズームインまたはズームアウトすることです。つまり、キューブをある角度から見ているときです。私はこれを明確にするために質問を編集しました。 – sn6uv

+0

どのように立方体の高さを見つけることができますか?バウンディングボックスを計算することですか?カメラの初期化後にモデルのバウンディングボックスを取得します。 –

関連する問題