Форум: "Начинающим";
Текущий архив: 2009.10.18;
Скачать: [xml.tar.bz2];
ВнизЧто делает следующий код с векторами? Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.006 c