哦,伟大而博学的堆栈溢出,我谦卑地请求您伟大的心灵帮助。。。
我正在使用三个js库,我需要实现一个“show extents”按钮。它会将相机移动到一个位置,这样世界上的所有对象都可以在相机视图中看到(当然前提是它们没有被遮挡)。
我可以找到世界上所有物体的边界框,比如w0x,w0y,w0z和w1x,w1y,w1z
我怎样才能,给这些边界,放置相机,这样它将有一个清晰的视野框的边缘?
显然,必须有一个'侧'选择从…我已经搜索了一个算法没有用!
谢谢!

最佳答案

所以说你选了一张脸你要选择一个摄像机位置,使摄像机的视线与其中一个轴平行。
假设脸部有一定的宽度“w”,假设你的相机有一个水平视野“a”你想知道的是,距离脸部中心的距离是多少,“d”,相机应该看到整个宽度。
如果你把它画出来,你会看到你基本上有一个等腰三角形,它的底部是长度w,顶点是角度a。
不仅如此,顶点角的角平分线形成两个相同的直角三角形,它的长度(到底部)是我们需要计算的距离。
trig告诉我们一个角的正切是这个三角形的后点和相邻边的比值。所以

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

简化为:
d = w / 2*tan(a/2)

因此,如果你把相机与你的包围盒面中的一个轴对齐的距离放置,那么你只需要沿着选择的轴移动D距离。
一些注意事项,请确保对javascript trig函数输入使用弧度。另外,如果你的脸不是正方形的,你可能需要再次计算你的脸的高度和相机的垂直视野,并选择更远的距离。
如果要从任意角度拟合边界框,可以使用相同的想法,但首先必须找到投影到垂直于摄影机视线的平面上的场景的(对齐的)边界框

07-26 00:48