Я ищу способ растянуть геометрию (со всеми вершинами z = 0) на видимый экран (HTML Элемент холста).
На данный момент я разработал, как подогнать геометрию к экрану, например:
со следующим кодом, который в основном настраивает camera.z для подгонки геометрии к высоте холста.
geometry.computeBoundingBox();
const bbox = geometry.boundingBox;
const geometryCenter = bbox.getCenter(new THREE.Vector3());
const geometrySize = bbox.getSize(new THREE.Vector3())
const cameraZ = getZFromGeometrySize(camera.fov, geometrySize);
const scale = getScaleFromZ(height, camera.fov, cameraZ);
const zoomTransform = d3.zoomIdentity
.translate(width * 0.5, height * 0.5)
.scale(scale);
zoom.transform(canvasSelection, zoomTransform);
camera.position.set(geometryCenter.x, geometryCenter.y, cameraZ)
camera.updateProjectionMatrix();
с приведенными ниже определениями функций:
function getZFromGeometrySize(fov, geometrySize) {
const maxSize = Math.max( geometrySize.x, geometrySize.y );
const halfFOVRadians = toRadians(fov * 0.5);
return maxSize / ( 2 * Math.tan( halfFOVRadians ) );
}
function getScaleFromZ (height, fov, z) {
const halfFOVRadians = toRadians(fov * 0.5);
return height / (2 * Math.tan(halfFOVRadians) * z);
}
Однако это использует положение камеры, поэтому геометрия будет соответствовать виду. Тем не менее, я ищу способ растянуть геометрию, чтобы ее ограничивающая рамка точно вписывалась в экран, в идеале с некоторыми предопределенными отступами. Поскольку это не связано с настройками камеры, мне нужно манипулировать значениями геометрических вершин, чтобы растянуть его по горизонтали. Как этого добиться? Я хочу сохранить значения вершин, поскольку они относятся к базовым данным.
Я предполагаю, что это должно быть функцией размеров холста (ширина, высота), геометрических координат и настроек камеры, возвращающих новые геометрические координаты? Любая подсказка приветствуется.