我有兴趣开发一个简单的“谷歌地球”类型的应用程序(用于叠加我的自有信息,而不是谷歌那样海量的数据)。我希望它只是一个简单的X11应用程序,可以射线追踪带有位移(地形)信息的球体。射线-球体相交很简单,但当加入位移映射时,我的思路开始变得混乱。
我想知道是否有一种简单的技术可以扩展基本的射线-球体相交以包括位移数据...
我有兴趣开发一个简单的“谷歌地球”类型的应用程序(用于叠加我的自有信息,而不是谷歌那样海量的数据)。我希望它只是一个简单的X11应用程序,可以射线追踪带有位移(地形)信息的球体。射线-球体相交很简单,但当加入位移映射时,我的思路开始变得混乱。
我想知道是否有一种简单的技术可以扩展基本的射线-球体相交以包括位移数据...
我知道距离第一篇文章已经过去了12年,但是我在这里上传了一个完整的解决方案: https://github.com/ramakarl/just_math
请查看math_displace_sphere样例。它可以在任意细节上对位移球体地形进行光线追踪,而不需要任何网格。代码纯CPU,可以移植到着色器/GPU。采用MIT许可证。
解决方案是沿着射线行进,同时将射线样本点投影回纬度和经度,并对地形纹理进行采样,以确定该样本的位移高度。高度相对于球体中心指定。
伪代码:
for ( ; ray_hgt >= terrain_hgt && ray_hgt <= shell_hgt; ) {
sample += ray_dir * dt;
ray_hgt = (sample - sphere_center).Length();
// given sample, compute surface_pnt and lat, long
ComputeSphereUV ( sample, surface_pnt, lat, long );
pixel_val = terrain_map->GetPixelUV ( lat, long ).x;
terrain_hgt = sphere_radius + pixel_val * terrain_depth;
}
无论您使用简单的 20 个多边形球体还是复杂的具有 2k 个多边形的球体,光线追踪过程都是相同的。射线在场景中穿行,无论它包含什么。但是,它用于实现视觉效果,例如透明度、反射、折射等。根据您在问题中提到的内容,我认为您的项目可能没有这些功能。在这里,您很可能可以使用简单的低成本射线投射。
因此,一旦您放置了渲染引擎,就可以向场景添加所有位移量。修改几何形状最常用的两种方式是:
位移映射会在现有几何体上添加真实的多边形,而凹凸贴图仅通过弯曲表面法线来模拟视觉效果,从而影响物体的阴影。虽然弯曲法线比细分几何体并添加新多边形要快得多且成本更低,但它不能产生精确的阴影结果,因此如果这对您的应用程序很重要,请注意。
此外,考虑使用自适应细节级别算法和数据结构,因为距离几何体越远,所需的细节就越少。