我需要最快的球体映射算法。就像布雷森汉姆的线条画一样
类似我在Star Control 2(旋转行星)中看到的实现。
是否有任何已经发明和/或实现的技术?
我真的不想重新发明自行车。请帮忙......
问题描述。
我在2D表面上有一个球体必须出现的位置。球体(让它成为地球)必须使用精细地图进行纹理化,并且必须具有自由缩放和旋转的能力。我想用地图或坐标的一些简单变换函数来实现它:球体的2D图像上的每个像素被定义为来自球体的圆柱形图的多个像素。这使我能够实现所得图像的抗锯齿。此外,我考虑使用mipmaps实现映射,如果结果图片上的一个像素对应于原始地图上的多个像素(例如,靠近球体的两极)。在内心深处,我觉得这可以用一些琐碎的数学来实现。但所有这些想法都只是我的想法。
这个问题与此问题有点相关:Textured spheres without strong distortion,但我的问题没有答案。
UPD:我想我没有硬件支持。我希望有一个跨平台的解决方案。
答案 0 :(得分:2)
执行此类映射的标准方法是立方体贴图:将球体投影到立方体的6个边上。现代显卡在硬件层面支持这种纹理,包括全纹理过滤;我相信也支持mipmapping。
另一种方法(硬件没有明确支持,但可以通过程序着色器以合理的性能实现)是抛物线映射,它将球体投射到两个相对的抛物线上(每个抛物线都映射到一个圆圈中)。中间的方形纹理)。抛物线投影不是投影变换,因此您需要“手动”处理数学。
在这两种情况下,失真都受到严格限制。由于硬件支持,我推荐立方体贴图。
答案 1 :(得分:2)
答案 2 :(得分:1)
我是StarconII的忠实粉丝,不幸的是我不记得行星绘图的细节......
第一个选项是对球体进行三角测量并使用标准3D多边形绘制球体。就经典性而言,这有一定的弱点,但它使用了可用的硬件加速,并且可以看起来相当不错。
如果你想自己动手,你可以自己光栅化它。 Foley,van Dam等人的计算机图形学 - 原理与实践有一章关于Bresenham式算法;你想要“Scan Converting Ellipses”这一部分。
对于我在之前的评论中建议的点云概念:通过预先选择和存储表面点的(x,y,z)坐标而不是2D地图,可以避免运行时参数化问题。我正在考虑将球体上的点位置部分随机化,以便在转换(向前,向后,无论8 ^)到屏幕时它们不会导致结构化别名。在缺点方面,你必须处理“填充”因素 - 在绘制颜色时总结颜色,然后除以点数。呃,你也有问题,如果 没有积分该怎么办;例如,如果你想用极端放大率进行放大,那么在这种情况下,你需要做一些事情,比如寻找最近的点。
答案 3 :(得分:1)
您是否看过Jim Blinn的文章“How to draw a sphere”?我无法访问完整的文章,但它看起来就像你需要的那样。