[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [33521] trunk/blender/source/blender/ python/generic/mathutils_quat.c: mathutils quaternion axis/ angle access was broken for non unit lenth quats, would return NAN' s in simple cases.
Campbell Barton
ideasman42 at gmail.com
Tue Dec 7 02:38:42 CET 2010
Revision: 33521
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=33521
Author: campbellbarton
Date: 2010-12-07 02:38:42 +0100 (Tue, 07 Dec 2010)
Log Message:
-----------
mathutils quaternion axis/angle access was broken for non unit lenth quats, would return NAN's in simple cases.
now normalize upon conversion, when setting the quat axis/ange, maintain length by scaling back to the original size afterwards.
Modified Paths:
--------------
trunk/blender/source/blender/python/generic/mathutils_quat.c
Modified: trunk/blender/source/blender/python/generic/mathutils_quat.c
===================================================================
--- trunk/blender/source/blender/python/generic/mathutils_quat.c 2010-12-07 01:30:14 UTC (rev 33520)
+++ trunk/blender/source/blender/python/generic/mathutils_quat.c 2010-12-07 01:38:42 UTC (rev 33521)
@@ -71,6 +71,7 @@
static PyObject *Quaternion_ToEuler(QuaternionObject * self, PyObject *args)
{
+ float tquat[4];
float eul[3];
char *order_str= NULL;
short order= EULER_ORDER_XYZ;
@@ -88,6 +89,8 @@
if(order == -1)
return NULL;
}
+
+ normalize_qt_qt(tquat, self->quat);
if(eul_compat) {
float mat[3][3];
@@ -95,14 +98,14 @@
if(!BaseMath_ReadCallback(eul_compat))
return NULL;
- quat_to_mat3(mat, self->quat);
+ quat_to_mat3(mat, tquat);
if(order == EULER_ORDER_XYZ) mat3_to_compatible_eul(eul, eul_compat->eul, mat);
else mat3_to_compatible_eulO(eul, eul_compat->eul, order, mat);
}
else {
- if(order == EULER_ORDER_XYZ) quat_to_eul(eul, self->quat);
- else quat_to_eulO(eul, order, self->quat);
+ if(order == EULER_ORDER_XYZ) quat_to_eul(eul, tquat);
+ else quat_to_eulO(eul, order, tquat);
}
return newEulerObject(eul, order, Py_NEW, NULL);
@@ -765,21 +768,28 @@
static PyObject *Quaternion_getAngle(QuaternionObject * self, void *UNUSED(closure))
{
+ float tquat[4];
+
if(!BaseMath_ReadCallback(self))
return NULL;
- return PyFloat_FromDouble(2.0 * (saacos(self->quat[0])));
+ normalize_qt_qt(tquat, self->quat);
+ return PyFloat_FromDouble(2.0 * (saacos(tquat[0])));
}
static int Quaternion_setAngle(QuaternionObject * self, PyObject * value, void *UNUSED(closure))
{
+ float tquat[4];
+ float len;
+
float axis[3];
float angle;
if(!BaseMath_ReadCallback(self))
return -1;
- quat_to_axis_angle(axis, &angle, self->quat);
+ len= normalize_qt_qt(tquat, self->quat);
+ quat_to_axis_angle(axis, &angle, tquat);
angle = PyFloat_AsDouble(value);
@@ -797,6 +807,7 @@
}
axis_angle_to_quat(self->quat, axis, angle);
+ mul_qt_fl(self->quat, len);
if(!BaseMath_WriteCallback(self))
return -1;
@@ -806,14 +817,17 @@
static PyObject *Quaternion_getAxisVec(QuaternionObject *self, void *UNUSED(closure))
{
+ float tquat[4];
+
float axis[3];
float angle;
if(!BaseMath_ReadCallback(self))
return NULL;
-
- quat_to_axis_angle(axis, &angle, self->quat);
+ normalize_qt_qt(tquat, self->quat);
+ quat_to_axis_angle(axis, &angle, tquat);
+
/* If the axis of rotation is 0,0,0 set it to 1,0,0 - for zero-degree rotations */
if( EXPP_FloatsAreEqual(axis[0], 0.0f, 10) &&
EXPP_FloatsAreEqual(axis[1], 0.0f, 10) &&
@@ -827,15 +841,20 @@
static int Quaternion_setAxisVec(QuaternionObject *self, PyObject *value, void *UNUSED(closure))
{
+ float tquat[4];
+ float len;
+
float axis[3];
float angle;
VectorObject *vec;
+
if(!BaseMath_ReadCallback(self))
return -1;
- quat_to_axis_angle(axis, &angle, self->quat);
+ len= normalize_qt_qt(tquat, self->quat);
+ quat_to_axis_angle(axis, &angle, tquat);
if(!VectorObject_Check(value)) {
PyErr_SetString(PyExc_TypeError, "quaternion.axis = value: expected a 3D Vector");
@@ -847,6 +866,7 @@
return -1;
axis_angle_to_quat(self->quat, vec->vec, angle);
+ mul_qt_fl(self->quat, len);
if(!BaseMath_WriteCallback(self))
return -1;
More information about the Bf-blender-cvs
mailing list