Render.ru

вращения объектов в разных системах координат

skyfan

Пользователь сайта
Рейтинг
2
#1
Здравствуйте, проблема: есть самолет, известны точки его положения в пространстве, время, высота, тангаж, курс, крен.
делаю цикл по времени, т.е. в каждую секунду полета задаю высоту и вращения самолета циклом примерно таким:

for m=1 to t-1 do
at time (Time_array[m+1])
( theobj.pos = [ar[1][m+1],ar[2][m+1],ar[3][m+1]]
)


for m=1 to t-1 do
at time (30*Time_array[m+1])


(
in coordsys local

rotate theobj (angleaxis (bank_array[m+1]-bank_array[m])[0,1,0])

rotate theobj (angleaxis (atack_array[m+1]-atack_array[m])[1,0,0])

rotate theobj (angleaxis (roll_array[m+1]-roll_array[m])[0,0,1])

)
здесь вдаваться в секунды не нужно, не принципиально. принципиально, что самолет вращается совершенно не как самолет, а как объект не поддающийся вообще никакому описанию.
дело в том, что понятие курса это проекция продольной оси самолета на горизонтальную плоскость, т. е. то, что написано как roll это не вращение самолета вокруг вертикальной оси, а ,в идеале, нужно вращать в мировых координатах, в горизонтальной плоскости, а все остально в локальных с приращением. так вот разделить вращения:

in coordsys world
rotate theobj (angleaxis (roll_array[m+1]-roll_array[m])[0,0,1])

а потом
in coordsys local

rotate theobj (angleaxis (bank_array[m+1]-bank_array[m])[0,1,0])

rotate theobj (angleaxis (atack_array[m+1]-atack_array[m])[1,0,0])
не получается, или может я не так делаю.
Пробовал сделать все это в кватернионах, изучил перевод различных вращений друг в друга, еще хуже чем в Эйлерах получается, даже ошибку отследить трудно.
Направьте пожалуйста в нужное русло.
 

igorznag

Мастер
Рейтинг
103
#2
У тебя грамматическая ошибка. Нужно использовать скобки после in coordsys.
Код:
for m=1 to t-1 do 
at time (30*Time_array[m+1]) 
( 
in coordsys local 
(
rotate theobj (angleaxis (bank_array[m+1]-bank_array[m])[0,1,0]) 
rotate theobj (angleaxis (atack_array[m+1]-atack_array[m])[1,0,0]) 
rotate theobj (angleaxis (roll_array[m+1]-roll_array[m])[0,0,1]) 
)
) 
---------------------------
in coordsys world 
(
rotate theobj (angleaxis (roll_array[m+1]-roll_array[m])[0,0,1]) 
)

in coordsys local 
(
rotate theobj (angleaxis (bank_array[m+1]-bank_array[m])[0,1,0]) 
rotate theobj (angleaxis (atack_array[m+1]-atack_array[m])[1,0,0]) 
)
 

skyfan

Пользователь сайта
Рейтинг
2
#3
Да, согласен, забыл просто написать, но это все равно не работает
 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#4
Наиболее частая ошибка не задан центр координат вращения, задается через префикс about

Остальные проблемы обычно бывают от не правильного преобразования данных или не правильной трактовке модели поведения объектов.

мой совет сделай референсную анимацию на 3-5 кадров, ручками хотя бы если нет, дальше обычно видно сразу видно что не так.
 

Chebu

Знаток
Рейтинг
59
#5
скорее всего, вы неправильно трактуете оси вращения. Включите режим gimbal для манипулятора поворота, чтобы представлять, как на самом деле задаётся вращение через углы эйлера, потом подберите соответствующий axis order.
 

skyfan

Пользователь сайта
Рейтинг
2
#6
Наиболее частая ошибка не задан центр координат вращения, задается через префикс about

Остальные проблемы обычно бывают от не правильного преобразования данных или не правильной трактовке модели поведения объектов.

мой совет сделай референсную анимацию на 3-5 кадров, ручками хотя бы если нет, дальше обычно видно сразу видно что не так.
у меня один объект поэтому about не нужен пока, насколько я понимаю, но хотя когда в кватернионах вращение пробую, объект действительно как будто вокруг не своей оси вращается
 
Сверху