4

オブジェクトをカメラ錐台内に収めようとしています。そのためのすべての三角法を調べました。これが私が使用したコードです。

var setupCamera = function() {
    aspectRatio = window.innerWidth / window.innerHeight
    camera = new THREE.PerspectiveCamera( 45, aspectRatio, 1, 10000 );
    scene.add(camera);
}

var updateCamera = function() {
    var height = mesh1_BB.max.y;

    var width = mesh1_BB.max.x - mesh1_BB.min.x;
    var vertical_FOV = camera.fov * (Math.PI/ 180);

    var max_z = mesh1_BB.max.z;

    var horizontal_FOV = 2 * Math.atan (Math.tan (vertical_FOV/2) * aspectRatio);

    var distance_vertical = height / (2 * Math.tan(vertical_FOV/2));
    // alert ('vertical' + distance_vertical);
    var distance_horizontal = width / (2 * Math.tan(horizontal_FOV/2));
    // alert ('horizontal' + distance_horizontal);
    var z_distance = distance_vertical >= distance_horizontal? distance_vertical : distance_horizontal;

    camera.position.z = z_distance + max_z;
    camera.position.y = 0 ;
    camera.position.x = 0;
}

カメラ距離の計算は正しいと思いますが、これは私が得た結果です: ここに画像の説明を入力

私は問題がカメラの y 位置を変更していると考え、camera.position.y = height; でそれを立てました。しかし、これは私が得るものです:

ここに画像の説明を入力

私が望む結果は次のとおりです(これは、マウスの右クリックボタンでパンし、キャンバスフレーム全体に収まるまでドラッグして得たものです): ここに画像の説明を入力

これは一日中私を夢中にさせていたので、あなたがこれを手伝ってくれることを本当に願っています;-)

どうもありがとう!

4

1 に答える 1

1

私はあなたの距離計算をチェックしていませんが、オブジェクトが 0 を中心に垂直に配置されていない間、 z 軸をまっすぐ見下ろしています。atを入力すると、それが修正camera.ymesh1_BB.max.y / 2れるはずです。

カメラを動かしたくない場合は、少なくともオブジェクトの実際の中心に向けてください。その場合、(軸を揃えた) バウンディング ボックスを使用することは、もはや 100% 正しくありません。

于 2014-08-18T17:02:13.650 に答える