Правильная обработка объектов и источников света в 3D-пространстве — OpenGL

Я пытаюсь настроить все на своем движке, но не могу понять, в каком порядке добавлять объекты и источники света, чтобы все отображалось правильно.

Я настроил свою проекцию и матрицу просмотра модели в своей инициализации:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();                            

gluPerspective(75.0f,(GLfloat)width/(GLfloat)height, 0.1f , 1000.0f);

glMatrixMode(GL_MODELVIEW);                         
glLoadIdentity(); 

Затем, когда я визуализирую геометрию, я очищаю буфер, загружаю матрицу идентичности и обновляю свою камеру.

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();

// Camera updates
glRotatef(camera.anglePitch, 1.0f, 0.0f, 0.0f);
glRotatef(camera.angleYaw, 0.0f, 1.0f, 0.0f);
glTranslatef(-camera.position.x, -camera.position.y, -camera.position.z);

// Now render
level.render();

Мое представление о моем уровне — это камера, которая, как я понимаю, — это движущиеся координаты глаз. Я пытаюсь визуализировать объекты и источники света на своем уровне, чтобы они отображались в правильных местах.

Мне нужно добавить объекты в определенных точках мира. Например, тор в точке (10, 10, 25). Есть ли что-нибудь, что мне нужно сделать, прежде чем я визуализирую эти объекты тора, чтобы они правильно отображались на 10, 10, 25? Нужно ли мне отображать, а затем переводить их, например?

Кроме того, часть 2 связана с освещением. Это примерно тот же вопрос. Что я должен учитывать при рендеринге, скажем, света на 50, 50, 50? Могу ли я просто расположить свет нормально или снова мне нужно перевести его туда? Или я слишком много думаю об этом?


person Pladnius Brooks    schedule 13.12.2011    source источник
comment
Есть несколько вещей, которые неясны в вашем вопросе: во-первых, о каком происхождении вы говорите, происхождении координатного пространства глаза или координатного пространства объекта? Во-вторых, что вы подразумеваете под визуализацией света? Вы имеете в виду то, как затеняются ваши полигоны, или вы хотите визуализировать объект, который будет выглядеть как источник света? (извините за первоначальную путаницу в публикации комментария, я по ошибке сохранил его, не написав :)   -  person jcage    schedule 13.12.2011
comment
Прости. Я пытался этого избежать. Пожалуйста, скажите мне, что я могу уточнить.   -  person Pladnius Brooks    schedule 13.12.2011
comment
@jcage Дайте мне знать, если у вас есть еще вопросы. Я пытаюсь все правильно сформулировать. Там, где у меня есть данные уровня, которые являются абсолютными координатами, то есть треугольником в (2.5, 1.2, 10.2), объекты, которые мне нужно визуализировать, имеют только свои координаты сетки, а затем места, куда им нужно идти. Как мне отобразить эти объекты на их правильных местах? Что-то вроде загрузки объектов, а затем их перевода в определенные места? Я действительно не уверен. Надеюсь, это прояснит мой вопрос.   -  person Pladnius Brooks    schedule 13.12.2011
comment
Что ж, я бы сделал это, переведя координаты объектов, добавив к каждому из них желаемое местоположение этого объекта. Не стал бы возиться с переводами через матрицу представления модели, просто выполнял бы простые добавления векторов и визуализировал бы их так же, как визуализируется объект уровня.   -  person jcage    schedule 13.12.2011


Ответы (1)


Если я понимаю проблему, я соглашусь, что вы слишком много думаете об этом. Преобразования из glTranslate и glRotate применяются к матрице просмотра модели, на которую умножаются все ваши вершины, чтобы получить координаты глаза, которые позже будут обрезаны в проекции. Те же преобразования применяются и к вашим источникам света.

Вы также можете использовать glPopMatrix и glPushMatrix для применения разных состояний матрицы представления модели к разным вершинам.

Я бы также отослал вас к вопросу 9.070 в http://www.opengl.org/resources/faq/technical/transformations.htm

person jcage    schedule 13.12.2011
comment
Хорошо. Так, например, я загружаю объект из файла и хочу добавить его в (100, 100, 0). Я просто загружаю объект, а затем перевожу его в (100, 100, 0) и применяю любые повороты, которые мне понадобятся, и все? Как насчет нескольких объектов, которые все должны отображаться в разных местах? Как бы я это сделал? Чтобы упростить задачу, давайте представим, что я рендерил 5 круглых моделей в разных местах. Как будет выглядеть цикл для рендеринга этих пяти кругов. Можете ли вы привести пример? Спасибо. - person Pladnius Brooks; 13.12.2011
comment
Кроме того, я действительно извиняюсь за запутанную формулировку. То, что вы написали, именно то, что мне нужно, мне просто любопытно, как glTranslate и glRotate впишутся в функцию, отображающую несколько объектов в разных местах. - person Pladnius Brooks; 13.12.2011
comment
Я считаю, что для этого с матрицей представления модели потребуется перестроить матрицу для каждого объекта. поэтому цикл будет glLoadIdentity-> glRotate&Transform -> obj1.render -> glLoadIdentity -> glRotate&Transform -> obj2.render и так далее. Есть вероятность, что я могу ошибаться, но я думаю, что это так. - person jcage; 13.12.2011