Войти
OpenGL communityФорумВопросы по программированию

Поворот "своих" осей в изометрии.

#0
21:10, 26 апр. 2017

Здравствуйте!
Не могу справиться с поворотом в изометрии. Во вложении архив с исходниками С++ Builder XE. Задача простая, поворачивать оси "свои", в каждом из четырех видов. В изометрии накапливается ошибка. Пробовал с glMatrixMode(GL_MODELVIEW); glLoadIdentity(); с абсолютным приращением угла. Оси начинают "прыгать". Подозреваю что необходимо копать в сторону перемножения матриц. Может быть кто-то сталкивался с подобной проблемой?! Есть ли пример или готовый обработчик поворота сразу по трем осям и углу?!
glRotate(new_anle, pos_x, pos_y, pos_z); Чтобы можно было рассчитать новое положение вектора и угла и подставить их в штатную функцию?! Спасибо.

ЗЫ В папке Debug есть экзешник.  Просто наводите курсор на нужный вид и крутите колесико. В функции Draw_ALL()  - wglMakeCurrent(DU_view_IZO, KO_view_IZO); и далее...

glRotate


#1
22:20, 28 апр. 2017

Во первых-надо не доворачивать, а поворачивать всегда из начального положения, тогда ничего никуда не накопиться.
Во вторых - понять какой нужен порядок поворота по осям.
В третьих - погуглить квартенион, он как раз для сложных вращений и нужен
В четвертых-не надо glRotate. погуглите OpenGL Mathematics (GLM). все что нужно от Opengl это LoadMatrix, и то лучше тупо написать шейдер из двух строк и пихать матрицу прямо в него униформом.
Будет реально меньше проблем.

#2
11:39, 29 апр. 2017

Спасибо за ответ!

1.Сделаем...
2.Порядок поворота случайный. Приходят данные с гироскопа и соответственно поворачиваем каждый вид (как на чертеже) и изометрию крутим, вот изометрия и не получается.
  Если доворачивать то при возвращении в "ноль" по осям изометрия сбивается а если после лоадидентити то после поворота по одной оси потом по другой оси как бы перепрыгивают(гимбал лок я так понимаю).
3.Уже изучаю буду пробовать. Наверное это решение
4.Во всех книжках советуют штатный поворот использовать для экономии ресурсов и быстродействия. Встречал пару раз мысль что OPGL все делает сам без кватернионов просто мы не умеем его "готовить", решение от профессионалов скорее всего оч изящное скорее всего пару строк, хоть одним глазком бы посмотреть(применительно к моей задаче (:<<  ). С шейдерами не знаком пока.

ЗЫ Задачка то у меня простая: пришел вектор и угол повернули где надо + изометрия, будь она не ладна...

#3
11:48, 29 апр. 2017

Вот тут про класс кватернионов - Класс кватернионов.
А тут про Gimbal lock - Gimbal lock.

#4
19:46, 30 апр. 2017

Парни посмотрите должно работать, а не работает -

1) вариант:

glViewport((Panel1->Width/2)+1, 0, (Panel1->Width/2)-1, (Panel1->Height/2));
glScissor((Panel1->Width/2)+1, 0, (Panel1->Width/2)-1, (Panel1->Height/2));
glClearColor(0.85, 0.85, 0.85, 0.0);
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);

glPushMatrix();
gluLookAt(1.0,-1.0,1.0,   0.0,0.0,0.0,   0.0,1.0,0.0);

switch (okno)
{
case okno_1:  {
        glRotatef(angle_XY,0,0,1);
        break;
      }
case okno_2:  {
        glRotatef(angle_YZ,1,0,0);
        break;
      }
case okno_3:  {
        glRotatef(angle_XZ,0,1,0);
        break;
      }
}

Draw_Axis();

glPopMatrix();

SwapBuffers(ghDC);

angle_XY = 0;
angle_YZ = 0;
angle_XZ = 0;

- колесом мышки устанавливаем угол (+10/-10) в зависимости от текущего окна

2) вариант:

glViewport((Panel1->Width/2)+1, 0, (Panel1->Width/2)-1, (Panel1->Height/2));
glScissor((Panel1->Width/2)+1, 0, (Panel1->Width/2)-1, (Panel1->Height/2));
glClearColor(0.85, 0.85, 0.85, 0.0);
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glPushMatrix();

gluLookAt(1.0,-1.0,1.0,   0.0,0.0,0.0,   0.0,1.0,0.0);

switch (okno)
{
case okno_1:  {
      glRotatef(angle_XY,0,0,1);
      break;
      }
case okno_2:  {
        glRotatef(angle_YZ,1,0,0);          
        break;
      }
case okno_3:  {
        glRotatef(angle_XZ,0,1,0);             
        break;
      }
}

Draw_Axis();

glPopMatrix();
  
SwapBuffers(ghDC);

-колесом мыши инкремент/декремент угла(одного) в зависимости от выбранного окна

#5
19:50, 30 апр. 2017

Задача простая сделать корректный поворот в изометрии, угол изменяется случайно, данные приходят с гироскопа в первом варианте почти все ок только вот в исходную точку не возвращаются оси. Во втором варианте в исходное состояние возвращается но при поворотах по разным углам изометрия "скачет".

#6
9:48, 4 мая 2017

Бро. последовательные повороты по осям есть умножение матриц поворотов, финальный результат зависит от порядка.
Пушка на башне поднимаеться/опускаеться, башня вертится, корабль качается- если применить операции в другом порядке, все к чертям перекосит.
В финале должна применяться одна единственная матрица поворота, полученная произведением поворотов по осям- тем вокруг которых объект реально вертится, а не координатным.
Квартенион опять таки  нужен для того чтобы посчитать эту матрицу.
встроенный OpenGL поворот выкинь на помойку, он вертит не то и не туда. Им можно воспользоваться в простых случаях и то если досконально разобраться что он делает.
Если случай хреновый и известны именно углы эйлера по осям- опять таки, есть готовые библиотечные функции специально для этого, на выходе опять матрица.

OpenGL communityФорумВопросы по программированию

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