Рендеринг сетки с использованием алгоритма Octree

Я являюсь основателем SceneMax - языка сценариев 3D с 2005 года. Я хочу добавить рендеринг сцены с использованием одного объекта-сетки, созданного с помощью 3D-пакета, такого как 3ds max, и разбитого по алгоритму октодерева для оптимизации производительности.

Вы знаете, где я могу найти алгоритм, который берет файл сетки .X, разбивает его на узлы (октодерево) и знает, как его визуализировать? Я хочу добавить его в свой движок. Движок с открытым исходным кодом (Google для SceneMax, если вам интересно).

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
8 365
2

Ответы 2

Есть несколько вариантов, но один из подходов к построению октодерева:

  1. Начните с одного узла (т.е. куба), охватывающего всю вашу сцену или разделяемый объект.
  2. Для каждого элемента в вашей сцене / объекте (например, меш, поли или любой другой уровень детализации, над которым вы работаете):
    1. Убедитесь, что этот элемент полностью входит в узел.
    2. Если да, разделите узел на восемь потомков, затем рекурсивно выполните шаг 2 для каждого потомка.
    3. Если нет, переходите к следующему узлу, пока не останется никаких узлов.
    4. Добавьте элемент к наименьшему узлу, который может его содержать.

Также часто останавливают рекурсию на основе некоторой эвристики, например, если размер узлов или количество элементов в узле меньше определенного порога.

См. это руководство по флипкоду для более подробной информации о построении октодерева.

Когда у вас есть октодерево, вы можете использовать несколько подходов для его рендеринга. Основная идея состоит в том, что если вы не можете «видеть» узел, значит, вы не можете видеть и его дочерние элементы, поэтому все внутри этого узла (и его дочерних элементов) не нуждается в визуализации.

Отбор Frustum легко реализовать, и есть ли вопрос "вы это видите?" протестируйте, используя усеченную пирамиду вашей проекции обзора. Gamedev.net есть статья обсуждает отсечение усеченной пирамиды и некоторые другие подходы.

Вы также можете пойти дальше и реализовать отсечение окклюзии после отсечения усеченного конуса, что позволит вам пропустить рендеринг любых узлов, которые закрыты узлами перед ними, используя z-буфер, чтобы определить, скрыт ли узел. Это включает в себя возможность перемещаться по узлам октодерева от ближайшего к самому дальнему. Этот метод обсуждается в эта статья из Гамасутры.

Я думаю, что самая сложная часть - это границы между двумя кубиками. Что делать, если поли частично состоит из двух или более кубов? Вы можете либо добавить полигон к каждому из задействованных кубов, решить, принадлежит ли полигон к одному кубу на основе измерения (например, площади), либо вы можете разделить полигон.

Stefan Schmidt 12.01.2009 03:00

Ссылка gamedev.net мертва

Gerard 05.09.2014 18:03

Важно сначала рассмотреть типы файлов сетки, которые вам придется поддерживать.

Фактически существует 3 различных типа объектов. 1. Открытая естественная местность. Это очень хорошо подходит для квадродерева, так как октодерево вносит ненужную сложность. Нет особых причин вводить 3-е измерение, если оно не даст вам большого прироста производительности. 2. Открытая местность с множеством высоких объектов. Это очень хорошо вписывается в октодерево, так как октодерево позволяет вам удалять элементы на вертикальной оси из рендеринга, а в такой сцене, как эта, их много. Я, честно говоря, не могу назвать ничего, что могло бы подходить под это с моей головы. 3. Замкнутые пространства или модели персонажей / статические сетки. Это очень хорошо вписывается в деревья BSP. Дерево BSP позволяет объектам, полностью отображаемым на экране, или замкнутым пространствам отображать столько полигонов, сколько необходимо.

Я бы рекомендовал добавить 1 и 3, предполагая, что 1 - это даже тип модели, который вам нужно поддерживать. # 3 очень стандартен для шутеров от первого лица или моделей персонажей, и добавление поддержки для него может дать вам максимальную отдачу от затраченных средств. Общая идея состоит в том, чтобы удалить как можно больше геометрии из рендера, поэтому дерево квадратов для 95% игровых миров игроков на открытом воздухе идеально подходит. У октодерева есть применение, но меньше, чем вы думаете.

Каждый из этих алгоритмов относительно легко написать. Например, много лет назад я написал октодерево за 3 часа. Обычно они обрабатываются во время загрузки, части геометрии добавляются к каждому квадрату (если четырехугольник / октодерево) или к дереву (если BSP), а затем выполняется рендеринг. Есть много отличных статей через быстрый поиск в Google, которые я оставлю для вашего исследования. Небольшое примечание: дерево BSP также может обрабатывать обнаружение столкновений и является идеальным кандидатом для моделей персонажей и статических сеток. Таким образом, это алгоритм, на который я бы рекомендовал не торопиться, чтобы убедиться, что он достаточно гибкий для многократного использования.

Другие вопросы по теме