Как правильно переключить перспективную камеру и ортогональную? - PullRequest
1 голос
/ 18 марта 2020

Моя проблема сейчас в том, что когда я переключаюсь с ортогональной камеры на перспективную, я не всегда могу правильно рассчитать положение камеры. Вот мой код:

function toPerspective() {
        var fov_y = 60;
        var depht_s = Math.tan(fov_y / 2.0 * Math.PI / 180.0) * 2.0;
        var size_y = cameraOrtho.top * 2;
        var Z = size_y / depht_s;
        var normal = cameraPerspective.position.normalize();
        cameraPerspective.position.copy(normal.multiplyScalar(Z));
        //controls.update();
        cameraPerspective.updateProjectionMatrix();

    };
function toOrthographic() {

        var fov_y = 60;
        var depht_s = Math.tan(fov_y / 2.0 * Math.PI / 180.0) * 2.0;
        var Z = activeCamera.position.distanceTo(controls.target);
        var size_y = depht_s * Z;
        var size_x = depht_s * Z * aspect;

        cameraOrtho.left = -size_x / 2;
        cameraOrtho.right = size_x / 2;
        cameraOrtho.top = size_y / 2;
        cameraOrtho.bottom = -size_y / 2;
        cameraOrtho.zoom = 1;
        //cameraOrtho.updateProjectionMatrix();
    };
function onKeyDown(event) {

        switch (event.keyCode) {
            case 79: /*O*/
                if (type === "Ortho") return;

                var old = controls.target.clone();
                cameraOrtho.position.copy(cameraPerspective.position);
                activeCamera = cameraOrtho;
                controls.object = activeCamera;
                toOrthographic();
                controls.update();
                activeCamera.updateProjectionMatrix();
                type = "Ortho"
                break;

            case 80: /*P*/
                if (type === "Perspective") return;
                var old = controls.target.clone();
                cameraPerspective.position.copy(cameraOrtho.position);
                activeCamera = cameraPerspective;
                controls.object = activeCamera;
                toPerspective();
                controls.update();
                activeCamera.updateProjectionMatrix();
                type = "Perspective"
                break;
        }
        console.log(activeCamera);

    }

Переключение перспективы камеры на метод ортогональной камеры по этой ссылке: Как переключаться между камерами Perspective и Orthographi c, сохраняя размер нужного объекта .

С перспективной камерой, используя OrbitControls, чтобы щелкнуть правой кнопкой мыши по Панорамированию, затем переключение на ортогональную камеру снова покажет смещение. Но я не знаю, в чем проблема. Надеюсь, кто-нибудь может мне помочь, спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...