Войти
ПрограммированиеФорумГрафика

opengl пошаговые повороты и угол поворота

#0
9:22, 14 мар. 2016

Здравствуйте! Очень хочу разобраться в следующей задаче. Может кому-нибудь приходилось ее решать.

Мне нужно сделать вращение объекта относительно 2х осей, в мировой системе координат ( в моем случае это x и z). Точка вращение = центр фигуры.
Пусть для простоты будет только вращение, без смещений.  Я хочу вращать по частям, а не накапливать в переменных полный угол вращения.
Поясню, например мне надо за 2 (или 3 и т.д.) раза повернуть фигуру на
20 градусов вокруг оси х и вокруг оси z и затем на 30, вроде бы логично, что в сумме фигура повернулась на 50 градусов вокруг этих осей.

Т.е. пользователь может многократно поворачивать фигуру на какие-то углы ХА1, ХА2, ZA1, ZA2, и т.д.

Вроде бы ничего сложного, пытаюсь это сделать так:

Шаг 1. Создаю матрицу MT, в которой я буду хранить все преобразования и
делаю ее единичной

Метод paintGL()
{

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
// т.к. пока никаких преобразований не применялось локальная система совпадает с мировой
//Нахожу точку вращения (xx,yy,zz) и перемещаю начало координат в точку вращения и вращаю
// я могу делать вращение с помощью матриц, это без разницы, просто пишу так, чтобы было понятнее.

glTranslatef(xx ,yy,  zz);  //смещение
glRotatef(xRot, 1.0f, 0.0f, 0.0f);  //вращение
glRotatef(zRot, 0.0f,0.0f, 1.0f); // вращение
glTranslatef(-xx ,-yy,  -zz);

glMultMatrixf(MT); // применяю матрицу ранее выполненных преобразований, вначале это единичная матрица

glGetFloatv( GL_MODELVIEW_MATRIX , MT); // запоминаю матрицу с учетом уже выполненных поворотов.

Отрисовываю фигуру.

Обнуляю углы поворота.
}

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

вращение на 30 градусов + повторное вращение на 20 градусов  =/= не дает вращение 50 градусов.
Если писать преобразование на листке формулами это тоже видно. Значит такое решение задачи не подходит.

Была попытка сделать тоже самое по-другому.
1. Вначале применить матрицу предыдущих преобразований (вначале она единичная)
2. Найти в новой системе координат вектора, совпадающие с осями x и z в мировой системе
3. Сделать вращение вокруг этих произвольных осей (векторов).
4. Обнулить угол вращения.
Все равно какая-то ерудна получается.

Т.е. вращение есть, но картинка выходит очень странная.
Извиняюсь за длинную писанину. Чего-то я видимо не понимаю.    Думаю еще попробовать вращение с кватернионами, но как-то глупо пробовать что-то еще, если я не понимаю какой-то сути.
Прикладываю картинку, чтобы наглядно было видно, что я имею в виду.
Иллюстрация | opengl пошаговые повороты и угол поворота


#1
10:34, 14 мар. 2016

lee111
Попробуй матрицы умножить в обратном порядке.
Я бы рекомендовал всегда строить матрицу с нуля и не умножать старую на новую, так как это приводит к накоплению погрешности.

#2
11:43, 14 мар. 2016

Возможно сам неправильно матрицы составляешь или лишний раз транспонируешь перед передачей в Опенгл.

#3
11:46, 15 мар. 2016

Executor, спасибо за ответ, но умножение матриц в обратном порядке не помогает.
Если применить в начале матрицу сохраненных преобразований (MT), а только потом поворот. то поворот будет выполнен относительно локальных координат, а не мировых.
Если поменять местами матрицы поворота т.е. сделать его вначале относительно оси Z, а потом Х, то это также приводит к искажениям.

Только что только остается сохранять все историю преобразований и потом восстанавливать их. Жаль.

Reviri , тоже спасибо за ответ. Была у меня такая же мысль, что где-то что-то транспонируется не там, т.к. Opengl работает с column-oriented матрицами. Т.е. те матрицы, которые из теории нужно транспонировать.
Но к сожалению тут ошибки нет. Все правильно. Даже если убрать матрицы, а использовать функции  т.е. трансляция и поворот, все приводит к искажениям.

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

Ниже добавлю картинку, которая показывает почему этот мой вариант не работает. С точки зрения матричного перемножения, видно, что поворот на угол альфа+бета =/= композиции преобразований альфа и затем бета.
opengl_formula_web | opengl пошаговые повороты и угол поворота

#4
13:22, 15 мар. 2016

Executor
> строить матрицу с нуля и не умножать старую на новую, так как это приводит к
> накоплению погрешности
+1

ПрограммированиеФорумГрафика

Тема в архиве.