Соглашение об осях OpenGL - PullRequest
1 голос
/ 05 августа 2020

Я ради интереса пишу графический c движок. И я застрял в глубокой проблеме соглашения.

Я знаю стандартное соглашение об осях OpenGL, X + - правильно, Y + - вверху, а Z- - это то, как вы видите вещи на экране. Чтобы было ясно, не касаясь конфигурации по умолчанию, если я хочу что-то увидеть, мне нужно нарисовать это в Z- в мире, если я нарисую в Z +, это будет «за камерой». Я хочу придерживаться этого соглашения.

С другой стороны, для объектов на их локальной оси я тоже использую X + для правой стороны, y + также для вершины, но Z + для передней части. Итак, если я рисую парня, его глаза смотрят в сторону Z +. Мне тоже нравится это соглашение, но я не уверен, потому что это немного странно с тем, как мы визуализируем мир, в конце концов, все в порядке.

А вот и настоящая проблема, с которой я столкнулся. Когда дело доходит до использования света (и отображения теней), я просто возьму для примера точечный свет. Что мне делать: Z + или Z-, чтобы направить луч света?

Потому что здесь есть трюк. Если я хочу использовать технику наложения теней c, у нас есть свет и «камера» для рисования объектов на карте теней, и я стараюсь придерживаться единого соглашения о «камерах», независимо от того, что я рендерю. (кадровый буфер по умолчанию, рендеринг вне экрана для эффектов или сопоставления теней).

В итоге я использую свет, использующий Z-луч, чтобы следовать правилам камеры. Но на самом деле меня это беспокоит. Я все еще могу придерживаться этого соглашения, но это странно, когда дело дошло до создания такой функции, как lookAt (), basi c me sh будет "смотреть" правильно, но свет будет перевернутым ... И, наконец, что, если Например, я хочу, чтобы модель конкретизировала мой прожектор? Вся структура немного хреновая ...

Мой основной c вопрос в том, какое лучшее соглашение я должен использовать для рендеринга basi c model / me sh, камера рендеринга сцена и направленный / точечный свет?

1 Ответ

1 голос
/ 05 августа 2020

Да, весь конвейер довольно запутанный. Если у вас возникли проблемы с пониманием того, как взаимосвязаны правая система координат и мировое пространство (Z-), возможно, вы могли бы попробовать визуализировать это так. Представьте, что правая система координат - это 2D-график с координатами карты, так что ось Y указывает на север, ось x указывает на восток, а ось «вверх» (перпендикулярна 2D-графику) и, следовательно, за пределы экрана. Затем представьте, что вы находитесь в ракете, запускаемой с Земли, вы предположите, что направление восхождения - Z +.

запуск ракеты по z +

Следовательно, объекты появляются на камере, когда они находятся «ниже» камеры или отрицательное z и находятся в «мировом пространстве». Так что действительно имеет смысл увеличивать положение камеры по оси z положительно по мере того, как она удаляется, потому что это вроде работает в релятивистском c смысле. Однако для определения положений источников света и объектов имеет больше смысла использовать Z +, потому что они являются важными функциями. проверка глубины буфера / отбраковка фрагментов работает, как ожидалось (ie. передние пиксели дальше в положительном направлении z), не совсем уверен, имеет ли это смысл ...

Изменить: это мои текущие рабочие знания , который, очевидно, все еще может иметь некоторую fl aws, но если это приведет к дискуссии, в которой мы оба можем чему-то научиться, я счел бы это полезным :)

...