计算轴对齐网格的一个单元格投影到屏幕上一个像素的距离

Computing the distance at which one cell of an axis aligned grid projects to one pixel on screen

给定 3D 场景中 X/Y 平面(世界 space)中轴对齐的均匀网格,以及从特定位置和方向观察该网格的虚拟相机。我如何计算我需要沿着它的视线移动相机的距离,以便将其中一个网格单元投影到屏幕上的一个像素上(填充一个屏幕像素)?相机投影参数(视野、近远裁剪平面)和屏幕的宽高已知

此基本距离将用于确定 rendering/raycasting 高度图(高程值的统一网格)的详细程度。我尝试实现的算法在 Tevs 等人于 2008 年发表的论文“Maximum Mipmaps for Fast, Accurate, and Scalable Dynamic Height Field Rendering”中有所描述(参见第 3.3 节)。在光线投射过程中,将相机与光线交点之间的当前距离与基本距离进行比较。如果当前距离小于基本距离,则渲染更高级别的细节(较低的 mipmap 级别)。如果当前距离大于基本距离,则呈现较低级别的细节(较高的 mipmap 级别)。

您可以脱离单元格的“屏幕Space几何错误”。这是一种启发式方法,用于计算球体在屏幕上的透视投影的“误差”。根据启发式,当包围几何体的球体高度(以像素为单位)即投影在屏幕上的透视图大于公差时,您需要增加几何体的细节级别。

球体的几何误差计算公式如下:

err_s = (diam_s / dist_s) * yres / (2.0 * tan(fov/2.0))

其中 err_s 是投射在屏幕上的球体的垂直像素数,diam_s 是球体的直径(每个球体都是常数),dist_s是从球体中心到相机的欧氏距离,y_res 是以像素为单位的垂直屏幕分辨率,fov 是以弧度为单位的相机视野。

因为您已经知道 err_s(1 个像素)的值,您可以通过以下方式计算 dist_s

dist_s = (diam_s / err_s) * yres / (2.0 * tan(fov/2.0))

同样,这是一种启发式近似(当球体投影在屏幕中央时更准确),但效果很好。