如何拉伸几何体使其边界框正好适合 Three.js 中的屏幕
How to stretch geometry so its bounding box fits precisely the screen in Three.js
我正在寻找将几何图形(所有顶点 z = 0)拉伸到可见屏幕(HTML Canvas 元素)的方法。
现在我已经弄清楚了如何使几何图形适合屏幕,如下所示:
使用以下代码基本上调整 camera.z 使几何体适合 canvas 的高度。
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);
}
然而,这是使用相机位置,因此几何图形将适合视图。但是,我正在寻找 拉伸 几何形状的方法,以便其边界框精确适合屏幕,最好使用一些预定义的填充。
由于这与相机设置无关,我需要操纵几何顶点值以水平拉伸它。如何做到这一点?我想保留与基础数据相关的顶点值。
我假设这需要是 canvas 维度(宽度、高度)、几何坐标和返回新几何坐标的相机设置的函数?任何提示表示赞赏。
这个问题的简短回答是:将相机的宽高比设置为 1.0。
如果几何边界在剪辑 space 中已经 [-1, 1 ],这将起作用。如果不是,则必须先将它们转换为剪辑 space。
我正在寻找将几何图形(所有顶点 z = 0)拉伸到可见屏幕(HTML Canvas 元素)的方法。
现在我已经弄清楚了如何使几何图形适合屏幕,如下所示:
使用以下代码基本上调整 camera.z 使几何体适合 canvas 的高度。
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);
}
然而,这是使用相机位置,因此几何图形将适合视图。但是,我正在寻找 拉伸 几何形状的方法,以便其边界框精确适合屏幕,最好使用一些预定义的填充。 由于这与相机设置无关,我需要操纵几何顶点值以水平拉伸它。如何做到这一点?我想保留与基础数据相关的顶点值。
我假设这需要是 canvas 维度(宽度、高度)、几何坐标和返回新几何坐标的相机设置的函数?任何提示表示赞赏。
这个问题的简短回答是:将相机的宽高比设置为 1.0。
如果几何边界在剪辑 space 中已经 [-1, 1 ],这将起作用。如果不是,则必须先将它们转换为剪辑 space。