Я ради интереса пишу графический 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, камера рендеринга сцена и направленный / точечный свет?