Пространственное вращение в выражении Gmod2 - PullRequest
1 голос
/ 31 июля 2009

Я использую expression2 для программирования поведения в моде Гарри (http://wiki.garrysmod.com/?title=Wire_Expression2)

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

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

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

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

Проще говоря, общая реализация, а не специфичная для Gmod, вполне подойдет.

1 Ответ

0 голосов
/ 11 сентября 2009

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

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

EntityVector = Entity: massCenter ()
Кредитное плечо = sqrt ((сущность: инерция (): длина () ^ 2) / 3)
LookPos = EntityVector - Цель: pos ()
A = анг (
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)

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

...