Как разместить все целевые объекты в поле зрения камеры Orthographi c - PullRequest
0 голосов
/ 09 февраля 2020

У меня есть несколько объектов (z-координаты можно игнорировать) в мире, и Orthographi c камера , инициализированная с фиксированными параметрами (слева, справа, сверху, снизу рядом, далеко). Я хочу, чтобы все выбранные объекты были видны с приблизительной изометрии c для камеры, поэтому я выбрал нормализованный вектор (0.5, 0.5, 0.707) в качестве forward (см. Также переднюю ось на Размещение камеры: направление LookAt ) камеры, а затем вычислили проекцию на плоскость, вектор нормали которой является нормализованным вектором forward. Я вычислил масштабное значение между нормализованной плоскостью обзора и целевым боксом, а затем положил камеру и установил ее в правильное положение.

Однако я рассчитал результат пересчета. Так что не так? Как мне реализовать точку зрения isometri c, используя THREE. js?

    const viewWidth = window.innerWidth, viewHeight = window.innerHeight;
    // https://github.com/mrdoob/three.js/blob/master/examples/webgl_camera.html
    //https://stackoverflow.com/questions/10716632/camera-arguments-in-three-js
    //https://www.script-tutorials.com/webgl-with-three-js-lesson-9/ https://docs.unity3d.com/ScriptReference/Transform.LookAt.html

    //predefines the world space direction in which the camera is looking. Camera.getWorldDirection
    const forwardDirection = new THREE.Vector3(0.5, 0.5, 0.707);
    const objectSizes = bboxMap.getSize();
    console.log('objectSizes', objectSizes);
    //https://gamedev.stackexchange.com/questions/43588/how-to-rotate-camera-centered-around-the-cameras-position
    //https://threejs.org/docs/#api/en/cameras/PerspectiveCamera
    //camera = new THREE.PerspectiveCamera(45, viewWidth / viewHeight, 0.1, 10000); //VIEW_ANGLE, ASPECT, NEAR, FAR
    camera = new THREE.OrthographicCamera(viewWidth / -2, viewHeight / 2, viewWidth / 2, viewHeight / -2, 10, 1000);
    //camera.position.copy(centerPoint); camera.position.z = 800; the camera starts at 0,0,0 so pull it back
    //https://answers.unity.com/questions/799656/how-to-keep-an-object-within-the-camera-view.html
    //https://www.studica.com/blog/isometric-camera-unity
    //https://www.zhihu.com/question/285948251
    objectSizes.projectOnPlane(forwardDirection);
    const scaleX = viewWidth / objectSizes.x;
    const scaleY = viewHeight / objectSizes.y;
    //camera.position.copy(forwardDirection.multiplyScalar(Math.max(objectSizes.x, objectSizes.y)));
    camera.position.copy(forwardDirection.multiplyScalar(Math.max(scaleX, scaleY)));
    camera.up.set(1, 1, 2); //isometric camera
    camera.lookAt(scene.position); //camera.lookAt(centerPoint) //camera.lookAt(centerPoint.x, centerPoint.y, 0);

консольный журнал:

canvas: 625 375 , screen: 820 706
centerPoint Vector3 {x: 209, y: 65, z: 0} 
Box3 {
  min: Vector3 {x: -11, y: -11, z: -6}
  max: Vector3 {x: 429, y: 141, z: 6}
}
objectSizes Vector3 {x: 440, y: 152, z: 12}

В приведенном ниже примере с использованием 3ds max я могу переместите камеру в фиксированном направлении (0.5, 0.5, 0.707) и поместите этот объект в левое окно видового экрана (обратите внимание на [OrthoCamera] в верхнем левом углу).

Fit all selected objects whith in an isometric camera viewport

...