Форум по программированию Delphi Sources

 



Вернуться   Форум по программированию Delphi Sources > Все о Delphi > Графика и игры
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 24.11.2017, 07:01
PavelG2010 PavelG2010 вне форума
Прохожий
 
Регистрация: 24.03.2014
Сообщения: 3
Версия Delphi: Delphi xe2
Репутация: 10
Вопрос OpenGL Кватернионы Поиск конечных углов поворота

Добрый день!

Рисую объекты по следующему коду:
Код:
glPushMatrix;
  for I := 0 to 99 do
  begin
    glColor3f(1,i/255,i/255);
    glTranslatef(3,0,0);
    glRotatef(10,1,0,0);
    glRotatef(10,0,1,0);
    glRotatef(10,0,0,1);
    RenderBox;//Рисует кубик
  end;
  glPopMatrix;
При этом с каждой итерацией цикла поворот кубика увеличивается в последовательность X,Y,Z.
Мне необходимо вычислить конечные координаты каждого последующего кубика.
Код:
Var
u:TPoint3d; 
Pold:array [-1..99] of TPoint3d; 
Uold:array [-1..99] of TPoint3d;
……….
Код:
u.x:=10;
  u.y:=10;
  u.z:=10;
  Pold [-1].X:=0;
  Pold [-1].Y:=0;
  Pold [-1].Z:=0; 
  Uold [-1].X:=0;
  Uold [-1].Y:=0;
  Uold [-1].Z:=0;
  for I := 0 to 99 do
  begin
    glPushMatrix;
    glLoadIdentity;
    glTranslatef(Pold [i-1].X, Pold [i-1].Y, Pold [i-1].Z);
    glRotatef(Uold.X,1,0,0);
    glRotatef(Uold.Y,0,1,0);
    glRotatef(Uold.Z,0,0,1);
    glTranslatef(3,0,0);
    glRotatef(u.x,1,0,0);
    glRotatef(u.y,0,1,0);
    glRotatef(u.z,0,0,1);
    Uold [i]:=Summ(Uold [i-1],u);// Функция Summ находет конечные углы поворота.
    glGetFloatv(GL_MODELVIEW_MATRIX,@M_M);
    Pold [i].X:=M_M[12];
    Pold [i].Y:=M_M[13];
    Pold[i].Z:=M_M[14];
    glLoadIdentity;
    glPopMatrix;
  end;
  for I := 0 to 99 do
  begin
    glPushMatrix;
    glColor3f(i/255,1,i/255);
    glTranslatef(Pold [i-1].X, Pold [i-1].Y, Pold [i-1].Z);
    glRotatef(Uold[i].X,1,0,0);
    glRotatef(Uold[i].Y,0,1,0);
    glRotatef(Uold[i].Z,0,0,1);
    glTranslatef(3,0,0);
    glRotatef(u.x,1,0,0);
    glRotatef(u.y,0,1,0);
    glRotatef(u.z,0,0,1);
    RenderBox;
    glPopMatrix;
  end; 
Координаты положения объекта я могу получить с помощью
Код:
glGetFloatv(GL_MODELVIEW_MATRIX,@M_M);
    Pold [i].X:=M_M[12];
    Pold [i].Y:=M_M[13];
    Pold[i].Z:=M_M[14];
А вот углы поворота найти не могу найти предполагаю, что их вычислить можно используя «Кватернионы». Может ест другие пути?
https://drive.google.com/open?id=1Y4...eXc3JELRzVscFE
Ответить с цитированием
  #2  
Старый 24.11.2017, 14:44
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 2,802
Версия Delphi: D7E
Репутация: 1834
По умолчанию

А как жешь это
Цитата:
// Функция Summ находет конечные углы поворота
?
Ответить с цитированием
  #3  
Старый 27.11.2017, 09:52
PavelG2010 PavelG2010 вне форума
Прохожий
 
Регистрация: 24.03.2014
Сообщения: 3
Версия Delphi: Delphi xe2
Репутация: 10
По умолчанию

Summ - Должна находить, но ненаходт, ну например такая реализация.

Код:
function Summ(QP:TPoint3d;P2:TPoint3d):TPoint3d;
begin
  Result.X:=QP.X+P.X;
  Result.Y:=QP.Y+P.Y;
  Result.Z:=QP.Z+P.Z;
end;
Ответить с цитированием
  #4  
Старый 27.11.2017, 10:31
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 2,802
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Да так вообще ошибка должна быть - заявляется параметр P2, а плюсуется какой-то неизвестный P
Ответить с цитированием
  #5  
Старый 28.11.2017, 10:47
PavelG2010 PavelG2010 вне форума
Прохожий
 
Регистрация: 24.03.2014
Сообщения: 3
Версия Delphi: Delphi xe2
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
Да так вообще ошибка должна быть - заявляется параметр P2, а плюсуется какой-то неизвестный P
Там нет ошибки это опечатка с P и P2 это опечатка в примере.

Я создаю кватернионы
на угол по оси X на 10 градусов = QX (w = 0,9961; x = 0,0871; y = 0; z = 0)
на угол по оси Y на 10 градусов = QY (w = 0,9961; x = 0; y = 0,0871; z = 0)
на угол по оси Z на 10 градусов = QZ (w = 0,9961; x = 0; y = 0; z = 0,0871)
и перемножаю их Q1:=QX*QY*QZ
Q1 – получается кватернион первого поворота.
(w = 0,9879; x = 0,0940; y = 0,0789; z = 0,0940)

Соответственно потом создаю кватернионы для второй группы поворотов
на угол по оси X на 10 градусов = QX (w = 0,9961; x = 0,0871; y = 0; z = 0)
на угол по оси Y на 10 градусов = QY (w = 0,9961; x = 0; y = 0,0871; z = 0)
на угол по оси Z на 10 градусов = QZ (w = 0,9961; x = 0; y = 0; z = 0,0871)
и перемножаю их на кватернион первого поворота
Q2:=Q1*QX*QY*QZ (w = 0,9521; x = 0,1858; y = 0,1559; z = 0,1858)
Получаю из кватерниона Q2 углы
X = 11,6920862197876
Y = 7,94708204269409
Z = 11,6920862197876

Умножения соответственно выполняются по правилам умножениям кватернионов
Ответить с цитированием
  #6  
Старый 06.12.2017, 12:06
dimon753 dimon753 вне форума
Прохожий
 
Регистрация: 15.09.2017
Сообщения: 9
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Полностью согласен. Вы правы
Ответить с цитированием
Ответ



Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 11:13.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources", 2004-2017

ВКонтакте   Facebook   Twitter