Решил создать аналог функции 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 );
}
Можете помочь? Заранее благодарен.
_________________ Да прибудет с тобой инкапсуляция и полиморфизм.
|