我正在为我的场景使用正交投影glOrtho。我实现了一个虚拟轨迹球来旋转对象,我还在视图矩阵上实现了放大/缩小。假设我有一个100个单位的立方体,位于远离原点的(0,-40000,0)位置。如果旋转中心位于原点,一旦用户旋转立方体并放大或缩小后,它可能位于某些位置(0,0,2500000)(此位置只是一个假设,它是在乘以后计算的通过视图矩阵)。目前我定义了一个非常大范围的近(-150000)和远(150000)平面,但有时候对象仍然位于近或远平面之外,如果我定义一个更大的近和远剪裁,对象只是变得不可见平面说-1000000和1000000,它会产生一个不合理的z文物。所以我的问题是当用户实时旋转物体时,如何正确计算近距离和远距离平面?提前谢谢!
更新: 我已经为立方体实现了一个边界球体。我使用视图矩阵的逆来计算摄像机位置并计算摄像机位置距边界球体中心的距离(边界球体的中心由视图矩阵变换)。但我无法让它发挥作用。你能进一步解释相机位置和近平面之间的关系吗?
答案 0 :(得分:0)
一种简单的方法是使用“边界球”。如果您知道数据边界框,则最大对角线长度是边界球体的直径。
假设你计算从摄像机位置到球体中心的距离'dCC'。让'r'表示该球体的半径。然后:
Near = dCC - r - smallMargin
Far = dCC + r + smallMargin
'smallMargin'是一个值,用于避免由于数值精度问题而在球体表面上产生剪切点。
球体的中心应该是旋转的中心。如果没有,直径应该增大,以涵盖所有数据。