3D игровая геометрия - PullRequest
       3

3D игровая геометрия

8 голосов
/ 16 февраля 2012

У меня есть простая игра, которая использует трехмерное представление сетки, что-то вроде:

Blocks grid[10][10][10];

Человек в игре представлен точкой и вектором взгляда:

double x,y,z, dx,dy,dz;

Я рисую сетку с тремя вложенными циклами:

for(...) for(...) for(...)
   draw(grid[i][j][k]);

Очевидная проблема с этим заключается в том, что когда размер сетки увеличивается в пределах сотен, число кадров в секунду резко падает.С некоторой интуицией я понял, что:

  • Блоки, которые были скрыты другими блоками в сетке, не нужно визуализировать
  • Блоки, которые также не были в поле зрения человекане нужно отображать (то есть блоки, которые были позади человека)

Мой вопрос, учитывая grid[][][], x,y,z человека и вектор взгляда dx,dy,dz,как я могу выяснить, какие блоки нужно рендерить, а какие нет?

Ответы [ 3 ]

7 голосов
/ 16 февраля 2012

Некоторое время назад я изучал использование JMonkeyEngine , движка для 3D-игр, и посмотрел на некоторые методы, которые они используют.Из того, что я помню, они используют то, что называется выбраковкой.Они строят древовидную структуру всего, что существует в «мире».Идея заключается в том, что у вас есть подмножество этого дерева, которое представляет видимые объекты в любой момент времени.Другими словами, это те вещи, которые нужно визуализировать.Так, скажем, например, что у меня есть комната с объектами в комнате.Комната на дереве, и предметы в комнате - дети дерева.Если я нахожусь за пределами комнаты, то я обрезаю (удаляю) эту ветвь дерева, что означает, что я не рендерил ее.Причина, по которой это работает так хорошо, заключается в том, что мне не нужно оценивать КАЖДЫЙ объект в мире, чтобы увидеть, нужно ли его визуализировать, но вместо этого я быстро обрезаю целые части мира, которые, как я знаю, не следует визуализировать.

Еще лучше, тогда, когда я захожу в комнату, я обрезаю весь остальной мир с дерева, а затем только визуализирую комнату и всех ее потомков.

Я думаю, что многие дизайнерские решения, принятые командой JMonkeyEngine, были основаны на том, что написано в книге Дэвида Эберли 3D Game Engine Design .Я не знаю технических деталей о том, как реализовать такой подход, но держу пари, что эта книга станет для вас отличной отправной точкой.

Вот интересная статья о некоторыхразличные алгоритмы отбраковки:

  • Просмотреть отбраковку Frustum
  • Отбор задней поверхности
  • Отбор окклюзии на основе клеток
  • Отбор окклюзии произвольной геометрии на основе PVS
  • Другие
1 голос
/ 18 февраля 2012

Звучит так, словно ты идешь в мир майнкрафт. Взгляните на этот андроид майнкрафт рендерер уровня . Примечания:

  • Вам нужно только нарисовать грани блоков, которые используются совместно с прозрачными блоками. например: не пытайтесь рисовать грани между двумя непрозрачными блоками - игрок их никогда не увидит.
  • Возможно, вы захотите объединить геометрию видимого блока в чанлеты (и вставить ее в VBO) и определить видимость для каждого чанлета. Нахождение того, какие именно блоки можно увидеть, вероятно, займет больше времени, чем просто бросить VBO на GPU и принять оверрейд.
  • Заливка заливки работает довольно хорошо, чтобы определить, какие фрагменты видны - ограничьте заливку, используя усеченный вид, направление просмотра (если вы смотрите в направлении + ve x, не заливайте в направлении -ve) и простой анализ данных чанклета (например, если вся грань чанлета непрозрачна, не проливайте эту грань)
1 голос
/ 16 февраля 2012

Во-первых, вам нужна структура пространственного разделения, если вы используете блоки одинакового размера, вероятно, наиболее эффективной будет структура octree .Затем вам нужно будет написать алгоритм, который может вычислять, находится ли прямоугольник на определенной стороне (или пересекается) плоскости.Как только вы это сделаете, вы сможете определить, какие узлы листа октрея находятся внутри шести сторон вашего усеченного вида - это отбраковка вида .Также с помощью octree вы можете определить, какие блоки перекрывают другие (иногда называемые frustum masking ), но сначала сработает первая часть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...