2016-02-29 86 views
0

我在渲染我的太陽系時遇到了一些問題。OpenGL渲染不同的對象

我有小物體和一個大物體,它位於比小物體大10e9倍的距離。我如何渲染所有這些? (我想看看太陽,當我圍繞我的小物體時)

glm::perspective(m_fInitialFoV, 4.0f/3.0f, near, far); 

如果far/near大,所有對象都閃爍。

+6

您不能在圖形計算中使用天文距離;沒有足夠的精度來處理它們。 –

+2

爲了完善@ColonelThirtyTwo:寫道:當進行天文渲染時,它通常歸結爲假定所有對象都處於無限遠處並且只關心角度方向。 – datenwolf

+0

如果下一個選項是可能的?: 如果主體太遠,傳輸和縮放對象在相機對象的半徑矢量上的方式是可見的。如果攝像機移動,投影也會移動。 – TuringMachine

回答

1

最好的辦法是按比例分組對象並分別渲染它們。例如,太陽系可以使用地球的尺度,即半徑爲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戰鬥。 所以:

  1. 先渲染'大'組。 (大深度範圍)
  2. 然後只清除屏幕的深度。
  3. 然後渲染小而靠近相機的物體,如小行星,宇宙飛船等。不需要這麼大的物體的數字。 (這裏使用的深度範圍要小得多)
  4. 你完成了。

正如您所看到的,您可以根據比例和多個層次對場景進行分組。例如,您可以獲取本地恆星組的座標列表,首先將它們渲染爲點,清除深度,然後呈現您所在系統的主體,再次清除深度,並將本地對象渲染爲你的職位。你還應該考慮,像冥王星這樣的行星在地球上幾乎看不到,所以你可以簡單地使用更小的深度範圍進行繪圖。