// This member function multiplies this vqs with the given vector3 vec. As // shown in notes. CVector3 vqs::MultiplyVector( const CVector3& vec ) const { //Turn the vector into a quaternion-vector. DQuaternion quatVec(vec); //Get the inverse of the current quaternion. DQuaternion inverse = this->orientation(); inverse.inverted(); //Now multiply inverse*quatVec, then quatVec*normal quatVec = inverse * quatVec; quatVec = quatVec * this->orientation(); //Easily transforms back into a vector. CVector3 result(quatVec.x, quatVec.y, quatVec.z); //Apply translation to vector. result = result + this->translation(); //Apply scale after translation. result = result * this->scale(); //operation is complete. return result; }
void rQuaternion::TransformVector3(rVector3& v) const{ rVector3 quatVec(x, y , z); rVector3 uv = quatVec.Cross(v); rVector3 uuv = quatVec.Cross(uv); uv *= (2.0f * w); uuv *= 2.0f; v= v + uv + uuv; }
Vec3f operator*(const Quaternion &quat, const Vec3f &vec) { Vec3f quatVec(quat.x, quat.y, quat.z); Vec3f uv(quatVec.Cross(vec)); Vec3f uuv(quatVec.Cross(uv)); uv *= 2.0f * quat.w; uuv *= 2.0f; return vec + uv + uuv; }