如何渲染无限的宇宙?


15

我很好奇游戏开发行业中渲染3d Universe的最佳做法是什么?

更加具体:

  • 数据点是给定的,并且是静态的。每个点都有位置,颜色和大小。
  • 整个数据集比可用内存大得多。
  • 用户应该能够“放大”以立即看到更大的图片;

最幼稚的方法是将宇宙拆分为多维数据集并仅渲染可见的内容。我不确定在这种情况下应如何实现“缩小”。是否应该为每个可能的缩放级别预先计算多维数据集?也许有更好的方法?

我正在寻找技术不可知的解决方案。


2
您打算要设置某种最大的可视距离,还是要合并一些远点以使您不必单独渲染它们,或者“点”是不透明的并且排列成使得大多数都可以从任何给定的角度隐藏?因为如果以上方法都不成立,我看不出有任何方法可以防止用户找到同时可以看到大多数点(或至少大部分)的摄像机角度。
Ilmari Karonen

4
顺便说一句,有点异国情调,但是您是否考虑过程序生成的数据?您没有自定义制作区域的好处,但是结果是内容基于方程式,而不是大量数据。有了一些创造力,就可以简化很多事情(:
艾伦·沃尔夫

1
放大/缩小infinite universe可能类似于在缩放到不同级别后跟踪某些Mandelbrot曲线上两点之间的关系。在某种程度上,您可能会失去精度,无法区分它们,甚至无法再次找到它们。
user2338816 2015年

1
@AlanWolfe仍然可以进行定制制作-最主要的例子是旧的Frontier游戏,该游戏的真实恒星位置为与Sol最接近的1000颗星左右(包括Sol及其实际的行星和卫星)。您只需确保它们位于未按程序生成的位置,然后将它们添加为另一个“图层”即可。
a安2015年

@IlmariKaronen是的,你是对的。我的视距最大,我想我会按照Ming-Tang的回答合并距离点
Anvaka 2015年

Answers:


8

这是基于我对Celestia的源代码的猜测和掠过。

Celestia使您可以绕行星飞行并缩小以查看整个星系。我浏览了它的源代码,发现它使用了八叉树,一种将空间递归地分成8个八分圆的结构。

渲染器将​​通过遍历八叉树来渲染环境,而不会深入遍历远处的对象。

天体也跟踪八分圆的绝对量,其中八分圆的绝对量基于八分圆内恒星的绝对量。如果八分圆靠近在一起,则Celestia分别渲染星星,如果八分圆远离,则Celestia将八分圆渲染为八分之一星级的一颗恒星。

另外,对象上可能会有有意义的层次结构。例如,如果您离恒星很近(在数据库中声明半径),则将渲染恒星的行星。如果行星足够靠近(屏幕上的像素截止点),则会绘制其3D模型。

我可以命名的其他太空游戏是Orbiter和Kerbal Space Program,它们是封闭源代码。我还查看了Frontier Galaxy,它已通过程序生成了星图。有一个网站通过拆解分析游戏的运行方式:http : //www.jongware.com/galaxy1.html


12

这个难题有很多部分,每一个都会提供一个有趣的深度兔子洞。他们之中有一些是:

  • 细节级别-自动(或“手动”)选择详细或简化的模型,甚至是精灵或仅点,或者对于距离较远的对象。
  • 剔除-选择仅绘制所需内容。这可能是视野中的内容(视锥剔除),其他事物中没有隐藏的内容(遮挡剔除)或其他临时方法。(@Alan Wolfe的答案描述了一些组织数据的方法,这些方法有助于简化筛选。)
  • 流式传输-如果世界数据不能一次全部放入内存中,则可以根据需要将世界数据从存储中拉到内存中
  • 天空盒-可以将非常遥远的对象预先渲染到与相机“无限距离”的球体上。

根据您的特定应用需求,以及何时使用这些技术以及其他技术,您自己的秘诀将是什么。


2

任何层次结构和/或稀疏的东西都应该在这里为您提供帮助。

这里有很多空白空间,因此不必使用存储来表示空白空间。典型的分层方法是像Oct树之类的东西,该树将空间递归地细分为8个较小的多维数据集,并且您可以将对象存储在它们可以完全占据的最小多维数据集中。

八叉树也很不错,因为它可以在视锥中查看所有对象的列表,这将使您仅获得在您的视角范围内并且距离不太远的对象的列表。稀疏解决方案可能类似于稀疏网格,您可以在其中询问有关任何x,y,z位置的信息,但是您只需要存储非空单元格的信息即可。

其他常用的分层方法包括bsp树(将它们递归地分成两个半空间)以及做类似的kd树。

我个人认为,八叉树可能是您的一个不错的开始,请确保仅根据需要进行细分,以免浪费内存。同样,您可能最终希望为静态对象和动态对象提供不同的解决方案。

某些解决方案(例如bsp)可能非常有效,但构建时间较长,因此通常不是移动/更改对象的好选择。

希望对您有所帮助,如有任何疑问,请与我联系!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.