three.js - 三.js/WebGL 使透视相机缩小直到所有物体都可见
问题描述
我有一个滑块控制要显示的一行中的项目数,每个都是 w 单位宽和 d 单位高,最终,它们会离开屏幕,我如何动态缩放以便
A)所有项目跨越特定数量的单位 B)所有项目跨越特定数量的像素(使其响应)
我尝试使用此处的代码: https ://discourse.threejs.org/t/solved-how-do-we-size-something-using-screen-pixels/1177
一种解决方案是迭代场景中的对象,应用平截头体相交,如果不是,则继续缩小。我想不出仍然使用透视相机的非迭代解决方案。
任何帮助表示赞赏。
但它会暴力破解值,其次它在大量时不准确
解决方案
这里有一些代码可能显示了一个解决方案。基本上你可以使用
const box = new THREE.Box3().setFromObject(root);
计算一个包含整个场景或某个子树的框
然后你可以得到盒子的大小和中心
const boxSize = box.getSize(new THREE.Vector3()).length();
const boxCenter = box.getCenter(new THREE.Vector3());
然后你可以计算出你需要把相机从盒子的中心放多远才能适应屏幕
const halfSizeToFitOnScreen = boxSize * 0.5;
const halfFovY = THREE.Math.degToRad(camera.fov * .5);
const distance = halfSizeToFitOnScreen / Math.tan(halfFovY);
distance
现在您需要如何将相机远离盒子的中心才能查看整个盒子。(或者更确切地说,让盒子的中心适合屏幕)。有一个点距离一个点的球体,所以你可以选择一个。例如 boxCenter + [0, 0, distance] 会将相机从盒子中心放在 z 轴下方。
推荐阅读
- python - 无法导航到按钮(网页抓取) - selenium.common.exceptions.NoSuchElementException:消息:没有这样的元素:无法找到元素
- mysql - 为什么输入没有发送到请求?
- c# - EF Core - 重新创建单个表
- python - 如何从一维纬度值绘制特定坐标点的 pcolormesh 而不是网格网格
- javascript - 初始化后中风随机化变化
- python - 对于矩阵的循环定义?
- reactjs - 未找到模块
- php - AES-128 OFB 使用 mcrypt (PHP) 和 pycryptodome (Python) 不同
- sql - 如何在只有一个属性并共享相同外键的 2 个表中插入必然不同的值?
- java - 添加值和数组长度的难度