LINUX.ORG.RU

OpenGL. Поворот вокруг объекта. Чего-то глобально не понимаю


0

1

«Прошел» интуитовский курс алгоритмических основ 3d-графики, правда, запомнил не много. Читал суперкнигу, казалось, что всё понимаю. Дошел уже до кубических текстур, попробовал с нуля сделать что-нибудь, не заглядывая в примеры. Не получилось. Вращающийся треугольник вращается вокруг «камеры»(я уже знаю, что это понятие некорректно, но мыслить матрицами (пока?) не получается). Попробовал добавить pushMatrix и popMatrix - никакого эффекта.

Нашел способ на rsdn(переместить GL_MODELVIEW в точку, вокруг которой будет поворот, повернуть, вернуться в исходную) - не понял, что это значит(зачем перемещаться туда и обратно), но решил применить по принципу «это сильное колдунство». В результате треугольник просто попал в плоскость отсечения и все вообще пропало.

	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);		
	glMatrixMode(GL_MODELVIEW);
	glPushMatrix();
	rot+=3;
	//glTranslatef(0,0,12);
	glRotatef(rot,0.0,1.0,0.0);
	glColor3f(0.8,0.5,0);
	glBegin(GL_TRIANGLES);
	glVertex3f(1.0,1.0,-12.0);
	glVertex3f(-1.0,1.0,-12.0);
	glVertex3f(0.0,-1.0,-12.0);
	//glTranslatef(0.0,0.0,-12.0);
	glEnd();
	glPopMatrix();
	glutSwapBuffers()
1)Существует ли учебник openGL(лучше хотя бы 2 версии) с заданиями для самоконтроля?

2)Как перестать думать в терминах 3d редактора(камера, глобальные/локальные координаты объекта - всё это аналогично обычному, не математическому миру) и начать понимать матрицы, а не просто, зажмурившись, применять функции на ощупь? В смысле, с какой книги начать. Или это чувство либо есть, либо нет от рождения и ничего не сделать?

★★★★

Да несложно же там все с поворотами. Главное, внимательно вникать в то, что делаете. Я вот, к примеру, недавно полвечера убил, пытаясь понять, почему у меня источник света движется не вместе с наблюдателем, а в противоположную сторону. Оказалось, искал не там: я просто при вычислении нормалей забыл «перевернуть» координату Y.

А так, в той же «красной книге» все с примерами хорошо описано. И еще там пособия от какого-то Нейта советуют скачать и пощупать. Ну и не забывайте, что применение некоторых преобразований к «камере» эквивалентно применению противоположных преобразований ко всей сцене, если «камера» неподвижна.

Eddy_Em ☆☆☆☆☆
()

Если уж не можешь осилить матрицы, то man gluLookAt и не трахай лору мозги.

redgremlin ★★★★★
()

зачем перемещаться туда и обратно

Затем, что:

Вращающийся треугольник вращается вокруг «камеры»

ставим на «точку отсчета», поворачиваем, возвращаем на старую позицию, отображаем.

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glTranslated(x, y, 0);
glRotatef(rotate_angle,0,0,1);
glTranslated(old_pos[last], old_pos[last], 0);

УМВР

cx ★★
()

требуется _вокруг_ неподвижной камеры?

тогда кроме rotate надо и про translate не забыть.

позиция в момент времени t {A*cos(B*t); A*sin(B*t)}. что-то в таком духе. ну, и поворачивать так, чтобы нормаль была направлена в камеру.

unnamed
()
Ответ на: комментарий от cx

а, понятно. Я думал, наоборот, точку отсчета переместить туда, где треугольник. Попробовал так повращать мобильник над книгой, действительно всё выглядит, как будто вращаемся вокруг него.

А как узнать, куда именно транслировать матрицу на последнем шаге, ведь у каждой точки - свои координаты? Я попробовал переносить в центр трёх точек(примерный), но ничего не изменилось

wingear ★★★★
() автор топика

Тебе нужно вращать камеру вокруг определённого объекта в сцене?

Представь, как бы ты камеру выставлял по координатам в реальности: сначала из мировых координат попасть в координаты объекта; потом повернуть систему координат на нужный угол; потом переставить камеру на нужное расстояние от объекта. В итоге камера смотрит на объект.

Теперь вспоминаем, что преобразование координаты точки на итоговой матрице производится в порядке, обратном умножению самих матриц. Значит нам нужно: выполнить перемещение на расстояние от объекта до камеры, выполнить поворот, выполнить перемещение в центр мировых координат, а затем рисовать объекты сцены.

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

Я просто почему-то решил, что надо сначала нарисовать, потом вернуться. Спасибо

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