OpenGl меняет единицу измерения для системы координат

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

Я думаю, что я немного запутался, скажем, я хочу использовать футы и дюймы для своего мира, и я хочу построить интерьер своего дома. Буду ли я просто использовать переводы (x (футы), y (футы), z (футы)), дополнительные, или есть какая-то функция, чтобы изменить ваши мировые координаты x, y (т.е. изменить значение по умолчанию с -1/+1 на позволяет скажем (-20/20).Я знаю, что openGl конвертирует все оставшиеся единицы.

Итак, я думаю, что мой самый большой пробел в знаниях заключается в том, как моделировать объекты реального мира (длины), чтобы иметь смысл в OPenGL?


person nagates    schedule 11.09.2011    source источник
comment
Могу ли я сделать такое масштабирование и сказать, что 20/20 = 1 единица opengl, и сказать, что у меня есть что-то 5 футов, будет ли это длина 5/20 или 0,25, и просто вручную выполнить все масштабирование таким образом?   -  person nagates    schedule 11.09.2011


Ответы (4)


Я думаю, что автор имеет в виду нормализованные координаты (координаты устройства), которые появляются после разделения перспективы.

Обычно, когда вы фактически манипулируете объектами в OpenGL, вы используете стандартные мировые координаты, которые не ограничены -1/+1. Эти мировые координаты могут быть какими угодно и переводятся в нормализованные координаты путем умножения на матрицы представления модели и проекции, а затем деления на однородную координату 'w'.

OpenGL сделает все это за вас (пока вы не перейдете к шейдерам), так что не беспокойтесь о нормализованных координатах.

person Ron Warholic    schedule 11.09.2011
comment
хорошо, если бы я хотел сделать комнату размером 20x20 футов, скажем, я бы просто настроил свой квадрат, чтобы он был чем-то вроде grayFloorBatch.Begin(GL_TRIANGLE_STRIP,4); greyFloorBatch.Vertex3f(-10.0f, -.56f,-10.0f); greyFloorBatch.Vertex3f(10.0f, -.56f, -10.0f); greyFloorBatch.Vertex3f(-10.0f, -.56f,10.0f); greyFloorBatch.Vertex3f(10.0f, -.56f,10.0f); GrayFloorBatch.End(); Вы обычно делите свои объекты пополам вокруг 0, 0, 0 или вы можете просто построить положительный квадрант, просто используя все 20 вместо 10? - person nagates; 11.09.2011
comment
Я играл с примером копья, если это кому-то поможет. - person nagates; 11.09.2011
comment
То, что вы делаете, в принципе выглядит нормально (я не проверял ваши цифры). Как правило, чтобы сделать хорошую программу общего назначения, вы должны определить свою геометрию в пространстве объектов (с локальным источником) и использовать преобразования (переводы и т. д.), чтобы поместить ее в правильное место в мировом пространстве. - person Ron Warholic; 12.09.2011
comment
так что, если у меня есть что-то 20x20, это могут быть футы или сантиметры, мой выбор, верно? Однако если его сантиметры, то это кажется довольно большим, совсем не в масштабе. - person nagates; 12.09.2011
comment
Ага, на ваш выбор. Я бы рискнул сохранить небольшое количество ваших единиц измерения как для отладки, так и для точности. Во многих играх в качестве базовой единицы измерения используются метры или футы. - person Ron Warholic; 12.09.2011

Ну все относительно. Если вы установите 1 единицу OpenGL равной 1 метру, а затем построите все идеально для масштабирования на этой основе, то у вас будет нужный масштаб (т.е. 10 метров будут 10 единицами OpenGL, а 1 миллиметр будет 0,001 единицы OpenGL.

Однако если вы затем представите модель, которая была разработана таким образом, что 1 единица OpenGL = 1 футу, то объект в конечном итоге будет примерно в 3 раза больше.

Конечно, вы можете переключаться между различными методами, но, безусловно, лучший способ сделать это — изменить масштаб вашей модели перед загрузкой ее в ваш движок.

person Goz    schedule 11.09.2011

…однако при программировании в 3D-перспективе мировые координаты равны +1/-1.

Говорит кто? Возможно, вы имеете в виду пространство отсечения, однако это всего лишь одно специальное пространство, в котором все координаты после проекции.

Ваши мировые единицы могут быть чем угодно. Соответствующая часть заключается в том, как они проецируются. Скажем, у вас есть перспективная проекция 90 ° FOV, ближняя плоскость отсечения - 0,01, дальняя плоскость отсечения - 10,0, квадратичный аспект (для простоты). Тогда объем вашего взгляда на мир будет разрешать прямоугольник с длинами сторон 0,01 и 0,01 на расстоянии близко к зрителю и растягиваться до 10,0 на расстоянии с длиной стороны 0,02. Уменьшите FOV, и соответственно уменьшится боковая длина.

Тем не менее, координаты примерно в диапазоне от 0,01 до 10 проецируются в пространство клипа +/-1.

Таким образом, вы можете выбрать пределы проекции, чтобы они соответствовали вашей сцене и выбранным единицам измерения.

person datenwolf    schedule 11.09.2011
comment
Я думаю, что пространство клипа частично связано с моим замешательством. - person nagates; 12.09.2011

Диапазон нормализованных координат окна всегда от -1 до +1. Но его можно использовать по своему усмотрению. Предположим, нам нужен диапазон от -100 до +100, а затем разделите фактическую координату на 100. В этом случае используйте только функцию glVertex2f или glVertex3f. например glVertex2f(10/100,10/100).

person chandan kumar    schedule 06.02.2013