PMG
https://forum.pmg.org.ru/

Аналог D3DXMatrixRotationQuaternion
https://forum.pmg.org.ru/viewtopic.php?f=2&t=6821
Страница 1 из 1

Автор:  GameX32 [ 27 сен 2009 19:31 ]
Заголовок сообщения:  Аналог D3DXMatrixRotationQuaternion

Решил создать аналог функции D3DXMatrixRotationQuaternion для своей математической библиотечки. Решил использовать формулу найденую в интернете:

public static Matrix4 RotationQuaternion(QuaternionF q)
{
var res = new Matrix4();
res[1,1] = 1.0f - 2.0f * (q.Y * q.Y + q.Z * q.Z);
res[1,2] = 2.0f * (q.X * q.Y + q.Z * q.W);
res[1,3] = 2.0f * (q.X * q.Z - q.Y * q.W);
res[2,1] = 2.0f * (q.X * q.Y - q.Z * q.W);
res[2,2] = 1.0f - 2.0f * (q.X * q.X + q.Z * q.Z);
res[2,3] = 2.0f * (q.Y * q.Z + q.X * q.W);
res[3,1] = 2.0f * (q.X * q.Z + q.Y * q.W);
res[3,2] = 2.0f * (q.Y * q.Z - q.X * q.W);
res[3,3] = 1.0f - 2.0f * (q.X * q.X + q.Y * q.Y);
return res;
}

Но DX функция D3DXMatrixRotationQuaternion() возвращает совсем другой результат! Насколько я понимаю проблема в переводе из RH в LH систему. Код приведенный ниже дает похожий результат, но я не уверен что он правильный.

public static Matrix4F RotationQuaternion(QuaternionF q)
{
var x2 = q.X + q.X;
var y2 = q.Y + q.Y;
var z2 = q.Z + q.Z;
var xx = q.X * x2; var xy = q.X * y2; var xz = q.X * z2;
var yy = q.Y * y2; var yz = q.Y * z2; var zz = q.Z * z2;
var wx = q.W * x2; var wy = q.W * y2; var wz = q.W * z2;

return new Matrix4
(
1.0f - (xx + yy), wx + yz, wy - xz, 0.0f,
wx - yz, (yy + zz) - 1.0f, xy + wz, 0.0f,
wy + xz, xy - wz, (yy - wz) - 1.0f, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f
);

}

Можете помочь? Заранее благодарен.

Страница 1 из 1 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/