7
edits
No edit summary |
(added a possible solution about quaternions question) |
||
Line 250: | Line 250: | ||
:::::Not to say that this is the only problem but... you're .dae files for left and right are identical :) [[User:Neo|Neo]] | :::::Not to say that this is the only problem but... you're .dae files for left and right are identical :) [[User:Neo|Neo]] | ||
::::::"The Make rotation keys continuous"is working great, no problems. Except for the stupid user error with the Striker's walk... lol [[User:EdT|EdT]] | ::::::"The Make rotation keys continuous"is working great, no problems. Except for the stupid user error with the Striker's walk... lol [[User:EdT|EdT]] | ||
::::::: Googled a possible solution and fitted it to one method. I have already checker it for some quaternions, which should result in euler angles, which contains values greater than 180 degrees, and it works fine. Here it is: | |||
public static Vector3 FromQ2(Quaternion q1) | |||
{ | |||
float sqw = q1.w * q1.w; | |||
float sqx = q1.x * q1.x; | |||
float sqy = q1.y * q1.y; | |||
float sqz = q1.z * q1.z; | |||
float unit = sqx + sqy + sqz + sqw; // if normalised is one, otherwise is correction factor | |||
float test = q1.x * q1.w - q1.y * q1.z; | |||
Vector3 v; | |||
Func<float, float> NormalizeAngle = new Func<float, float>(angle => | |||
{ | |||
while (angle > 360) | |||
angle -= 360; | |||
while (angle < 0) | |||
angle += 360; | |||
return angle; | |||
}); | |||
Func<Vector3,Vector3> NormalizeAngles = new Func<Vector3,Vector3>(angles => | |||
{ | |||
angles.x = NormalizeAngle(angles.x); | |||
angles.y = NormalizeAngle(angles.y); | |||
angles.z = NormalizeAngle(angles.z); | |||
return angles; | |||
} ); | |||
if (test > 0.4995f * unit) | |||
{ // singularity at north pole | |||
v.y = 2f * Mathf.Atan2(q1.y, q1.x); | |||
v.x = Mathf.PI / 2; | |||
v.z = 0; | |||
return NormalizeAngles(v * Mathf.Rad2Deg); | |||
} | |||
if (test < -0.4995f * unit) | |||
{ // singularity at south pole | |||
v.y = -2f * Mathf.Atan2(q1.y, q1.x); | |||
v.x = -Mathf.PI / 2; | |||
v.z = 0; | |||
return NormalizeAngles(v * Mathf.Rad2Deg); | |||
} | |||
Quaternion q = new Quaternion(q1.w, q1.z, q1.x, q1.y); | |||
v.y = (float)Math.Atan2(2f * q.x * q.w + 2f * q.y * q.z, 1 - 2f * (q.z * q.z + q.w * q.w)); // Yaw | |||
v.x = (float)Math.Asin(2f * (q.x * q.z - q.w * q.y)); // Pitch | |||
v.z = (float)Math.Atan2(2f * q.x * q.y + 2f * q.z * q.w, 1 - 2f * (q.y * q.y + q.z * q.z)); // Roll | |||
return NormalizeAngles(v * Mathf.Rad2Deg); | |||
} | |||
p.s. sorry, not found any code tags or something like that. | |||
[[User:TwinkerTinker|6opoDuJIo]] | |||
---- | ---- |
edits