����������� � ���������������� ���. / ������ / Sergei Shaykin (original) (raw)

����������� � ���������������� ���.

�����:

���������� ��������� ����� ������������� �������� ��������. ������ ������������ ���������� ��� ����� ������� �������� ��� ���� ������. ������ �� ���� ������� �������� ������������, �� ��� ���, ���� �� �� ��������� ����������� ������� ������������ ����� ����� ������� ����������� �������. ��������, ����������� ���� ������, ������� ������ �������� ��������� � ������������. ���� ������� ��������, ��� ������� ��� � ���� ����� ������, �� ������� ������������ �������� �������� ������������� �� ����������� � ����� �� ����� �������, ��� ��� ������������ �������������. ���� � ����� ���������� �������� ������ ���������� ��������� ����� �� ������ �������� ��������, ������ ��� ������ �� ����� �������� �������� ���������� ������ ��� ������� �������� � �� ������ ���������� ����, ����� �������� ���. �������, ��� � � ���� ������ ��� ������������ �� ��������, ������� �� �������� ����� FPS ����� � ������.

������ ���� �� �������� ���� ���������� ����������� ��� �������� �������� ������. ��� ���� �� �������� ���� ����������� ������ �� ��������� ���������� �� ���������. ��� ��� ������ ����� ������ ��������, ������������ �� �������� ���������, ��������, ��� �������� ��������� - ������ �������� �� ����, �� ������ ������, ��� ��� �������� �������� �� ����������, ��������. ��� ���� �� �������, ������� ����� ������ ��� ������ ������������. ����������� ����� ������ ������������ � ����� �����������, ����� ��� ��-2 ���������. ������ ��������������� ����� ������ (roll, pitch � yaw), ����������� �������� ������ ���� x, y � z ��������������, ������� ����� ������������ ���� ����������. �� � ������ ����� ��� � ���������� ��������� ������� ��������� ���������� �������� � ������������. ��������, ����� �������� ������� �������� � �����������, ��� � �������.

��� ��� �����
�������� �������� � �������� ������������
��������������
�������� ������ ���
�������������� ����������� ��������� � ����������
���� ������
�������������� ������� �������� � ����������
�������������� ���������� ����������� � ������� ��������
������� ������������
����������� � DirectX
����������� � MAX SDK
������ �� ����

��� ��� �����

����������� ���� ������� ����������� � XVIII ����. ����������� �������� 4-� ������ ����������� ��������� ����������� �����, ������� ������� � ��� ���������������� �����. �� ���� ���������� q ������� �������� ����� (x, y, z, w):

w + xi + yj + zk
, ��� i2 = j2 = k2 = �1.

��� ����� ����� ���������� � ����:

[w,v]
, ��� w �������� ������, � v = (x, y, z) � ������.

�������� �������� � �������� ������������

���������� ��� �����������: q[w,v] � q'[w',v']. ��� ��� ����������� ���������:

q+q' = [w+w',v+v']

qq' = [ww' � vv', vxv' + wv' + w'v]
, ��� x - ��������� ������������, � � ���������.

norm(q) = sqrt(w2+x2+y2+z2) (������)

q*=[w, �v] (����������)

\(q^{-1}=\frac {q*} {norm(q)^2}\)

norm(q)=1 => q�1=q*

����������� ��������� ��������� �������� � ���������� ������������ �� �������� � �������������. �������� ����� ������ ��������� ������������ (norm(q) = 1). ����� ���������� �������� � ���������� ����, ��� ������� ������� �������������, ���������� ��������� ��� ������ norm(q) � ��� ������ ����� ����������� ��������� �� �������� ����������� �������.

������������ ������������ ������������ ����� 4-� ������ ������������. ��������� ���� ��������� �������� � ���� 4-� ������ ����� � �������� 1. ����������� ����� �������������, ��� ���������� ��������������� ���� �������� � ����������� �����������, (����������� ���������� - �������, ������, ���� ��������).

���� �������� ������ ��������� ������������ q, �� ������ v ����� �������� ����� ����� ��� v':

V'=q V q�1
, ��� V = [o,v], V'=[0,v']

��������������

�������� ������ ���

���������� �������� �� ���� Q ������ ���, �������� ������������ �������� v. ��� �������� ����� ������ ������������:
q=[cos(Q/2),sin(Q/2)v]

��� ������������� ����� �� ������ ������������� ���������� ����������.

�������������� ����������� ��������� � ����������

struct Quaternion{ float x,y,z; float w;
};

void SphericalToQuaternion(Quaternion * q, float latitude, float longitude, float angle) { float sin_a = sin( angle / 2 ); float cos_a = cos( angle / 2 );

float sin_lat = sin( latitude ); float cos_lat = cos( latitude );

float sin_long = sin( longitude ); float cos_long = cos( longitude );

q->x = sin_a * cos_lat * sin_long; q->y = sin_a * sin_lat; q->z = sin_a * sin_lat * cos_long; q->w = cos_a; }

���� ������

�������� ������� yaw, pitch � roll. ����� ���������� ����������� ��������� �������:

qroll = [cos (y/2), (sin(y/2), 0, 0)]
qpitch = [cos (q/2), (0, sin(q/2), 0)]
qyaw = [cos (f/2), (0, 0, sin(f/2))]
q = qyaw qpitch qroll

�������������� ������� �������� � ����������

��� ������� �������� ���������� ������� �������� 3x3. ������, ��������� ������ 3D API ���������� ��� ������������� ������� �������� 4x4, �� ���� ����� ������������� ����� ����������� �������. ��� ����, ����� �������������� ������ �� ������ �� ����� �������, �������������� ������ � ������� ������������ � ����, �� ����������� �� �����������, ������� ������������ � 1. ���� ������� ��� �������������� ������� �������� � ����������. ����, ��� ��� ������� �� ������ ����� � ���� ������ ���������� ����� ��������, �������� � ���������������.

void MatrixToQuaternion(Quaternion * quat, float m[4][4]) { float tr, s, q[4]; int i, j, k;

int nxt[3] = {1, 2, 0};

tr = m[0][0] + m[1][1] + m[2][2];

if (tr > 0.0) { s = sqrt (tr + 1.0); quat->w = s / 2.0; s = 0.5 / s; quat->x = (m[1][2] - m[2][1]) * s; quat->y = (m[2][0] - m[0][2]) * s; quat->z = (m[0][1] - m[1][0]) * s; } else { i = 0; if (m[1][1] > m[0][0]) i = 1; if (m[2][2] > m[i][i]) i = 2; j = nxt[i]; k = nxt[j];

s = sqrt ((m[i][i] - (m[j][j] + m[k][k])) + 1.0);

q[i] = s * 0.5;

if (s != 0.0) s = 0.5 / s;

q[3] = (m[j][k] - m[k][j]) * s;
q[j] = (m[i][j] + m[j][i]) * s;
q[k] = (m[i][k] + m[k][i]) * s;

quat->x = q[0];
quat->y = q[1];
quat->z = q[2];
quat->w = q[3];

} }

�������������� ���������� ����������� � ������� ��������

�������������� ���������� ����������� � ������� �������� ����� �������� � ����:

TRot = [ 1-2y2-2z2 2xy-2wz 2xz+2wy
2xy+2wz 1-2x2-2z2 2yz-2wx
2xz-2wy 2yz+2wx 1-2x2-2y2 ]

void QuaternionToMatrix(float m[4][4], const Quaternion * quat) { float wx, wy, wz, xx, yy, yz, xy, xz, zz, x2, y2, z2; x2 = quat->x + quat->x; y2 = quat->y + quat->y; z2 = quat->z + quat->z; xx = quat->x * x2; xy = quat->x * y2; xz = quat->x * z2; yy = quat->y * y2; yz = quat->y * z2; zz = quat->z * z2; wx = quat->w * x2; wy = quat->w * y2; wz = quat->w * z2;

m[0][0]=1.0f-(yy+zz); m[0][1]=xy-wz; m[0][2]=xz+wy; m[1][0]=xy+wz; m[1][1]=1.0f-(xx+zz); m[1][2]=yz-wx; m[2][0]=xz-wy; m[2][1]=yz+wx; m[2][2]=1.0f-(xx+yy);

m[0][3] = m[1][3] = m[2][3] = 0; m[3][0] = m[3][1] = m[3][2] = 0; m[3][3] = 1; }

��� ������ � ��������� �������� � ��������� ����������� ��������� ����������� ������� ��������. � ���� ������ ������������� ������������ ����������������, ��� ������. �� ����, ���� �������� ������ ����� ��������� R1 � R2, �� ����� ��������� ������� �������� ����� ����������� ��� �������: R = R1 x R2. ����������, ���� �������� ������ ����� ������������� q1 � q2, �� �������������� ���������� �������� ����� q = q1 x q2. ����, ��� ���������� ������������ ������������ ���������� �������, ��� ������. ������ ������������ ������������ ����� ��������������:

void MulQuaternions(Quaternion *res, const Quaternion *q1, const Quaternion *q2) { float A, B, C, D, E, F, G, H;

A = (q1->w + q1->x) * (q2->w + q2->x); B = (q1->z - q1->y) * (q2->y - q2->z); C = (q1->x - q1->w) * (q2->y + q2->z); D = (q1->y + q1->z) * (q2->x - q2->w); E = (q1->x + q1->z) * (q2->x + q2->y); F = (q1->x - q1->z) * (q2->x - q2->y); G = (q1->w + q1->y) * (q2->w - q2->z); H = (q1->w - q1->y) * (q2->w + q2->z);

res->w = B + (-E - F + G + H) * 0.5; res->x = A - ( E + F + G + H) * 0.5; res->y =-C + ( E - F + G - H) * 0.5; res->z =-D + ( E - F - G + H) * 0.5; }

��������: 1 2 ��������� »

#�����������, #����������

5 ������� 2001 (����������: 29 ��� 2013)

����������� [18]