我在渲染我的太阳系时遇到了一些问题。
我有小物体和大物体,大物体的距离是小物体的 10e9 倍。我如何渲染所有这些? (当我围绕我的小物体时,我想看到太阳)
glm::perspective(m_fInitialFoV, 4.0f / 3.0f, near, far);
如果远/近太大,所有物体都在闪烁。
最佳答案
最好的方法是按比例对对象进行分组并分别渲染它们。例如,太阳系可以使用地球的尺度作为单位,即半径为 6378.1 km
,距离太阳的距离为 147.09x10^6 km
。
围绕地球半径对这些进行归一化,我们得到:
Earth's Radius: 1.0 unit
Distance from sun: 23061.72 units
相同的归一化原则适用于其他太阳系天体:
Venus' Radius: 0.9488405638 units
Distance from sun: 16851.41 units
Pluto's Radius: 0.186105580 units
Distance from sun: 695633.4 units
您还应该设置深度以包含这些数字。只要物体之间有很大的空间,就不会出现错误和 z 冲突。 所以:
- 首先渲染“大”组。 (大深度范围)
- 然后只清除屏幕的深度。
- 然后渲染小的和靠近相机的物体,比如小行星、宇宙飞船等。不需要那么大的东西 数字。 (这里使用小得多的深度范围)
- 大功告成。
如您所见,您可以根据比例和多个级别对场景进行分组。例如,您可以获取本地恒星群的坐标列表,首先将它们渲染为点,清除深度,然后渲染您所在系统的主体,再次清除深度,并渲染本地对象你的职位。您还应该考虑到,从地球上几乎看不到像冥王星这样的行星,因此您可以简单地使用更小的深度范围进行绘制。
关于c++ - OpenGL 渲染不同的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35700648/