显示范围算法?

时间:2013-02-14 21:24:00

标签: javascript algorithm graphics rendering three.js

OH伟大且知识渊博的Stack Overflow,我谦卑地请求你的伟大思想帮助...

我正在使用三个js库,我需要实现一个'show extents'按钮。它会将摄像机移动到一个位置,使得世界上的所有物体在摄像机视图中都可见(因为它们当然没有被遮挡)。

我可以找到世界上所有物体的边界框,比如它们是w0x,w0y,w0z和w1x,w1y,w1z

在给定这些边界的情况下,如何放置相机使其能够清晰地看到盒子的边缘?

显然必须选择一个“侧面”来查看......我用谷歌搜索算法无济于事! 谢谢!

1 个答案:

答案 0 :(得分:1)

所以我们说你已经选了一张脸。并且您正在选择摄像机位置,以便摄像机的视线与其中一个轴平行。

假设脸部有一定的宽度,“w”,让我们说你的相机有一个水平的视野“a”。你要弄清楚的是距离是什么距离,相机应该看到整个宽度的距离是从脸部中心“d”。

如果你画出来,你会看到你基本上有一个等腰三角形,其底边长度为w,顶角为a。

isoceles triangle

不仅如此,顶角的角平分线形成两个相同的直角三角形,它的长度(到底部)是我们需要弄清楚的距离。

Trig告诉我们,角度的正切是三角形的相对边和相邻边的比率。所以

tan(a/2) = (w/2) / d

简化为:

d = w / 2*tan(a/2)

因此,如果您将相机与某个边界框面相距一定距离,则只需沿所选轴移动d距离即可。

一些警告,请确保您使用弧度来进行javascript trig功能输入。此外,您可能需要再次针对您的脸部高度和相机的垂直视野进行计算,如果您的脸部不是正方形,则需要选择更远的距离。

如果你想从任意角度拟合边界框,你可以使用相同的想法 - 但首先你必须找到投影到垂直于相机视线的平面上的场景的(对齐的)边界框