fixed arbitrary rotation

git-svn-id: svn://svn.icculus.org/gtkradiant/GtkRadiant/trunk@83 8a3a26a2-13c4-0310-b231-cf6edde360e5
This commit is contained in:
spog 2006-06-11 12:45:44 +00:00
parent ebeb23b783
commit 2a1870f6d6
3 changed files with 39 additions and 4 deletions

View file

@ -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.

View 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]);

View 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