Пространственное вращение в Gmod Expression2

Я использую выражение2 для программирования поведения в моде Гарри. Expression2 (ссылка на архив)

Хорошо, так, чтобы создать прецедент. В Gmod у меня есть блок, и я совершенно не понимаю, как заставить его вращаться вокруг 3 векторов вверх, вниз и вправо (которые являются локальными, т. Е. Если я наклоню его на 45 градусов, прямой вектор будет 0,707, 0,707, 0). По сути, из трех векторов я хотел бы иметь возможность получить локальный шаг / крен / рыскание. Под Local Pitch Roll Yaw я подразумеваю, что они полностью независимы друг от друга, обеспечивая истинное трехмерное вращение. Так например; если я размещу свой корабль так, чтобы его нос был параллелен полу, X, Y, Z будут равны 0,0,0. Если я поверну его параллельно полу (мировой и локальный рыскание) на 90 градусов, то теперь он будет 0, 0, 90. Если я затем поверну его (мировой кувырок, локальный тангаж) на 180 градусов, это будет теперь 180, 0, 90. Я уже изучил кватернионы, однако я не считаю, что должен публиковать здесь свой код, поскольку думаю, что заново изобретал колесо.

Я знаю, что не объяснил это хорошо, но я считаю, что проблема довольно общая. Любая помощь, которую кто-либо может предложить, очень ценится.

О, я бы тоже хотел избежать гибллока.

По сути, вычисление вращения вокруг каждого из векторов вверх/вперед/вправо с использованием векторов вверх/вперед/вправо.

Просто задать вопрос об общей реализации, а не о конкретной для Gmod, абсолютно нормально.


person Community    schedule 30.07.2009    source источник
comment
Каков ваш вопрос/проблема? Где ты застрял?   -  person Victor    schedule 31.07.2009
comment
По сути, я хочу рассчитать вращение вокруг каждого из кораблей, направленных вперед, вверх и вправо. т.е.; местный тангаж/крен/рыскание кораблей. Из положения векторов в мировом пространстве.   -  person Fascia    schedule 31.07.2009
comment
Вы сказали, что совершенно не знаете, как это сделать, и в то же время вы также говорите, что уже изучили кватернионы, которые являются лучшими объектами для использования в такой ситуации (они избегают блокировки карданного подвеса и могут быть более эффективными, чем матрицы преобразования). Просто код становится слишком сложным для вас?   -  person JAB    schedule 31.07.2009
comment
По сути, я пытался реализовать кватернионы в общем, не понимая, что именно я делаю.   -  person Fascia    schedule 31.07.2009
comment
Я понял, что кватернионы - это определенно метод, который я хочу использовать, однако проблема, с которой я столкнулся, заключается в использовании кватернионов для ориентации его в определенной точке, например, если пластина сбита с места, мне нужно рассчитать положение двигателей (я могут создавать двигатели в любой точке, и они могут указывать в любом направлении), чтобы обеспечить вращательную силу.   -  person Fascia    schedule 01.08.2009


Ответы (1)


Я не уверен, какое приложение вы с нетерпением ждете реализации, однако в такой ситуации я обычно предлагаю применить угловую силу. Будет ли этого достаточно для ваших потребностей в этом отношении?

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

EntityVector = Entity:massCenter()    
Leverage = sqrt( ( Entity:inertia():length()^2 ) / 3 )   
LookPos = EntityVector - Target:pos()   
A = ang(  
 toDeg( atanr( LookPos:z() , sqrt( LookPos:x()^2 + LookPos:y()^2) ) ) ,  
 toDeg( atanr( -LookPos:y(), -LookPos:x() ) ) ,  
 0 )    
EntityAngle = ( ( Entity:angles() - angnorm(A) ) * 5 + Entity:angVel() ) * 5   
Entity:applyAngForce( -EntityAngle * Leverage ) 

Этот набор уравнений помог мне в бесчисленных проектах.

person Community    schedule 11.09.2009
comment
В основном я хочу повернуться к определенной ориентации из любой другой ориентации напрямую. Расчет угловой силы вокруг каждой оси для этого. - person Fascia; 13.09.2009