2016-10-18 15 views
0

モデル全体がビューポートで囲まれるように、メッシュのコレクションであるobject3Dからカメラがどのくらい離れている必要があるかを調べようとしています。Three.jsはobject3Dのサイズに基づいてカメラの距離を決定します

私はこのようなobject3Dサイズ取得:私はカメラが見えるように全体のボックスのために、そのボックスのサイズに基づいてする必要がどこまで戻って決定する試みでtrigの使用

public getObjectSize (target: THREE.Object3D): Size { 
    let box: THREE.Box3 = new THREE.Box3().setFromObject(target); 
    let size: Size = { 
    depth: (-1 * box.min.z) + box.max.z, 
    height: (-1 * box.min.y) + box.max.y, 
    width: (-1 * box.min.x) + box.max.x 
    }; 
    return size; 
} 

次へ。

private determinCameraDistance(): number { 
    let cameraDistance: number; 
    let halfFOVInRadians: number = this.geometryService.getRadians(this.FOV/2); 
    let height: number = this.productModelSizeService.getObjectSize(this.viewService.primaryView.scene).height; 
    let width: number = this.productModelSizeService.getObjectSize(this.viewService.primaryView.scene).width; 
    cameraDistance = ((width/2)/Math.tan(halfHorizontalFOVInRadians)); 
    return cameraDistance; 
} 

数学すべてが紙に動作し、三角形(カメラ距離)の隣接する辺の長さが^ 2 + B^2 = C^2を用いて検証することができます。しかし何らかの理由で返される距離は10.4204ですが、カメラの距離はオブジェクト3D全体が実際には95(ハードコーディング値で決定される)であることを示す必要があり、その結果、私のモデルのわずかな部分しか見ることができません。

私が間違っていると思われることに関するアイデア、またはこれを判断するためのより良い方法。

FOV = 110 degrees, 
Object3D size: { 
    Depth: 11.6224, 
    Height: 18.4, 
    Width: 29.7638 
} 

だから我々は半分を取る:カメラの距離単位にボックスのサイジングユニットからの計算に使用

実際の数字を行くとき、私は欠けている単位変換のいくつかの種類があるように私には思えますカメラの距離に沿って配置された隣接する辺、つまり55度の直角三角形を作成するための視界。次に、式Degrees * PI/180を使用して、55度をラジアン相当の.9599に変換します。次にobject3Dの幅の半分をもう一度取って直角三角形を作成します。これは14.8819です。私たちは今半分の幅をとり、FOV(ラジアン単位)の正接で割ることができます。これは、隣接するサイド/カメラ距離の長さを10.4204にします。

我々はさらに、これは私が再びSOHCAHTOAを使用して斜辺の長さを取得します。この辺の正しい長さであることを確認することができます

Sin(55) = 14.8819/y 
.8192 * y = 14.8819 
y = 14.8819/.8192 
y = 18.1664 

今すぐチェックするためにBのために、我々はピタゴラスの定理を使用することができ、これを使用して解決します私たちの数学。

14.8819^2 + b^2 = 18.1664^2 
221.4709 + b^2 = 330.0018 
b^2 = 108.5835 
b = 10.4203 (we're off by .0001 but that's due to rounding) 

答えて

0

この問題は、THREE.js視野が垂直視野を表すことになりました。私は、Mayaや他のアプリケーションのような3つは、Field of Viewを水平表示領域として使用すると仮定していました。

アスペクト比で取得したFOVを掛け合わせると正しい水平視野が得られ、カメラの距離は約92になります。

+0

OpenGLでは、FOVは常に垂直ビュー領域を表します。投影行列を生成する必要がある。 –