/* * Returns a Quaternion representing the angle between two vectors */ kmQuaternion* kmQuaternionBetweenVec3(kmQuaternion* pOut, const kmVec3* u, const kmVec3* v) { kmVec3 w; kmScalar len; kmQuaternion q; if(kmVec3AreEqual(u, v)) { kmQuaternionIdentity(pOut); return pOut; } len = sqrtf(kmVec3LengthSq(u) * kmVec3LengthSq(v)); kmVec3Cross(&w, u, v); kmQuaternionFill(&q, w.x, w.y, w.z, kmVec3Dot(u, v) + len); return kmQuaternionNormalize(pOut, &q); }
kmQuaternion* kmQuaternionExtractRotationAroundAxis(const kmQuaternion* pIn, const kmVec3* axis, kmQuaternion* pOut) { /** Given a quaternion, and an axis. This extracts the rotation around the axis into pOut as another quaternion. Uses the swing-twist decomposition. http://stackoverflow.com/questions/3684269/component-of-a-quaternion-rotation-around-an-axis/22401169?noredirect=1#comment34098058_22401169 */ kmVec3 ra; kmScalar d; kmVec3Fill(&ra, pIn->x, pIn->y, pIn->z); d = kmVec3Dot(&ra, axis); kmQuaternionFill(pOut, axis->x * d, axis->y * d, axis->z * d, pIn->w); kmQuaternionNormalize(pOut, pOut); return pOut; }
/**< Normalizes a quaternion*/ kmQuaternion* kmQuaternionNormalize(kmQuaternion* pOut, const kmQuaternion* pIn) { kmScalar length = kmQuaternionLength(pIn); if (fabs(length) < kmEpsilon) { pOut->x = 0.0; pOut->y = 0.0; pOut->z = 0.0; pOut->w = 0.0; return pOut; } kmQuaternionFill(pOut, pOut->x / length, pOut->y / length, pOut->z / length, pOut->w / length ); return pOut; }
ParticlePrototype::ParticlePrototype() : Drawable() { kmVec3Fill(&scale, 0.2,0.2,0.2); kmQuaternionFill(&rotation, 1.0, 0.0, 0.0, 0.0); }