2016-02-29 4 views
0

У меня есть проблема с рендерингом моей солнечной системы.OpenGL рендеринг различных объектов

У меня есть небольшие объекты и большой объект, который расположен на расстоянии в 10 раз больше, чем небольшие объекты. Как я могу это сделать? (Я хочу увидеть солнце, когда я вокруг моих маленьких объектов)

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

Если далеко/близко находится к большому, все объект мерцают.

+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-боев не должно происходить. So:

  1. Перенести первую группу. (большой диапазон глубины)
  2. Затем очистите только глубину экрана.
  3. Затем визуализируйте объекты, которые являются маленькими и близкими к камере, такие как астероиды, космические корабли и т. Д. Вещи, которым не нужны такие большие цифры . (здесь используется значительно меньший диапазон глубины)
  4. Все готово.

Как вы можете видеть, вы можете сгруппировать сцену по шкале и на нескольких уровнях. Например, вы можете получить список координат для локальной группы звезд, сделать их первыми как точки, очистить глубину, затем отобразить тела системы, в которые вы находитесь, очистить глубину снова и визуализировать локальные объекты в твоя позиция. Вы также должны учитывать, что планета, подобная Плутону, едва видна с Земли, поэтому вы можете просто использовать намного меньший диапазон глубины для рисования.

0

Простым решением, чем многопроходным рендерингом, является использование логарифмического буфера глубины. За счет некоторой точности вы можете расширить доступный диапазон глубины экспоненциально. Загляните сюда для получения дополнительной информации: http://outerra.blogspot.com/2009/08/logarithmic-z-buffer.html