Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.10.18;
Скачать: CL | DM;

Вниз

Что делает следующий код с векторами?   Найти похожие ветки 

 
novai   (2009-08-13 08:44) [0]


type
TQuat = packed record
 X,Y,Z,W: single;
end;

TVector = packed record
 X,Y,Z: single;
end;

...

function QmulV(q: TQuat; v: TVector): TVector;
var
a11,a12,a13: single;
a21,a22,a23: single;
a31,a32,a33: single;
Norm: single;
begin
with q do begin
 Norm := 1/(x*x + y*y + z*z + w*w);
 a11 :=   (w*w + x*x - y*y - z*z)*Norm;
 a12 := 2*(x*y - w*z)*Norm;
 a13 := 2*(x*z + w*y)*Norm;
 a21 := 2*(x*y + w*z)*Norm;
 a22 :=   (w*w + y*y - x*x - z*z)*Norm;
 a23 := 2*(y*z - w*x)*Norm;
 a31 := 2*(x*z - w*y)*Norm;
 a32 := 2*(y*z + w*x)*Norm;
 a33 :=   (w*w + z*z - x*x - y*y)*Norm;
end;
result.X:= a11*v.X+a12*v.Y+a13*v.Z;
result.Y:= a21*v.X+a22*v.Y+a23*v.Z;
result.Z:= a31*v.X+a32*v.Y+a33*v.Z;
end;


 
novai   (2009-08-13 08:45) [1]

и для чего нужно W? в

TQuat = packed record
X,Y,Z,W: single;
end;


 
MBo ©   (2009-08-13 09:05) [2]

преобразование кватерниона в матрицу аффинного преобразования и применение этого преобразования к вектору


 
brother ©   (2009-08-13 09:19) [3]

а можно ли узнать угол поворота по каждой из осей относительно центра плоскостей и как?
Direction.x
Direction.y
Direction.z


 
MBo ©   (2009-08-13 09:23) [4]

>а можно ли узнать угол поворота по каждой из осей относительно центра плоскостей и как?

Если я правильно понял вопрос, то в статьях о кватернионах можно найти функции преобразования кватерниона в эйлеровы углы


 
brother ©   (2009-08-13 09:45) [5]

ух, сколько информации, нашел вот:

void QuaternionToAxisAngle(Quaternion quat, Vector * axis, float * angle) {
 float sinAngle;
 
 QuaternionNormalize(&quat);
 sinAngle = sqrt(1.0f - (quat.w * quat.w));
 if (fabs(sinAngle) < 0.0005f) sinAngle = 1.0f;
 axis->x = (quat.x / sinAngle);
 axis->y = (quat.y / sinAngle);
 axis->z = (quat.z / sinAngle);
 *angle = (acos(quat.w) * 2.0f);
}

и

void QuaternionNormalize(Quaternion * quat) {
 float magnitude;
 
 magnitude = sqrt((quat->x * quat->x) + (quat->y * quat->y) + (quat->z * quat->z) + (quat->w * quat->w));
 quat->x /= magnitude;
 quat->y /= magnitude;
 quat->z /= magnitude;
 quat->w /= magnitude;
}

кто сможет помоч перевести на делфи?


 
MBo ©   (2009-08-13 09:52) [6]

это не то - здесь находится угол поворота не относительно  осей координат (которых три), а относительно оси, заданной кватернионом


 
brother ©   (2009-08-13 09:53) [7]

эээ, тады ой)


 
novai   (2009-08-13 09:59) [8]

Вот что у меня не получается:

этими процедурами получаю позицию и ориентацию:

procedure GetActorGlobalPosition(actor: dword; x,y,z: psingle); stdcall; external DLL;
procedure GetActorGlobalOrientation(actor: dword; x,y,z,w: psingle); stdcall;
external DLL;


в GLScene куб имеет positin(x,y,z) и direction(x,y,z)

вот я и не могу применить
GetActorGlobalOrientation к direction


 
Ega23 ©   (2009-08-13 10:34) [9]

<OFFTOP>
Борис, а потом ты ещё удивляешься, почему все тебя математиком считают... :)))
</OFFTOP>


 
MBo ©   (2009-08-13 14:04) [10]

Ega23 ©   (13.08.09 10:34) [9]
<OFFTOP>
Ну, как известно, достаточно пары ведер пива, и все выясняется :)
</OFFTOP>


 
Дуп   (2009-08-13 17:06) [11]

Давно не ходил в форумы. Такие вопросы обычно в игры складывали. Сейчас там скучно. А они оказывается тут. Понятно.



Страницы: 1 вся ветка

Текущий архив: 2009.10.18;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.009 c
15-1250596547
pasha_golub
2009-08-18 15:55
2009.10.18
TList.Sort из Delphi7


2-1250150825
tytus
2009-08-13 12:07
2009.10.18
SNMP и Delphi 2009 - непонятки с указателем


2-1250069271
kirill_2009
2009-08-12 13:27
2009.10.18
биты(


2-1250168712
Sergey2
2009-08-13 17:05
2009.10.18
checksum


2-1250247119
sdsk
2009-08-14 14:51
2009.10.18
Как в delphi получить копию экземпляра класса?