-4 / 15 / 0
Регистрация: 07.07.2012
Сообщений: 91
1

Поворот объекта вокруг оси

04.01.2015, 20:29. Показов 8207. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. Знаю что подобная тема уже поднималась на форуме, но интересующий меня ответ я не нашёл. Пробовал искать (Гуглить), но нужного не нашёл.
Рисую сцену и (к примеру: один объект - полигон):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
void display (void)
{           
   glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
   glMatrixMode (GL_MODELVIEW);
   glPushMatrix ();
   glPolygonMode (GL_FRONT_AND_BACK, GL_FILL);
           glBegin(GL_POLYGON);
       ...//здесь рисую сцену...
       glEnd();
   }
       glPushMatrix ();
        glRotatef(ygol, 0.0, 0.0, 1.0);
        glTranslatef(v[0], 0.0f, 0.0f);
            glBegin(GL_POLYGON);
            {
                            ...//Здесь рисую сам объект...
            }
            glEnd();
        }
    glPopMatrix ();
   glPopMatrix ();
   glFlush ();
   glutSwapBuffers();
   glutPostRedisplay();
}
...
//Обработка нажатия клавиш.
void keyboard(unsigned char key, int x, int y)
{
   switch (key) 
   {
        case 'a':
            ygol+=0.8;
            break;
        case 'd':
            ygol-=0.8;
            break;
        case 'w':
            v[0]+=0.8;
            break;
        case 's':
            v[0]-=0.8;
            break;
   }
}
Суть в том, что после того как объект перемещается из точки "A", в точку "B", то далее разворот идёт не вокруг точки "B", а по оси "1" - т.е. вокруг (так я понимаю), начальных координат - т.е. точки "A".
А вот как развернуть объект после перемещения вокруг точки "B"?.
P.s.
Пробовал сначала переносить объект в начальные координаты->поворачивать-> переносить обратно:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
void display (void)
{           
   glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
   glMatrixMode (GL_MODELVIEW);
   glPushMatrix ();
   glPolygonMode (GL_FRONT_AND_BACK, GL_FILL);
           glBegin(GL_POLYGON);
       ...//здесь рисую сцену...
       glEnd();
   }
       glPushMatrix ();
        glTranslatef(0.0f, 0.0f, 0.0f);
        glRotatef(ygol, 0.0, 0.0, 1.0);
        glTranslatef(v[0], 0.0f, 0.0f);
            glBegin(GL_POLYGON);
            {
                            ...//Здесь рисую сам объект...
            }
            glEnd();
        }
    glPopMatrix ();
   glPopMatrix ();
   glFlush ();
   glutSwapBuffers();
   glutPostRedisplay();
}
...
//Обработка нажатия клавиш.
void keyboard(unsigned char key, int x, int y)
{
   switch (key) 
   {
        case 'a':
            ygol+=0.8;
            break;
        case 'd':
            ygol-=0.8;
            break;
        case 'w':
            v[0]+=0.8;
            break;
        case 's':
            v[0]-=0.8;
            break;
   }
}

Но эффекта 0.
Кто знает, или сталкивался с подобным, подскажите как развернуть объект после перемещения вокруг собственной оси (Точки "B")?
Миниатюры
Поворот объекта вокруг оси  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.01.2015, 20:29
Ответы с готовыми решениями:

Загадочный поворот вокруг оси x в OpenGL
Доброго времени суток всем. Мучаюсь над одной проблемой, а именно: поворот вокруг оси x с помощью...

Поворот вокруг произвольной оси в пространстве
Готовлюсь к экзамену, говорят препод ловит на всяких двусмысленностях и неправильных формулировках,...

Поворот вокруг своей оси (blender)
Глупый вопрос, но всёравно задаю его. Как повернуть объект вокруг своей оси? (либо я чтото не...

Не удается реализовать поворот елки вокруг своей оси по x и по у
У меня такая проблема, в OpenGL я почти ничего не понимаю, но ёлку реализовать получилось(не с...

8
8 / 8 / 2
Регистрация: 07.10.2014
Сообщений: 30
05.01.2015, 00:21 2
Razor64, доброго времени суток. Дабы решить данный вопрос, сначала применяйте к объекту вращение затем перемещение. Преобразования объекта можно хранить в виде матриц (например, либо в любой другой удобной форме).
0
-4 / 15 / 0
Регистрация: 07.07.2012
Сообщений: 91
05.01.2015, 02:45  [ТС] 3
rogl, доброго времени,
Цитата Сообщение от rogl Посмотреть сообщение
Дабы решить данный вопрос, сначала применяйте к объекту вращение затем перемещение.
а разве здесь -
C++
1
2
glRotatef(ygol, 0.0, 0.0, 1.0);
        glTranslatef(v[0], 0.0f, 0.0f);
, я не это делаю?!
Цитата Сообщение от rogl Посмотреть сообщение
Преобразования объекта можно хранить в виде матриц (например, либо в любой другой удобной форме).
- А вы могли бы, привести конкретный (рабочий) пример?
0
8 / 8 / 2
Регистрация: 07.10.2014
Сообщений: 30
05.01.2015, 03:52 4
Razor64, пример? А почему бы нет?! Раз. Два. Три. Четыре. Пять. Шесть. Семь. Восемь.
Наслаждайтесь =)
0
-4 / 15 / 0
Регистрация: 07.07.2012
Сообщений: 91
18.01.2015, 08:32  [ТС] 5
Цитата Сообщение от rogl Посмотреть сообщение
Наслаждайтесь =)
Вот вы дали 8 ссылок, я конечно и рад бы НАСЛАЖДАТЬСЯ, да только НЕЧЕМ! Ибо ничего кроме теории, лекций, и общих сведений там нет. Нет ни одного ПРИМЕРА работы с матрицами, векторами, квартерионами.
0
8 / 8 / 2
Регистрация: 07.10.2014
Сообщений: 30
18.01.2015, 08:46 6
Razor64, в конце статей под номерами: 2 и 3, есть ссылки на скачивание исходного кода. Остальные статьи, кроме: 1, 6 и 7, состоят из кода с пояснениями.
0
Программист велосипедист
161 / 48 / 7
Регистрация: 23.11.2014
Сообщений: 313
18.01.2015, 16:00 7
glLoadIdentity(); В помощь сброс матрицы проекции.
0
-4 / 15 / 0
Регистрация: 07.07.2012
Сообщений: 91
31.01.2015, 07:00  [ТС] 8
Ещё раз здрасьте, решил вопрос, ответ нашёл в книге "RedBook_OpenGL", вот фрагмент из неё, в котором описывается решение сего вопроса - Теперь поговорим о порядке, в котором вы задаете серии преобразований. Все видовые
и модельные преобразования представлены в виде матриц размерностью 4x4. Каждый
успешный вызов команды glMultMatrix*() или другой команды преобразования
умножает текущую видовую матрицу Cна новую (заданную вами явно или неявно)
матрицу M, в результате чего текущей матрицей становится CM. В итоге текущая
видовая матрица умножается на передаваемые по конвейеру вершины v. Этот процесс
означает, что последняя команда преобразования, вызванная в вашей программе, на
самом деле будет первой применена к вершинам: CMv. Таким образом, можно смотреть
на это как на необходимость задавать матрицы преобразований в обратном порядке.


Дело было в обратном порядке
0
129 / 126 / 22
Регистрация: 23.06.2009
Сообщений: 700
31.01.2015, 20:24 9
вообще простое и полуярное решение это возврат на текущее положение после поворта

Java
1
2
3
gl.glTranslatef(x,y,z);
gl.glRotatef(angle,0,1,0); //поворачиваем
gl.glTranslatef(-x,-y,-z); // возвращаем на место
таким образом обьекь поворачивает как нужно а не черт знает как по кругу или еще по какойт о не понятно траэктории.
0
31.01.2015, 20:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.01.2015, 20:24
Помогаю со студенческими работами здесь

Вращение объекта вокруг своей оси
Задаю вопрос впервые, так что попрошу не придираться к возможным ошибкам/недостатку инфы. Начал...

Вращение планеты вокруг солнца, и вокруг своей оси
У меня есть Солнце, которое находиться в координатах(0.0.0), и нужно вращать планеты, как по...

Вращать сферу вокруг центра координат, и одновременно вращать ее вокруг своей оси
Всем привет! Долблюсь о стену второй день ( Суть в том, что мне необходимо вращать сферу вокруг...

Поворот колеса вокруг центра
Привет Решил побаловаться с OpenGL и написать простенький просмотрщик .obj моделей. Использую c# и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru