【发布时间】:2014-08-17 17:03:33
【问题描述】:
我有一个透视相机,用于查看由地球模型组成的 3D 场景。地球模型是椭球体。我想根据模型上的某个边界框来概述这个模型,即基本上我想对这个 3D 模型做一个简单的 2D 概述。我想为此计算相机距离。
我实际上是在开放场景图中执行此操作,因此我可以获得所需场景/区域的 osg::BoundingBox。
我正在使用一种非常简单的方法来计算距离。
distanceVertical = ((boundingBox.yMax - boundingBox.ymin)/2.0)/ tan(fovy/2)
distanceHorizontal = ((boundingBox.xMax - boundingBox.xmin)/2.0)/ tan(fovx/2)
cameraDistance = max(distanceVertical, distanceHorizontal)
这个计算都是在世界空间中进行的,但不知怎的,它并没有给我正确的距离。我算错了吗?
【问题讨论】:
-
什么距离错了?根据您提供的代码和我所记得的,distanceVertical 应该给您一个正确的值,假设 fovy 是您给相机的弧度版本,而 distanceHorizontal 应该是错误的。
-
您的相机轴对齐是否像您的边界框?你给的 setProjectionMatrixAsPerspective 的值是多少?你的计算的输入和结果是什么,你期望什么(“它没有给我正确的距离”很模糊)?
-
@AlexandreVaillancourt 我最终尝试的是 1)从 (0,0,1) - z 轴到我的边界框中心生成一个旋转矩阵。 2)使用这个旋转矩阵旋转我原来的边界框的所有八个角。 3) 通过找到这些旋转点的 x,y,z 的最小值和最大值来计算一个新的边界框 4) cameraDistance1 = ((newbb.xmax - newbb.xmin)/2)/tan(fov/2) and cameraDistance2 = ((newbb.ymax - newbb.ymin)/2)/(tan(fov/2)xaspectRatio) 和 cameraDistance = max(cameraDistance1, cameraDistance2)。
-
@AlexandreVaillancourt 我不明白为什么我必须为 cameraDistance2 使用纵横比?我期望 cameraDistance 沿 x 而不是沿 y 的 aspectRatio ......但这个计算似乎有效!
-
纵横比与fovy角度无关,它是相对于“height”相对于所述fovy角度。这就是为什么您必须相对于“距离”高度而不是 fovy 角度来计算 fovx。
标签: opengl math graphics geometry openscenegraph