Arystanbek Dyussenov arystan.d at gmail.com
Sat Jun 27 11:29:30 CEST 2009

```Revision: 21182
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21182
Author:   kazanbas
Date:     2009-06-27 11:29:30 +0200 (Sat, 27 Jun 2009)

Log Message:
-----------
The new QuatToAxisAngle function could go to BLI_arithb.h.

Modified Paths:
--------------

===================================================================
--- branches/soc-2009-chingachgook/source/blender/collada/DocumentExporter.cpp	2009-06-27 08:42:47 UTC (rev 21181)
+++ branches/soc-2009-chingachgook/source/blender/collada/DocumentExporter.cpp	2009-06-27 09:29:30 UTC (rev 21182)
@@ -15,6 +15,8 @@
#include "BKE_main.h"
#include "BKE_material.h"

+#include "BLI_arithb.h"
+
#include "DocumentExporter.h"

@@ -44,10 +46,36 @@

#include <vector>
#include <algorithm> // std::find
+#include <math.h>

-// utilities to avoid code duplication
-// definition of these is difficult to read, but they should be useful
+// TODO: this can handy in BLI_arith.b
+// This function assumes that quat is normalized.
+// The following document was used as reference:
+// http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm
+void QuatToAxisAngle(float *q, float *axis, float *angle)
+{
+	// quat to axis angle
+	*angle = 2 * acos(q[0]);
+	float divisor = sqrt(1 - q[0] * q[0]);

+	// test to avoid divide by zero, divisor is always positive
+	if (divisor < 0.001f ) {
+		axis[0] = 1.0f;
+		axis[1] = 0.0f;
+		axis[2] = 0.0f;
+	}
+	else {
+		axis[0] = q[1] / divisor;
+		axis[1] = q[2] / divisor;
+		axis[2] = q[3] / divisor;
+	}
+}
+
+/*
+  Utilities to avoid code duplication.
+  Definition can take some time to understand, but they should be useful.
+*/
+
// f should have
// void operator()(Object* ob)
template<class Functor>
@@ -455,12 +483,20 @@
node.start();

-		// XXX for rotation we need to convert ob->rot (euler, I guess) to axis/angle
-		// see http://www.euclideanspace.com/maths/geometry/rotations/conversions/eulerToAngle/index.htm
-		// add it to BLI_arithb.h
+
+		// when animation time comes, replace a single <rotate> with 3, one for each axis
+		float quat[4];
+		float axis[3];
+		float angle;
+		double angle_deg;
+		EulToQuat(ob->rot, quat);
+		NormalQuat(quat);
+		QuatToAxisAngle(quat, axis, &angle);
+		angle_deg = angle * 180.0f / M_PI;
+
-
+
std::string ob_name(ob->id.name);

===================================================================
--- branches/soc-2009-chingachgook/source/blender/collada/DocumentImporter.cpp	2009-06-27 08:42:47 UTC (rev 21181)
+++ branches/soc-2009-chingachgook/source/blender/collada/DocumentImporter.cpp	2009-06-27 09:29:30 UTC (rev 21182)
@@ -35,6 +35,8 @@
#include "BKE_library.h"
}

+#include "BLI_arithb.h"
+
#include "DNA_object_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_mesh_types.h"
@@ -216,7 +218,7 @@
Scene *sce = CTX_data_scene(mContext);
int i = 0;
-
+
for (i = 0; i < visualScene->getRootNodes().getCount(); i++) {

@@ -255,6 +257,10 @@

set_mesh(ob, uid_mesh_map[uid]);

+			float rot[3][3];
+			Mat3One(rot);
+
+			// transform Object
for (int k = 0; k < node->getTransformations().getCount(); k ++) {
@@ -272,6 +278,20 @@
}
break;
+					{
+						float angle = (float)(ro->getRotationAngle() * M_PI / 180.0f);
+						float axis[] = {raxis[0], raxis[1], raxis[2]};
+						float quat[4];
+						float rot_copy[3][3];
+						float mat[3][3];
+						AxisAngleToQuat(quat, axis, angle);
+
+						QuatToMat3(quat, mat);
+						Mat3CpyMat3(rot_copy, rot);
+						Mat3MulMat3(rot, rot_copy, mat);
+					}
break;
{
@@ -293,6 +313,8 @@
}
}

+			Mat3ToEul(rot, ob->rot);
+
}

mVisualScenes.push_back(*visualScene);

```