Чому ми рухаємо світ замість камери?


87

Я чув, що в грі OpenGL те, що ми робимо для того, щоб гравець рухався - це не переміщення камери, а переміщення всього світу.

Наприклад, ось уривок цього підручника: матриця OpenGL View

У реальному житті ви звикли рухати камеру, щоб змінити перегляд певної сцени, у OpenGL це навпаки. Камера в OpenGL не може рухатись і визначається як розташована в (0,0,0), спрямований до негативного напрямку Z. Це означає, що замість переміщення та обертання камери світ переміщується та обертається навколо камери, щоб створити відповідний вигляд.

Чому ми це робимо?


1
Камера являє собою не що інше, як вигляд проекції. Так ви перетворюєте світ, щоб отримати бажану проекцію. Концепція дивна, але насправді має сенс ... певним чином ... Я думаю
Сидар

@sharethis, я покращив свою відповідь за допомогою кращого пояснення. Додано перспективу проекції з можливістю математики та 3D-камери (віртуальної камери). Може бути корисним для вас та інших.
Md Mahbubur Rahman

4
Це насправді не так, оскільки обидві операції (переміщення камери чи об’єктів у світі) симетричні, немає способу сказати, яка операція відбулася. Ви думаєте про світ, що рухається навколо камери, але однаково хтось інший може візуалізувати камеру, що рухається зворотно про світ ... Добре, тож ви можете переміщати об'єкти відносно один одного, тож один із способів може бути більш інтуїтивним, але ні людина «помиляється», обидва способи візуалізації ситуації хороші в різних ситуаціях. Часто корисно думати про обидва.
користувач3728501

Відповіді:


72

Чому?

Тому що, камера являє собою проекційний вигляд.

Але у випадку 3D-камери (віртуальної камери) камера рухається замість світу. Пізніше я зробив детальне пояснення цієї відповіді.

Розуміння математично

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

З цієї причини ми перетворюємо інші речі, щоб отримати бажану проекцію.

Розуміння з http://opengl.org

Щоб створити зовнішній вигляд переміщення камери, ваша програма OpenGL повинна перемістити сцену з оберненою формою перетворення камери. що стосується OpenGL, то камери немає. Більш конкретно, камера завжди розташована за координатою простору очей (0, 0, 0)

Розуміння з http://open.gl

Також хочемо поділитися наступними рядками з частини матриці Переглянути http://open.gl/transformations

Щоб імітувати перетворення камери, ви насправді повинні перетворити світ із зворотною цією трансформацією. Приклад: якщо ви хочете перемістити камеру вгору, вам слід зрушити світ вниз.

Розуміння за перспективою

У реальному світі ми бачимо речі таким чином, що називається "перспектива".

Перспектива стосується поняття, що віддалені об'єкти здаються меншими, ніж ті, які вам ближче. Перспектива також означає, що якщо ви сидите посеред прямої дороги, ви насправді бачите межі дороги як дві збіжні лінії.

Така перспектива. Перспектива є критичною у 3D-проектах. Без перспективи 3D-світ не виглядає реальним.

Хоча це може здатися природним і очевидним, важливо враховувати, що при створенні 3D-рендерінгу на комп'ютері ви намагаєтеся імітувати 3D-світ на екрані комп'ютера, який є двовимірною поверхнею.

Уявіть, що за екраном комп’ютера стоїть справжня тривимірна сцена, і ви переглядаєте його через "скло" екрану комп'ютера. Використовуючи перспективу, ваша мета полягає у створенні коду, який відображатиме те, що стає "проектованим" на цьому "склі" вашого екрану, як ніби за цим екраном був справжній 3D-світ. Єдине застереження полягає в тому, що цей 3D-світ не є реальним ... це просто математичне моделювання 3D-світу.

Отже, коли використовується 3D-рендерінг для імітації сцени в 3D, а потім проектування 3D-сцени на 2D-поверхню екрану, процес називається перспективним проекцією.

Почніть з інтуїтивно уявленого, чого ви хочете досягти. Якщо об’єкт знаходиться ближче до глядача, об’єкт повинен здатися більшим. Якщо об’єкт знаходиться далі, він повинен здатися меншим. Крім того, якщо об’єкт відходить від глядача по прямій лінії, ви хочете, щоб він сходився до центру екрана, оскільки він рухається далі вдалину.

Переклад точки зору на математику

Переглядаючи ілюстрацію на наступному малюнку, уявіть, що об’єкт розміщений у вашій 3D-сцені. У тривимірному світі положення об'єкта можна описати як xW, yW, zW, посилаючись на 3D координатну систему з початком у точці ока. Ось де об’єкт розміщений насправді, в 3D-сцені поза екраном.

введіть тут опис зображення

Коли глядач спостерігає за цим об'єктом на екрані, 3D-об’єкт «проектується» у 2D-положення, описане як xP та yP, яке посилається на 2D-систему координат екрану (площину проекції).

Щоб ввести ці значення в математичну формулу, я використовую систему 3D координат для світових координат, де вісь x вказує праворуч, y вказує вгору та позитивні точки z всередині екрана. Тривимірність 3D позначає розташування очей глядача. Отже, скло екрана знаходиться на площині, ортогональній (під прямим кутом) до осі z, на деякій z, яку я назву zProj.

Ви можете обчислити прогнозовані позиції xP та yP, поділивши світові позиції xW та yW, на zW, таким чином:

xP = K1 * xW / zW yP
= K2 * yW / zW

K1 і K2 - константи, які походять від геометричних факторів, таких як співвідношення сторін вашої проекційної площини (вашого огляду) та "поле зору" вашого ока, яке враховує ступінь ширококутного зору.

Ви можете бачити, як це перетворення імітує перспективу. Окуляри біля сторін екрана відсуваються до центру, оскільки відстань від ока (zW) збільшується. У той же час точки, розташовані ближче до центру (0,0), значно менше впливають на відстань від ока і залишаються близько до центру.

Цей поділ на z є відомим "перспективним поділом".

Тепер розглянемо, що об’єкт на сцені 3D визначається як серія вершин. Таким чином, застосовуючи такий вид перетворення на всі вершини геометрії, ви ефективно гарантуєте, що об’єкт скоротиться, коли він знаходиться далі від точки зору.

Інші важливі справи

  • У випадку 3D-камери (віртуальної камери) камера рухається замість світу.

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

Той самий процес зйомки відбувається з 3D камерою. Вам потрібна "віртуальна" камера, яка може блукати навколо створеної вами "віртуальної" сцени.

Два популярні стилі зйомки передбачають спостереження за світом очима персонажа (також відомий як камера від першої особи) або наведення камери на персонажа і збереження їх у зорі (відомий як камера третьої особи).

Це основна передумова тривимірної камери: віртуальна камера, яку можна використовувати для розгуляння по 3D-сцені та відтворення кадру з певної точки зору.

Розуміння світового простору та погляд на простір

Для кодування такої поведінки ви будете виводити вміст тривимірного світу з точки зору камери, а не лише з точки зору світової системи координат або з якоїсь іншої фіксованої точки зору.

Взагалі кажучи, 3D-сцена містить набір 3D-моделей. Моделі визначаються як набір вершин і трикутників, посилаючись на власну систему координат. Простір, в якому визначені моделі, називається модельним (або локальним) простором.

Розмістивши об'єкти моделі в 3D-сцені, ви будете перетворювати вершини цих моделей за допомогою матриці "перетворення світу". Кожен об’єкт має свою матрицю світу, яка визначає, де знаходиться об’єкт у світі та як він орієнтований.

Ця нова система відліку називається "світовий простір" (або глобальний простір). Простий спосіб управління ним - приєднання до кожного об'єкта матриці перетворення світу.

Для того, щоб реалізувати поведінку 3D-камери, вам потрібно буде виконати додаткові дії. Ви посилаєтесь на світ - не на світове походження - а на систему відліку самої 3D-камери.

Хороша стратегія передбачає трактування камери як фактичного 3D-об'єкта в 3D-світі. Як і будь-який інший 3D-об’єкт, ви використовуєте матрицю "перетворення світу", щоб розмістити камеру в потрібному положенні та орієнтації в 3D-світі. Ця матриця перетворення світу камери перетворює об’єкт камери від початкового, дивлячись обертання вперед (уздовж осі z), у фактичне положення світу (xc, yc, zc) та обертання світу.

На наступному малюнку показані зв’язки між системою координат Світу (x, y, z) та системою координат Вид (камера) (x ', y', z ').

введіть тут опис зображення


5
Інші відповіді є. Не потрібно редагувати їх у власні.
Джессі Дорсі

1
@Noctrine, спасибі Мені було невідомо, як створити посилання між сторінками.
Md Mahbubur Rahman

"У наступному розділі ви будете використовувати цю перспективну формулу проекції в ActionScript, яку ви можете використовувати у своїх проектах Flash 3D." Оскільки в оригінальному запитанні не згадується проект Flash 3D, це змушує мене думати, що ви скопіювали це з іншого місця, що добре, якщо ви цитуєте свої джерела.
Жиль

@Gilles, вибачте за мою помилку. Я відредагував свою відповідь. Я підготував відповідь, вивчаючи кілька джерел. І велике спасибі вам, як ви вказали. :)
Md Mahbubur Rahman

Зауважте, що glMatrixMode()і ще кілька функцій, на які посилається: eng.utah.edu/~cs6360/Lectures/frustum.pdf та opengl.org/archives/resources/faq/technical/viewing.htm, є застарілими. Однак математичний опис залишається правильним і корисним.
patryk.beza

28

Відповідь Mahbubar R Aaman цілком правильна, і посилання, які він надає, пояснюють математику точно, але якщо ви хочете менш технічну / математичну відповідь, я спробую інший підхід.

Позиції предметів у реальному та ігровому світі визначаються за допомогою деякої системи координат. Система координат надає значення позиційним значенням. Якщо я скажу вам, що я перебуваю на "100,50", це вам не допоможе, якщо ви не знаєте, що означають ці цифри (чи це милі, кілометри, широта і довгота тощо). Якщо вони є декартовими координатами ("нормальним" видом координат), ви також повинні знати, яке походження вони відносно; якщо я просто скажу "Я на 100 футів до Сходу", ви повинні знати "Схід того , що", що називається координатним походженням.

Існує простий спосіб подумати про це. Можна сказати комусь, що "залізнична станція знаходиться в 3 кілометрах на північ і в 1,5 кілометрах на схід від південно-західного кута міста". Ви також можете сказати комусь, що "залізничний вокзал знаходиться в 1 милі прямо на північ від того, де я зараз перебуваю". Обидві координати є правильними і визначають розташування одного і того ж орієнтира, але вони вимірюються з іншого походження, а значить, мають різні числові значення.

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

Алгоритм, який фактично відображає окремий трикутник на екрані, працює певним чином, і тому не зручно безпосередньо працювати з світовими координатами при візуалізації. Математика насправді не створена для роботи з інформацією на кшталт "об'єкт знаходиться на 100 одиниць праворуч від центру світу". Натомість математика хоче працювати з "об'єктом прямо перед камерою, і 20 одиниць". Отже, в математику візуалізації додається додатковий крок, щоб зайняти світові позиції об'єкта та перевести їх з системи координат камери.

Звичайно, камера має і положення, і орієнтацію. Отже, якщо об’єкт знаходиться в положенні 20,100,50, а камера знаходиться в положенні 10,200, -30, положення об'єкта відносно камери становить 10 100,80 (положення об'єкта мінус положення камери). Коли камера рухається в грі, положення камери у світових координатах переміщується точно так, як ви очікували.

Зауважте, що об’єкти не переміщені; вони залишаються там, де були раніше. Однак їх позиція зараз виражається відносно іншого координатного походження. Світові координати об'єкта рухаються лише в тому випадку, якщо сам об’єкт рухається, але його координати камери також змінюються щоразу, коли камера рухається, оскільки вони відносяться до положення камери.

Також зауважте, що опис підручника, який ви цитуєте, є спрощеним поясненням, а не обов'язково точним описом того, що робить OpenGL. Я не думаю, що автор статті цього не зрозумів; автор просто намагався використати спрощену аналогію, яка в даному випадку викликала плутанину, а не усуває її.

Якщо це допоможе зрозуміти, чому математика піклується про координати камери, спробуйте виконати цю вправу: дотись руки до пальців і вказівних пальців разом, щоб зробити прямокутник (назвемо це "віконцем перегляду") і огляньте кімнату, в якій ви Знайдіть об’єкт і подивіться на нього, а потім огляньте його, але не безпосередньо. Коли ви це зробите, запитайте себе: "де об’єкт у моєму оглядовому вікні?" Цей об’єкт має певну реальну довготу та широту, яку ви можете використовувати для точного визначення місця розташування на Землі, але це нічого не говорить про те, що ви бачите. Хоча сказати, що "об’єкт знаходиться у верхньому лівому куті мого огляду і здається, що він знаходиться приблизно за 2 метри", це говорить вам зовсім небагато. Ви створили систему координат щодо вашої голови та напрямку, перегляньте, що визначає, де знаходиться об’єкт відповідно до вашого бачення. Це, в основному, те, що потрібно для трикутника, що розповсюджує частину OpenGL / Direct3D в трикутнику, і саме це вимагає від математики, щоб позиції та орієнтація об'єкта перетворилися з зручних світових координат у координати камери.


Хоча для мене математичне пояснення зрозуміле і зрозуміле, це теж чудове пояснення! Я вважаю, що ви допомогли багатьом іншим тим самим питанням.
danijar

+1 за те, щоб зрозуміти, рухається камера чи світ - це лише функція, про яку систему координат ви говорите.
Девід Молес

11

Просто додавання до двох інших (відмінно) відповідає на деякий подальший розгляд питання, який торкнувся Махбубур Р Ааман: "немає камери".

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

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

Тепер у вас є два класи об'єкта, які тут є актуальними: точка зору та все на світі. Ви хочете перенести точку зору ближче до деяких об'єктів, але для цього руху кінцевий результат є самим тим, чи подання рухається ближче до об'єктів, чи об'єкти рухаються ближче до подання. Все, що ви робите, - це змінювати відстань між ними; оскільки поточна відстань дорівнює X, і ви хочете, щоб нова відстань була Y, не важливо, яку рухаєтеся, так само, що після переїзду нова відстань - Y. Отже, ви зовсім не рухаєтесь, ви Ви просто змінюєте відстань. (Я не мав на увазі подолати весь Ейнштейн у цьому ... чесно!)

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

Більш просте математичне пояснення може допомогти більше. Давайте зробимо вигляд, що всі координати 1D - точка огляду - 0, ваші об'єкти - 4, і ви хочете, щоб точка огляду перейшла до 3. Це означає, що відстань між ними зміниться з 4 (4 - 0) на 1 (4 - 3). Але оскільки камери не існує, ви не можете змінити цей 0; це завжди буде 0. Отже, замість того, щоб додавати 3 до 0 (що ви не можете зробити), ви віднімаєте 3 з 4 (що ви можете зробити) - об'єкти зараз на рівні 1, а кінцевий результат такий самий - відстань між точка огляду та об'єкти - 1.


Хоча камера не існує як такої, ви все ще можете обчислити її положення до трансформації. Однак у деяких випадках (паралельна проекція, що не відповідає осі) ви отримаєте більш ніж одну із звичайних координат "у нескінченності" (позитивна чи негативна), що є менш корисним, ніж матриця перетворення.
Мартін Сойка

7

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

Частина процесу візуалізації перетворюється з світових координат в координати очей. Однак простий спосіб моделювати це за допомогою об’єкта віртуальної камери у вашій програмі. Камера може представляти як проекційну матрицю (яка відповідає за перспективний ефект), так і матрицю виду, яка використовується для перетворення зі світового простору в око.

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

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


5

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

Однак, коли ви починаєте вносити визначення видимості в суміш, ОСТАННЕ, що ви хочете зробити, - це перекласти весь світ навколо камери. Натомість у більшості випадків (особливо класичний випадок фіксованих BSP або подібне) ви будете використовувати положення камери у світі, щоб запитувати ваші структури видимості, щоб визначити, які речі, можливо, будуть видимі, а потім лише перекладіть ТОСЕ речі в координатний простір камери.


4

Я не вважаю, що твердження є категорично правдивим, оскільки один лише рідко "переміщує" світові координати в грі, але насправді змінює координати віртуальної камери.

Концепція камери насправді робить це перетворення кінцевого фрустума перегляду - це усічена піраміда з 8 кутовими точками (або визначена перетином 6 площин) в одиничний куб, який представляє простір кліпу на останніх етапах openGL рендеринг трубопроводу.

У цьому сенсі світ не переміщується, а лише обчислює світові координати в системі координат простору кліпу.


2

Переміщення камери або переміщення по світу - це два однаково вірних варіанти (і обидва є істинними). Наприкінці дня ми переходимо від однієї системи координат до іншої. Перетворення можуть йти в будь-який бік - вони просто зворотні одна одній.


2

Тут багато хороших відповідей. Я спробую не повторити жодного з них. Іноді це простіше придумати з точки зору камери, наприклад, як це робить Direct3D (зверніть увагу: не грав з великою кількістю публікації 9.0c)

"Рух по світу", як у сенсі Футурами, що хтось там цитується, - це дуже хороший спосіб поглянути на це ("Двигуни взагалі не рухають корабель. Корабель залишається там, де він знаходиться, а двигуни рухають Всесвіт навколо"). це! »). Це було насправді досить часто для 2D ігор. Ви буквально мали огляд перегляду, що вам буде важко налаштувати, і це часом ваша оперативна пам’ять або вікно інтерфейсу користувача. Якщо OpenGL робить це з таких причин, е, важко сказати.

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


1
Пізня, але приємна відповідь теж!
danijar

Дякую! Я завжди вважав, що додавання до дискусії на сторінках, які знаходять через пошукову систему, виявляється дуже вдячним, особливо якщо інформація зручна чи цікава
Джо Плант

2

Тут, здається, існує маса непорозумінь, починаючи з авторів документів OpenGL ...

Дозвольте мені швидко відновити вашу розумність: світ не рухається , він залишається поставленим. Той, хто намагається реалізувати світ, рухаючись навколо гравця, швидко зіткнеться з неприємностями в мультиплеєрному режимі. Не кажучи вже про те, що оновлення позицій мільйонів (або мільярдів) об'єктів у світі при ході кожного гравця дозволить зробити досить повільний геймплей ...

Отже, що насправді там відбувається, і що з цитатою?

Ну, перш за все вам потрібно зрозуміти поняття системи координат. Як правило, ви вибираєте одну точку світу і оголошуєте її "початковою", тобто точкою з координатами (0,0,0). Ви також обираєте три "основні" напрямки, які ви називаєте X, Y і Z. Очевидно, існує багато способів призначити систему координат. Зазвичай існує одна "світова система координат", у цій системі світ є нерухомим (більш-менш). У грі цю систему обирав би дизайнер рівня.

Тепер також зручно розглянути ще одну систему координат, прив’язану до ока гравця. У цій системі координат гравець завжди знаходиться за координатами (0,0,0), і світ рухається і обертається навколо нього. Таким чином, цитата є правильною, якщо ви розумієте, що вона робиться в системі координат гравця .

Однак світ не працює за координатами гравця, він працює у світових координатах. І там, де задіяні дві системи координат, завжди є спосіб перетворити один вид координат в інший. У OpenGL це робиться за допомогою матриці подання 4x4.

Зрештою, коли гравець рухається, світ залишається нерухомим, тоді як гравець переміщується. Це у світових координатах, у тому, як об’єкти зберігаються у вашій грі. У програвачі також є пов’язана з ним камера перегляду, і ця камера аналогічно рухається по всьому світу (незважаючи на те, що, начебто, говорять документи OpenGL). Однак, щоб показати світ на екрані користувача, координати всіх видимих ​​об'єктів переводяться в систему координат гравця за допомогою матриці перетворення, а потім застосовується додаткова проекція для створення перспективного ефекту. У системі координат цього гравця світ насправді рухається навколо гравця. Але це просто надзвичайно недобрий і заплутаний спосіб думати про це.


" Починаючи з письменників документів OpenGL " Правильно, тому що я впевнений, що розробники OpenGL явно занадто дурні, щоб зрозуміти різницю між представленням світу (про що все піклується OpenGL) і концептуальним поданням цього світу ( що не є чим OpenGL займається).
Ніколь Болас

" Але це просто надзвичайно недобрий і заплутаний спосіб думати про це ". Це також правда . І правда завжди корисніше, ніж брехня. Тому що рано чи пізно ця брехня наздожене вас, і вам доведеться зіткнутися з правдою.
Нікол Болас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.