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:
-----------
Object rotation read/write.
The new QuatToAxisAngle function could go to BLI_arithb.h.

Modified Paths:
--------------
    branches/soc-2009-chingachgook/source/blender/collada/DocumentExporter.cpp
    branches/soc-2009-chingachgook/source/blender/collada/DocumentImporter.cpp

Modified: 
branches/soc-2009-chingachgook/source/blender/collada/DocumentExporter.cpp
===================================================================
--- 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"
 
 #include <COLLADASWAsset.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();
 
                node.addTranslate(ob->loc[0], ob->loc[1], ob->loc[2]);
-               // 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
-               // node.addRotate();
+
+               // 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;
+               node.addRotate(axis[0], axis[1], axis[2], angle_deg);
+
                node.addScale(ob->size[0], ob->size[1], ob->size[2]);
-                               
+
                COLLADASW::InstanceGeometry instGeom(mSW);
                std::string ob_name(ob->id.name);
                instGeom.setUrl(COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, 
ob_name));

Modified: 
branches/soc-2009-chingachgook/source/blender/collada/DocumentImporter.cpp
===================================================================
--- 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);
 //             Scene *sce = add_scene(visualScene->getName());
                int i = 0;
-               
+
                for (i = 0; i < visualScene->getRootNodes().getCount(); i++) {
                        COLLADAFW::Node *node = visualScene->getRootNodes()[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 ++) {
                                COLLADAFW::Transformation *transform = 
node->getTransformations()[k];
                                COLLADAFW::Transformation::TransformationType 
type = transform->getTransformationType();
@@ -272,6 +278,20 @@
                                        }
                                        break;
                                case COLLADAFW::Transformation::ROTATE:
+                                       {
+                                               COLLADAFW::Rotate *ro = 
(COLLADAFW::Rotate*)transform;
+                                               COLLADABU::Math::Vector3& raxis 
= ro->getRotationAxis();
+                                               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;
                                case COLLADAFW::Transformation::SCALE:
                                        {
@@ -293,6 +313,8 @@
                                }
                        }
 
+                       Mat3ToEul(rot, ob->rot);
+
                }
 
                mVisualScenes.push_back(*visualScene);


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to