LINUX.ORG.RU

Не понимаю, что такое GL_MODELVIEW


0

1

Когда мы делаем, например, поворот функцией glRotatef, воздействие идет на координаты камеры или всех объектов? Можно ли подвинуть отдельный объект, а не камеру? Мне казалось, трехмерная сцена строится на мировой, видовой и проекционной матрицах, а в openGL, похоже, матрицы камеры и сцены слиты в одну. Или координаты камеры встроены и проекционную матрицу?

★★★★

> воздействие идет на координаты камеры или всех объектов?

Воздействие идёт на матрицу, которая преобразует локальные координаты в фактические координаты, на которых будет осуществляться рендеринг.

«Координаты камеры или всех объектов» существуют отдельно только в контексте мировых координат, а у нас их тут нет.

Или координаты камеры встроены и проекционную матрицу?

Всё просто: как настроишь матрицу, так и будет.

geekless ★★
()

У вас путаница в голове. Причина проста — в OpenGL отсутствует такое понятие как «камера» в принципе. Есть трёхмерное видовое пространство (то самое GL_MODELVIEW), в котором центр проекции (по-вашему — «камера») всегда намертво прибит к координатам (0,0,0) и смотрит в сторону -Z. А операторы трансформации матрицы двигают точку рисования (относительно которой будут рисоваться примитивы) в этом видовом пространстве. Чтобы не городить 100500 функций над разными матрицами, все они склеены в один набор, а какая текущая матрица выбирается с помощью glMatrix().

Dendy ★★★★★
()

Ищи и читай Opengl суперкнига
Там все написано на понятном языке + под *nix есть примеры

deterok ★★★★★
()
Ответ на: комментарий от wingear

Перед тем, как что-то нарисовать на экране, openGL делает уйму преобразований, используя матричные операторы. Если вы находитесь в модельно-видовом режиме, изменяется лишь текущая матрица (т.е. если вы сделали popmatrix, изменение матрицы, рисование примитивов, pushmatrix, измененная матрица отразится лишь на объектах между pushmatrix и popmatrix). В режиме проекции уже все нарисовано, поэтому изменение матрицы приводит к изменению всей картины в целом. Поэтому для некоторых операций у вас может быть несколько вариантов. Например, чтобы повернуть всю сцену, вы можете либо до ее рисования вызвать применить матрицу поворота в модельно-видовом режиме, либо же применить обратную ей матрицу в режиме проекции...

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от wingear

А точка рисования где расположена относительно центра проекции?

Координаты точки проходят, при помощи трансформации по текущей матрице, все те преобразования, которые были применены к данной матрице, в обратном порядке.

 Рассмотрим код , в котором будет нарисована точка и к ней применим 3 преобразования :

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glMultMatrixf(N);                /* transformation N */
glMultMatrixf(M);                /* transformation M */
glMultMatrixf(L);                /* transformation L */
glBegin(GL_POINTS);
glVertex3f(v);                   /* draw transformed vertex v */
glEnd();


На 1-м  шаге modelview matrix представляет из себя ни что иное , как матрицу идентичности .
Затем она умножается на N , потом  на М , потом на L . Результирующая точка есть NMLv .
Преобразования точки происходят в порядке , ОБРАТНОМ порядку перемножения матриц :
сначала точка умножается на L , потом на M , потом на N .

  OpenGL имеет 3 команды для моделирования преобразований :
glTranslate*(), glRotate*(), and glScale*() . Их можно интерпретировать как создание матриц
translation, rotation, scaling с последующим вызовом glMultMatrix*() . Вроде как вызов
этих команд работает быстрее самой glMultMatrix*() .
  glTranslate{) - умножает текущую матрицу на translate-матрицу , двигает обьект
по осям X , Y , Z .
 glRotate{} -  умножает текущую матрицу на rotate-матрицу против часовой стрелки .
 glScale{) -   умножает текущую матрицу на матрицу масштабирования , наиболее тормозная
               из этих 3-х функций , поскольку происходит повторный пересчет нормальных
               векторов .
geekless ★★
()
Ответ на: комментарий от Eddy_Em

Похоже человек не понимает как Opengl устроен, и в нем то же, что и женщина в автомобиле (оператор -> (*МаГиЯ*) -> Графика)
Кстати, а какой размер у стека проекционных матриц в linux ? (Все руки никак не дойдут посмотреть)

deterok ★★★★★
()
Ответ на: комментарий от Eddy_Em

понятно, а текущая матрица(в данном случае - modelView) тоже размером 4х4 и потом на неё умножаются все вершины между glBegin и glEnd? Или это массив матриц? Как-то не верится, что пространство можно задать 16 числами. Хотя нет, пространство-то состоит из примитивов, которые рисует glut. Кажется, более-менее ясно

wingear ★★★★
() автор топика
Ответ на: комментарий от Eddy_Em

Eddy_Em

Не интересовался (я больше трех не использую)

Да я тоже, просто решил увеличить свои познания в этом

Eddy_Em

Вот. Простой перевод красной книги.

Полистал в инете, понравилось, заказал

deterok ★★★★★
()
Ответ на: комментарий от wingear

> Как-то не верится, что пространство можно задать 16 числами.

лицоладонь.txt

Немедленно в гугл — искать матчасть.

понятно, а текущая матрица(в данном случае - modelView) тоже размером 4х4 и потом на неё умножаются все вершины между glBegin и glEnd?

В цитате выше всё написано.

Сначала координата умножается на modelview, что переводит локальную координату в координату относительно камеры. Затем она умножается на проекционную матрицу, что даёт экранные координаты и глубину. (В фиксированном конвейере, по крайней мере. В программируемом это делает вершинный шейдер, в который можно впихнуть любой код.)

Сама modelview формируется, как правило, как последовательность перемножений матриц, выполняющих отдельные преобразования: повороты, переносы и масштабирования.

geekless ★★
()
Ответ на: комментарий от wingear

> Хотя нет, пространство-то состоит из примитивов, которые рисует glut.

АААААА!!!

geekless ★★
()
Ответ на: комментарий от deterok

Ага, как раз на 4 главе, попробовал модифицировать код, понял, что не понимаю, что делаю, оказалось как обычно - «если ничего не помогает, попробуйте прочитать инструкцию»:)

wingear ★★★★
() автор топика
Ответ на: комментарий от wingear

Вы с основами сразу разберитесь, а то дальше вообще непонятно будет. И математику подучить неплохо, чтобы понять главу про NURBS, да и просто представлять себе, как все эти преобразования происходят.

Eddy_Em ☆☆☆☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.