Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
NEvOl
19 / 18 / 0
Регистрация: 13.08.2012
Сообщений: 727
#1

Поворот вокруг произвольной оси - C++

20.11.2013, 22:35. Просмотров 549. Ответов 5
Метки нет (Все метки)

Здравствуйте, пытаюсь реализовать функции поворота базиса вокруг произвольной оси, но почему-то немного не корректно работает, я не понимаю почему, есть предположение из-за неточности вычислений, можете подсказать что не так ?
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
        XMFLOAT3 right = XMFLOAT3(1, 0, 0);
    XMFLOAT3 up = XMFLOAT3(0, 1, 0);
    XMFLOAT3 target = XMFLOAT3(0, 0, 1);
 
void Rotation()
{
    static float angleX(0);
    static float angleY(0);
 
    if(GetAsyncKeyState(39))
    {
        if(angleX < XM_PI)
            angleX += 0.0001;
        else
            angleX = 0;
        RotAxis(up, -angleX);
        return;
    }
 
    if(GetAsyncKeyState(37))
    {
        if(angleX < XM_PI)
            angleX += 0.0001;
        else
            angleX = 0;
        RotAxis(up, angleX);
        return;
    }
 
    if(GetAsyncKeyState(38))
    {
        if(angleY < XM_PI)
            angleY += 0.0001;
        else
            angleY = 0;
 
        RotAxis(right, angleY);
 
    }
 
    if(GetAsyncKeyState(40))
    {
        if(angleY < XM_PI)
            angleY += 0.0001;
        else
            angleY = 0;
 
        RotAxis(right, -angleY);
    }
}
 
void RotAxis(XMFLOAT3 Axis, float Angle)
{
    float AngleBetZAndAx = GetAngleBetweenVec(XMFLOAT3(0, Axis.y, Axis.z), XMFLOAT3(0, 1, 0));
    if(AngleBetZAndAx)
    {
        RotX(up, AngleBetZAndAx);
        RotX(right, AngleBetZAndAx);
        RotX(target, AngleBetZAndAx);
        RotX(Axis,  AngleBetZAndAx);
    }
    
    float AngleBetXAndAx = GetAngleBetweenVec(XMFLOAT3(Axis.x, Axis.y, 0) , XMFLOAT3(0, 1, 0));
        
    
    if(AngleBetXAndAx)
    {
        RotZ(up, AngleBetXAndAx);
        RotZ(right, AngleBetXAndAx);
        RotZ(target, AngleBetXAndAx);
    }
    
    RotY(up, Angle);
    RotY(right, Angle);
    RotY(target, Angle);
    
    if(AngleBetXAndAx)
    {
        RotZ(up, -AngleBetXAndAx);
        RotZ(right, -AngleBetXAndAx);
        RotZ(target, -AngleBetXAndAx);
    }
 
    if(AngleBetZAndAx)
    {
        RotX(up, -AngleBetZAndAx);
        RotX(right, -AngleBetZAndAx);
        RotX(target, -AngleBetZAndAx);
    }   
}
 
float GetAngleBetweenVec(XMFLOAT3 a, XMFLOAT3 b)
{
    float lenA = GetLenght(a);
    float lenB = GetLenght(b);
 
    if(!lenA)
        return 0;
 
    if(lenA != 1)
        a = Normalize(a);
    if(lenB != 1)
        b = Normalize(b);
 
    float x = a.x*b.x;
    float y = a.y*b.y;
    float z = a.z*b.z;
 
    float scal = x + y + z;
    if(scal)
        return acos(scal);
    else
        return XM_PIDIV2;
}
 
float Cam::GetLenght(XMFLOAT3 a)
{
    return sqrt((DOUBLE)(a.x*a.x + a.y*a.y + a.z*a.z));
}
 
void RotX(XMFLOAT3 &a, float Angle)
{
    XMMATRIX rotX;
    rotX._11 = 1; rotX._12 = 0;       rotX._13 = 0;                 
    rotX._21 = 0; rotX._22 = cos(Angle);  rotX._23 = sin(Angle);
    rotX._31 = 0; rotX._32 = -sin(Angle); rotX._33 = cos(Angle);
 
    float x = a.x * rotX._11 + a.y * rotX._21 + a.z * rotX._31;
    float y = a.x * rotX._12 + a.y * rotX._22 + a.z * rotX._32;
    float z = a.x * rotX._13 + a.y * rotX._23 + a.z * rotX._33;
 
    a.x = x;
    a.y = y;
    a.z = z;
}
 
void RotY(XMFLOAT3 &a, float Angle)
{
    XMMATRIX rotY;
    rotY._11 = cos(Angle);  rotY._12 = 0; rotY._13 = -sin(Angle);
    rotY._21 = 0;                   rotY._22 = 1; rotY._23 = 0;                 
    rotY._31 = sin(Angle);  rotY._32 = 0; rotY._33 = cos(Angle); 
 
    float x = a.x * rotY._11 + a.y * rotY._21 + a.z * rotY._31;
    float y = a.x * rotY._12 + a.y * rotY._22 + a.z * rotY._32;
    float z = a.x * rotY._13 + a.y * rotY._23 + a.z * rotY._33;
    
    a.x = x;
    a.y = y;
    a.z = z;
}
 
void RotZ(XMFLOAT3 &a, float Angle)
{
    XMMATRIX rotZ;
    rotZ._11 = cos(Angle);  rotZ._12 = sin(Angle);  rotZ._13 = 0;
    rotZ._21 = -sin(Angle); rotZ._22 = cos(Angle);  rotZ._23 = 0;
    rotZ._31 = 0;       rotZ._32 = 0;       rotZ._33 = 1;
 
    float x = a.x * rotZ._11 + a.y * rotZ._21 + a.z * rotZ._31;
    float y = a.x * rotZ._12 + a.y * rotZ._22 + a.z * rotZ._32;
    float z = a.x * rotZ._13 + a.y * rotZ._23 + a.z * rotZ._33;
 
    a.x = x;
    a.y = y;
    a.z = z;
 
}
по началу все нормально работает но спустя несколько оборотов начинается какой-то скос и в конце концов вообще виляет непонятно как.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.11.2013, 22:35
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Поворот вокруг произвольной оси (C++):

Поворот треугольника (вокруг центра) - C++
Есть функция которая рисует треугольник по трём точкам. Эти точки заданы координатами(ху). В классе переменной pvo содержатся все 6...

Поворот матрицы вокруг главной диагонали - C++
Собственно, сама задача, я её сделал методом индексации, указатели только начали изучать, только вот не пойму как матрицу транспонировать...

Вращение прямоугольника вокруг оси - C++
Программа должна вращать прямоугольник с заданными параметрами длины и ширины, вокруг оси. Общий алгоритм приведен ниже. Вопрос: как...

Преобразовать квадратную матрицу, осуществив поворот элементов вокруг центра - C++
Преобразовать квадратную матрицу, осуществив поворот элементов вокруг центра матрицы на 90 градусов против часовой стрелки. Предусмотреть...

Нарисовать треугольник, вращающийся вокруг своей оси - C++
Помогите ! Нужно нарисовать равносторонний треугольник и сделать так, чтобы он крутился вокруг своей оси

Вращение объекта вокруг оси. Матрицы поворота. - C++
добрый день, нужно сделать программу вращение куба вокруг оси z. Применил матрицу поворота к точкам и они далеко отошли От заданных. Не...

5
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
20.11.2013, 23:30 #2
NEvOl, чему равно XM_PI?
0
NEvOl
19 / 18 / 0
Регистрация: 13.08.2012
Сообщений: 727
21.11.2013, 07:41  [ТС] #3
Это константа длинная там 1.57.....
0
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
21.11.2013, 08:53 #4
Цитата Сообщение от NEvOl Посмотреть сообщение
Это константа длинная там 1.57.....
В общем, вы вращаете на 360 градусов, а это значит 2*Pi = 2*3,14159 = 6.283

Добавлено через 1 минуту
то есть получается, что повернув на 90 градусов вы сбрасываете значение угла до нуля.

Добавлено через 1 минуту
Цитата Сообщение от NEvOl Посмотреть сообщение
Это константа длинная там 1.57.....
а не 3,14159 ?
0
NEvOl
19 / 18 / 0
Регистрация: 13.08.2012
Сообщений: 727
21.11.2013, 15:24  [ТС] #5
Цитата Сообщение от programina Посмотреть сообщение
В общем, вы вращаете на 360 градусов, а это значит 2*Pi = 2*3,14159 = 6.283

Добавлено через 1 минуту
то есть получается, что повернув на 90 градусов вы сбрасываете значение угла до нуля.

Добавлено через 1 минуту


а не 3,14159 ?
а да 3.14159 не туда глянул)
0
Excalibur921
675 / 383 / 59
Регистрация: 12.10.2013
Сообщений: 2,646
12.09.2017, 13:19 #6
Два способа поворота вокруг произвольной оси в 3д:
1)Матрица поворота вокруг произвольной оси в 3д.
Как развернуть одну из координат угла
2)Выражение матрицы поворота через кватернион.
Как развернуть одну из координат угла
0
12.09.2017, 13:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.09.2017, 13:19
Привет! Вот еще темы с ответами:

Вращательное движение абсолютно твердого тела вокруг неподвижной оси - C++
Здравствуйте, помогите, пожалуйста, написать код. Нужно описать движение кабинки колеса обозрения или неподвижной педали велосипеда...

Как сделать, чтобы задаваемый текст вращался вокруг своей оси, изменяя цвет? - C++
С графикой увы не работали, но нужно сдать любую работу по графике в C++. Совсем нет времени, чтобы самому вникнуть в тему. Если не...

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

Поворот куба сначала вокруг оси y с.к. экрана потом вокруг оси x с.к. экрана - Программирование Android
Предыстория: Я пишу 3D игру и там соответственно нужно производить поворот тела в пространстве. нужно делать 2 поворота по горизонтали и...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru