Вектор и кватернион
#1

Здравствуйте все
Вопрос о кватернионах был задет на форуме но не с той стороны с которой мне понадобилось.И так...
Есть 2 точки в трехмерном пространстве,из них мы можем получить вектор направления из одной в другую, но необходимо получить кватернион направления из одной в другую.Из вектора или из 2 точек без разницы, главное результат.Опробовал много способов но нужного результата не добился, либо гта как то по своему понимает кватернионы
Reply
#2

Первокурсники отдыхают =)
http://wat.gamedev.ru/articles/quaternions - может поможет
Reply
#3

inline void RotationArc( quaternion& q, const vector3& from, const vector3& to )
{
vector3 c = cross( from, to );
q.set( c.x, c.y, c.z, dot(from, to ) );
q.normalize(); // if "from" or "to" not unit, normalize quat
q.w += 1.0f; // reducing angle to halfangle
if( q.w <= TINY ) // angle close to PI
{
if( ( from.z*from.z ) > ( from.x*from.x ) )
q.set( 0, from.z, - from.y, q.w ); //from*vector3(1,0,0)
else
q.set( from.y, - from.x, 0, q.w ); //from*vector3(0,0,1)
}
q.normalize();
}


или (побыстрее может?)
inline void RotationArc( quaternion& q, const vector3& from, const vector3& to )
{
vector3 c( from*to );
float d = from%to;
q.set( c.x, c.y, c.z, d + (float)sqrt( from.len_squared()*to.len_squared() ) );
q.normalize();
}
Reply
#4

Прочитай эту тему
https://sampforum.blast.hk/showthread.php?tid=170598&page=2

я в ней всё подробно расписал
и как доказательство что всё пашет выложил скрины.

Прочитав, возможно вопросы отпадут.
Особенности в ГТА есть:
1. в ГТА смещены четверти, поэтому будь внимателен со знаками
2. кай скорее всего перепутал, переменные местами (я уже про это писал и доказал)

Определить положение в пространстве нужно только машины, т.к. у остальных объектов уже есть задания угла поворотов.

Если тебе просто надо преобразовать в кватернион, то не вижу проблем. Пройдясь по тем ссылкам что тебе дали и что я указал в той теме, ты найдёшь кучу формул перевода.

вот например
Quote:

Как углы Эйлера конвертируются в кватернионы?
w = c1 c2 c3 - s1 s2 s3
x = s1 s2 c3 + c1 c2 s3
y = s1 c2 c3 + c1 s2 s3
z = c1 s2 c3 - s1 c2 s3

where:
c1 = cos(heading / 2)
c2 = cos(attitude / 2) if attitude = 90° then c2 = cos(45°) = 0.7071 if attitude = -90° then c2 = cos(-45°) = 0.7071
c3 = cos(bank / 2)
s1 = sin(heading / 2)
s2 = sin(attitude / 2) if attitude = 90° then s2 = cos(45°) = 0.7071 if attitude = -90° then s2 = sin(-45°) = -0.7071
s3 = sin(bank / 2)

w = cos(rZ/2) * cos(rY/2) * cos(rX/2) + sin(rZ/2) * sin(rY/2) * sin(rX/2)
x = cos(rZ/2) * cos(rY/2) * sin(rX/2) + sin(rZ/2) * sin(rY/2) * cos(rX/2)
y = cos(rZ/2) * sin(rY/2) * cos(rX/2) + sin(rZ/2) * cos(rY/2) * sin(rX/2)
z = sin(rZ/2) * cos(rY/2) * cos(rX/2) + cos(rZ/2) * sin(rY/2) * sin(rX/2)

Но тут проблема практического применения. т.к. ты не расписал, зачем тебе это надо.

И ещё, не читай про матрицы поворота, чтобы не забивать голову всякой хернёй, сдесь не нужной, т.к. некоторые умники что то писали , про перевод через матрицы, видимо сами не понимающие сути.
Reply
#5

Будет использовано для изменения поворота транспорта в нужную сторону (туда куда ехать надо)
Идея о переводе из углов эйлера была, но перевести вектор в них без корявостей не получилось.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)