1. Пользоваться форумом на планшетах и телефонах стало удобнее благодаря Tapatalk

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

Тема в разделе "MAXScript", создана пользователем skyfan, 22 ноя 2010.

Модераторы: Savin Denis
  1. skyfan

    skyfan Пользователь сайта

    С нами с:
    07.01.2010
    Сообщения:
    9
    Симпатии:
    0
    Баллы:
    2
    Здравствуйте, проблема: есть самолет, известны точки его положения в пространстве, время, высота, тангаж, курс, крен.
    делаю цикл по времени, т.е. в каждую секунду полета задаю высоту и вращения самолета циклом примерно таким:

    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])
    не получается, или может я не так делаю.
    Пробовал сделать все это в кватернионах, изучил перевод различных вращений друг в друга, еще хуже чем в Эйлерах получается, даже ошибку отследить трудно.
    Направьте пожалуйста в нужное русло.
     
  2. igorznag

    igorznag Знаток

    С нами с:
    23.04.2010
    Сообщения:
    1.254
    Симпатии:
    172
    Баллы:
    65
    У тебя грамматическая ошибка. Нужно использовать скобки после 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]) 
    )
    
     
  3. skyfan

    skyfan Пользователь сайта

    С нами с:
    07.01.2010
    Сообщения:
    9
    Симпатии:
    0
    Баллы:
    2
    Да, согласен, забыл просто написать, но это все равно не работает
     
  4. Savin Denis vip

    Savin Denis Moderator Команда форума

    С нами с:
    05.05.2005
    Сообщения:
    1.633
    Симпатии:
    0
    Баллы:
    210
    Наиболее частая ошибка не задан центр координат вращения, задается через префикс about

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

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

    Chebu Знаток

    С нами с:
    23.10.2005
    Сообщения:
    141
    Симпатии:
    0
    Баллы:
    60
    скорее всего, вы неправильно трактуете оси вращения. Включите режим gimbal для манипулятора поворота, чтобы представлять, как на самом деле задаётся вращение через углы эйлера, потом подберите соответствующий axis order.
     
  6. skyfan

    skyfan Пользователь сайта

    С нами с:
    07.01.2010
    Сообщения:
    9
    Симпатии:
    0
    Баллы:
    2
    у меня один объект поэтому about не нужен пока, насколько я понимаю, но хотя когда в кватернионах вращение пробую, объект действительно как будто вокруг не своей оси вращается
     
  7. igorznag

    igorznag Знаток

    С нами с:
    23.04.2010
    Сообщения:
    1.254
    Симпатии:
    172
    Баллы:
    65
    Я считаю, что если известны крен, тангаж, курс, то этого недостаточно. Нужно чтобы были известны крен (roll), тангаж (pitch), рыскание (yaw). Потом и курс можно вычислить, если нужно.
     
Модераторы: Savin Denis

Поделиться этой страницей