PMG http://forum.pmg.org.ru/ |
|
Аналог D3DXMatrixRotationQuaternion http://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/ |