fixed arbitrary rotation
authorspog <spog>
Sun, 11 Jun 2006 12:45:44 +0000 (12:45 +0000)
committerspog <spog>
Sun, 11 Jun 2006 12:45:44 +0000 (12:45 +0000)
git-svn-id: svn://svn.icculus.org/gtkradiant/GtkRadiant/trunk@83 8a3a26a2-13c4-0310-b231-cf6edde360e5

CHANGES
libs/math/quaternion.h
radiant/select.cpp

diff --git a/CHANGES b/CHANGES
index 1a4295d8dcd1e048681edcef34ab3d2d47491d26..86d43918ed918ed02c4a96b8b2b1d863958851a6 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,6 +1,10 @@
 This is the changelog for developers, != changelog for the end user 
 that we distribute with the binaries. (see changelog)
 
+11/06/2006
+SPoG
+- Fixed arbitrary rotation X and Y axes appearing to be transposed.
+
 04/06/2006
 SPoG
 - Fixed crash when deleting items from Build menu.
index 7bd42cb13f1091c88e2b271322fb7a060e3a7a68..d91ad62a1da1fb2539696a707adc9675cd22f7eb 100644 (file)
@@ -60,6 +60,24 @@ inline Quaternion quaternion_for_axisangle(const Vector3& axis, double angle)
   return Quaternion(axis[0] * sa, axis[1] * sa, axis[2] * sa, static_cast<float>(cos(angle)));
 }
 
+inline Quaternion quaternion_for_x(double angle)
+{
+  angle *= 0.5;
+  return Quaternion(static_cast<float>(sin(angle)), 0, 0, static_cast<float>(cos(angle)));
+}
+
+inline Quaternion quaternion_for_y(double angle)
+{
+  angle *= 0.5;
+  return Quaternion(0, static_cast<float>(sin(angle)), 0, static_cast<float>(cos(angle)));
+}
+
+inline Quaternion quaternion_for_z(double angle)
+{
+  angle *= 0.5;
+  return Quaternion(0, 0, static_cast<float>(sin(angle)), static_cast<float>(cos(angle)));
+}
+
 inline Quaternion quaternion_inverse(const Quaternion& quaternion)
 {
   return Quaternion(vector3_negated(vector4_to_vector3(quaternion)), quaternion[3]);
index 9709c179d6f035b64970a1032c5c10e1354402c5..496d96a45b5200635dfcf2347fa8476d481de738 100644 (file)
@@ -756,8 +756,20 @@ void Selection_destroy()
 #include <gtk/gtklabel.h>
 #include <gdk/gdkkeysyms.h>
 
+
 inline Quaternion quaternion_for_euler_xyz_degrees(const Vector3& eulerXYZ)
 {
+#if 0
+  return quaternion_for_matrix4_rotation(matrix4_rotation_for_euler_xyz_degrees(eulerXYZ));
+#elif 0
+  return quaternion_multiplied_by_quaternion(
+    quaternion_multiplied_by_quaternion(
+      quaternion_for_z(degrees_to_radians(eulerXYZ[2])),
+      quaternion_for_y(degrees_to_radians(eulerXYZ[1]))
+    ),
+    quaternion_for_x(degrees_to_radians(eulerXYZ[0]))
+  );
+#elif 1
   double cx = cos(degrees_to_radians(eulerXYZ[0] * 0.5));
   double sx = sin(degrees_to_radians(eulerXYZ[0] * 0.5));
   double cy = cos(degrees_to_radians(eulerXYZ[1] * 0.5));
@@ -766,11 +778,12 @@ inline Quaternion quaternion_for_euler_xyz_degrees(const Vector3& eulerXYZ)
   double sz = sin(degrees_to_radians(eulerXYZ[2] * 0.5));
 
   return Quaternion(
-    static_cast<float>(cx * sy * cz - sx * cy * sz),
-    static_cast<float>(cx * sy * sz + sx * cy * cz),
-    static_cast<float>(cx * cy * sz - sx * sy * cz),
-    static_cast<float>(cx * cy * cz + sx * sy * sz)
+    cz * cy * sx - sz * sy * cx,
+    cz * sy * cx + sz * cy * sx,
+    sz * cy * cx - cz * sy * sx,
+    cz * cy * cx + sz * sy * sx
   );
+#endif
 }
 
 struct RotateDialog