Прокат мого власного графіка сцени


23

Привіт Ігровий розвиток SE!

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

Поки що я використовував GLFW, щоб отримати базовий введення / вивід, вікно (з настільки фантазійною повноекранною клавішею F11) і звичайно контекст OpenGL. Я також використовував GLEW для викриття решти розширень OpenGL, оскільки я використовую Windows і хочу використовувати всі OpenGL 3.0+.

Що приводить мене до графіку сцени. Коротше кажучи, я хотів би прокатати своє. Це рішення було прийнято після перегляду OSG та ознайомлення з кількома статтями про те, як концепція графіка сцени перекручена, зігнута та зламана. В одній із таких статей описано, як склалися графіки сцен, як ...

Потім ми додали у все це зайвий матеріал, як висячі прикраси на ялинку, за винятком того, що деякі прикраси - це гарні соковиті стейки, а деякі - цілі живі корови.

Вслід за аналогією, я хотів би стейк, м'ясо того, яким повинен бути графік сцени, без необхідності нав'язувати купу зайвого коду чи будь-яких цілих корів.

Отже, маючи на увазі, мені здається, цікаво, яким саме повинен бути графік сцени та як слід запровадити простий графік сцени? Ось що я маю досі ...

Один з батьків, n-дітей дерево або DAG, які ...

  • Слід відслідковувати перетворення об'єктів гри (положення, обертання, масштаб)
  • Слід утримувати стани візуалізації для оптимізації
  • Слід передбачити засоби для відсікання предметів, які не перебувають у межах огляду

З такими властивостями ...

  • До всіх вузлів слід ставитися як до перегляду (навіть якщо вони не надаються) Це означає, що вони ...

    • Якщо всі мають методи cull (), state () та draw () (поверніть 0, якщо не видно)
    • cull () рекурсивно викликає cull () для всіх дітей, тим самим генеруючи повну сітку для cull для всього вузла та всіх дітей. Інший метод, hasChanged () може дозволити так званим статичним сіткам не потрібно обчислювати геометрію відсічення кожного кадру. Це спрацювало б так, що якщо будь-який вузол в під-дереві змінився, то вся геометрія вниз до кореня буде перебудована.
  • Стани візуалізації будуть проводитись у простому перерахуванні, кожен вузол вибере із цього перерахування необхідний набір стану OpenGL, і цей стан буде встановлений до виклику draw () на цьому вузлі. Це дозволяє проводити пакетну групу, всі вузли даного набору стану будуть виведені разом, потім буде встановлено наступний набір стану тощо.

  • Жоден вузол не повинен безпосередньо містити дані геометрії / шейдера / текстури, натомість вузли повинні вказувати на спільні об'єкти (можливо, керує якийсь об'єкт однотонних форм, наприклад менеджер ресурсів).

  • Графи сцен повинні мати можливість посилатися на інші сцени графіків (можливо з використанням проксі - вузла) , щоб дозволити ситуації , як це , таким чином , дозволяючи комплекс мульти-сітку моделі / об'єкти повинні бути скопійовано навколо графа сцени без додавання тонни даних.

Я сподіваюся отримати цінний відгук про мій сучасний дизайн. Не вистачає функціональності? Чи є набагато кращий спосіб / модель дизайну? Чи пропускаю я якусь більшу концепцію, яку потрібно буде включити в цей дизайн для дещо простої 3D-гри? І т.д.

Спасибі, -Коді

Відповіді:


15

Концепція

По суті, сценічний графік - це не що інше, як двонаправлений ациклічний графік, який служить для відображення ієрархічно структурованого набору просторових відносин.

Як зазначалося, двигуни в дикій природі включають інші смаколики. Чи ви бачите це як м'ясо чи корову, мабуть, залежить від вашого досвіду роботи з двигунами та бібліотеками.

Зберігаючи його легким

Я віддаю перевагу стилю Unity3D, щоб ваш графічний вузол сцени (який в його основі є топологічним, а не просторовою / топографічною структурою) по суті включав просторові параметри та функціональні можливості. У моєму двигуні мої вузли мають навіть легшу вагу, ніж Unity3D, де вони успадковують безліч зайвих непотрібних членів від суперклассів / реалізованих інтерфейсів. Ось, що я маю - про таке легке, як ви можете отримати:

  • члени вказівника батька / дитини.
  • заздалегідь перетворені просторові параметри членів: положення xyz, крок, позіхання та кочення
  • матриця перетворення; матриці в ієрархічному ланцюжку можуть дуже швидко і легко розмножуватися, проходячи рекурсивно вгору / вниз по дереву, надаючи вам ієрархічні просторові перетворення, які є головною особливістю графіка сцени;
  • updateLocal()метод , який оновлює тільки цей вузол матриці перетворення це
  • updateAll()метод , який оновлює це і всі дочірні вузли перетворення матриць

... Я також включаю логіку рівнянь руху та, таким чином, члени швидкості / прискорення (лінійні та кутові) у свій клас вузлів. Ви можете відмовитися від цього та обробити це у своєму головному контролері, якщо хочете. Але це все - справді дуже легкий. Пам'ятайте, ви могли мати це на тисячах організацій. Отже, як ви запропонували, будьте світлом.

Побудова ієрархій

Що ви кажете про графік сцени, що посилається на інші графіки сцен ... Я чекаю на пунктир? Звичайно, вони. Це їх головне використання. Ви можете додати будь-який вузол до будь-якого іншого вузла, і перетворення повинні відбуватися автоматично в локальному просторі нового перетворення. Все, що ви робите, - це зміна вказівника, це не так, як ви копіюєте дані навколо! Змінивши вказівник, ви отримаєте більш глибокий графік сцени. Якщо використання Proxies робить ефективнішими речі, то я ніколи не бачив потреби.

Уникайте логіки, пов'язаної з візуалізацією

Забудьте про візуалізацію, коли ви пишете клас вузла графіка сцени, або ви будете плутати речі для себе. Важливо лише те, що у вас є модель даних - будь то графік сцени чи ні, не має значення - і якийсь рендерінг буде перевіряти цю модель даних і відповідно рендерувати об'єкти у світі, незалежно від того, чи є вона у 1,2 , 3 або 7 розмірів. Я зазначаю: Не забруднюйте графік сцени логікою візуалізації. Графік сцени стосується топології та топографії, тобто зв'язку та просторових характеристик. Це справжній стан моделювання і існує навіть за відсутності візуалізації (яке може приймати будь-яку форму під сонцем від перегляду від першої особи до статистичного графіка до текстового опису). Вузли не вказують на об'єкти, пов’язані з візуалізацією - однак, зворотній зв'язок цілком може бути правдою. Також врахуйте це: Не кожен вузол графіка сцени у вашому дереві буде доступним. Багато хто буде просто контейнерами. То чому б навіть виділяти пам'ять для вказівника на об'єкт відтворення? Навіть член вказівника, який ніколи не використовується, все ще займає пам'ять. Тому поверніть напрямок вказівника: Екземпляр, пов’язаний з візуалізацією, посилається на модель даних (яка може бути або включати ваш вузол графіка сцени), а не навпаки. І якщо ви хочете простий спосіб пройти через ваш список контролерів, але все-таки отримати доступ до відповідного перегляду, то використовуйте словник / хеш-таблицю, який наближається до (1) часу доступу для читання. Таким чином, немає забруднення, і ваша логіка моделювання не має значення, які рендері є на місці, що робить ваші дні та ночі кодування То чому б навіть виділяти пам'ять для вказівника на об'єкт відтворення? Навіть член вказівника, який ніколи не використовується, все ще займає пам'ять. Тому поверніть напрямок вказівника: Екземпляр, пов’язаний з візуалізацією, посилається на модель даних (яка може бути або включати ваш вузол графіка сцени), а не навпаки. І якщо ви хочете простий спосіб пройти через ваш список контролерів, але все-таки отримати доступ до відповідного перегляду, то використовуйте словник / хеш-таблицю, який наближається до (1) часу доступу для читання. Таким чином, немає забруднення, і ваша логіка моделювання не має значення, які рендері є на місці, що робить ваші дні та ночі кодування То чому б навіть виділяти пам'ять для вказівника на об'єкт відтворення? Навіть член вказівника, який ніколи не використовується, все ще займає пам'ять. Тому поверніть напрямок вказівника: Екземпляр, пов’язаний з візуалізацією, посилається на модель даних (яка може бути або включати ваш вузол графіка сцени), а не навпаки. І якщо ви хочете простий спосіб пройти через ваш список контролерів, але все-таки отримати доступ до відповідного перегляду, то використовуйте словник / хеш-таблицю, який наближається до (1) часу для читання. Таким чином, немає забруднення, і ваша логіка моделювання не має значення, які рендері є на місці, що робить ваші дні та ночі кодування І якщо ви хочете простий спосіб пройти через ваш список контролерів, але все-таки отримати доступ до відповідного перегляду, то використовуйте словник / хеш-таблицю, який наближається до (1) часу для читання. Таким чином, немає забруднення, і ваша логіка моделювання не має значення, які рендері є на місці, що робить ваші дні та ночі кодування І якщо ви хочете простий спосіб пройти через ваш список контролерів, але все-таки отримати доступ до відповідного перегляду, то використовуйте словник / хеш-таблицю, який наближається до (1) часу для читання. Таким чином, немає забруднення, і ваша логіка моделювання не має значення, які рендері є на місці, що робить ваші дні та ночі кодуваннясвіти легше.

Що стосується вибивання, зверніться до вищезазначеного. Відсікання області за інтересами - це концепція логіки моделювання. Тобто ви не обробляєте світ поза цією (зазвичай коробкою, круговою чи сферичною) областю. Це відбувається в головному циклі контролера / гри, перш ніж відбудеться візуалізація. З іншого боку, знищення фрустрації пов'язане лише з рендерінгом. Тож забудьте про відсікання прямо зараз. Це не має нічого спільного з графіками сцен, і зосередившись на ньому, ви будете затемнювати справжню мету того, чого ви намагаєтеся досягти.

Заключна примітка ...

Я відчуваю сильне відчуття, що ви приїжджаєте з Flash (зокрема, AS3), враховуючи всі деталі щодо відображення, включені тут. Так, парадигма Flash Stage / DisplayObject включає всю логіку візуалізації як частину сцени. Але Flash робить багато припущень, які не обов’язково хочеться робити. Для повноцінного ігрового двигуна їх краще не змішувати з міркувань продуктивності, зручності та контролю складності коду через належний SoC .


1
Дякую Ніку. Я насправді 3D-аніматор (справжній 3D не спалах) перетворився на програміста, тому я схильний думати з точки зору графіки. Якщо це недостатньо погано, я почав на Яві і довіряв собі менталітет "все повинно бути об'єктом", прищеплений цією мовою. Ви переконали мене, що графік сцени повинен бути відокремлений від коду візуалізації та скидання, тепер мої передачі обертаються саме тим, як це слід зробити. Я маю в виду лікування Отображатель , як це власна відмінна система , яка посилається на граф сцени для перетворення даних і т.д.
Коді Сміт

1
@CodySmith, Рада, що це допомогло. Безсоромний штекер, але я підтримую рамки, які стосуються SoC / MVC. Роблячи це, я зіткнувся з більш традиційним табором у галузі, який наполягає на тому, що все повинно знаходитися в центральному, монолітному об'єкті. Але навіть вони, як правило, скажуть вам - тримайте візуалізацію окремо від вашої графіки. SoC / SRP - це те, чого я не можу наголосити достатньо - ніколи не змішуйте більше логіки в одному класі, ніж вам потрібно. Я б навіть захисник складних ланцюгів успадкування OO за змішаною логікою в тому ж класі, якщо ви покладете мені пістолет на голову!
Інженер

Ні, мені подобається ця концепція. І ваше право, це перша згадка SoC, яку я бачив десь за роки читання про гру Дизайн. Знову дякую.
Коді Сміт

@CodySmith Швидка думка, переглядаючи це ще раз. Взагалі добре тримати речі нерозв’язаними. Для різних типів об'єктів моделі-контролера у вашому коді , які піддаються візуалізації, проте, це нормально для вас , щоб зберегти колекції Renderableз (який являє собою інтерфейс або абстрактний клас) внутрішньо цих основних об'єктів моделі-контролера. Хорошими прикладами цього є сутності або елементи інтерфейсу користувача. Таким чином, ви можете швидко отримати доступ лише до тих рендерів, що мають відношення до конкретного основного об'єкта - без специфіки реалізації, яка б заразила клас сутності, отже, використання інтерфейсів.
Інженер

@CodySmith Користь зрозуміла з сутностями, що може, наприклад, мати представлення як у світовому огляді, так і в міні-карті. Отже, колекція. Крім того, ви можете дозволити лише один слот візуалізації для кожного об'єкта-контролера моделі, всередині цього об'єкта. Але зберігайте інтерфейс загальним! Без конкретики - просто Renderer.
Інженер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.