![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Что делает следующий код с векторами?
novai © (2009-08-13 08:44:00)
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;
Дуп (2009-08-13 17:06:00) [1]Давно не ходил в форумы. Такие вопросы обычно в игры складывали. Сейчас там скучно. А они оказывается тут. Понятно.
MBo (2009-08-13 14:04:00) [2]Ega23 © (13.08.09 10:34) [9]
<OFFTOP>
Ну, как известно, достаточно пары ведер пива, и все выясняется :)
</OFFTOP>
Ega23 (2009-08-13 10:34:00) [3]<OFFTOP>
Борис, а потом ты ещё удивляешься, почему все тебя математиком считают... :)))
</OFFTOP>
novai (2009-08-13 09:59:00) [4]Вот что у меня не получается:
этими процедурами получаю позицию и ориентацию:
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
brother (2009-08-13 09:53:00) [5]эээ, тады ой)
MBo (2009-08-13 09:52:00) [6]это не то - здесь находится угол поворота не относительно осей координат (которых три), а относительно оси, заданной кватернионом
brother (2009-08-13 09:45:00) [7]ух, сколько информации, нашел вот:
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:23:00) [8]>а можно ли узнать угол поворота по каждой из осей относительно центра плоскостей и как?
Если я правильно понял вопрос, то в статьях о кватернионах можно найти функции преобразования кватерниона в эйлеровы углы
brother (2009-08-13 09:19:00) [9]а можно ли узнать угол поворота по каждой из осей относительно центра плоскостей и как?
Direction.x
Direction.y
Direction.z
MBo (2009-08-13 09:05:00) [10]преобразование кватерниона в матрицу аффинного преобразования и применение этого преобразования к вектору
novai (2009-08-13 08:45:00) [11]и для чего нужно W? в
TQuat = packed record
X,Y,Z, W: single;
end;