2010년 3월 17일 수요일

Quternion Class 구현

mathematics for 3d game and computer graphics 책의 3장 연습문제 5번 답으로 작성한 quaternion class.

 

#ifndef __QUATERNION_H__
#define __QUATERNION_H__


namespace toki

{
 class cQuaternion
 {
 public:
  cQuaternion() {}
  ~cQuaternion() {}

  //
  cQuaternion(float aW, float aX, float aY, float aZ)
  {
      w_ = aW;
      x_ = aX;
      y_ = aY;
      z_ = aZ;
  }

  cQuaternion(const cQuaternion& aQuat)
  {
      *this = aQuat;
  }

  cQuaternion& operator = (const cQuaternion& aQuat)
  {
      if(this != &aQuat)
      {
          w_ = aQuat.w_;
          x_ = aQuat.x_;
          y_ = aQuat.y_;
          z_ = aQuat.z_;
      }
      return *this;
  }

  cQuaternion& operator += (float aW)
  {
       w_ += aW;
       return *this;
  }

  cQuaternion& operator -= (float aW)
  {
       w_ -= aW;
       return *this;
  }

  cQuaternion& operator *= (float aW)
  {
       w_ *= aW;
       x_ *= aW;
       y_ *= aW;
       z_ *= aW;
       return *this;
  }

  cQuaternion& operator /= (float aW)
  {
       w_ /= aW;
       x_ /= aW;
       y_ /= aW;
       z_ /= aW;
       return *this;
  }

  cQuaternion& operator *= (const cQuaternion& aQuat)
  {
      w_ = w_*aQuat.w_ - x_*aQuat.x_ - y_*aQuat.y_ - z_*aQuat.z_;
      x_ = w_*aQuat.x_ + x_*aQuat.w_ + y_*aQuat.z_ - z_*aQuat.y_;
      y_ = w_*aQuat.y_ - x_*aQuat.z_ + y_*aQuat.w_ + z_*aQuat.x_;
      z_ = w_*aQuat.z_ + x_*aQuat.y_ - z_*aQuat.x_ + z_*aQuat.w_;

      return *this;
  }

  // axis must pre-normalize.
  void setToFromAxisAngle(float aX, float aY, float aZ, float aAngle)
  {
       float s,c;
       s = sin(aAngle/2.0f);
       c = cos(aAngle/2.0f);

       w_ = c;
       x_ = aX * s;
       y_ = aY * s;
       z_ = aZ * s;
  }
 
  float magnitude(void)
  {
       return sqrt(square());
  }

  const cQuaternion copyInvertQuaternion(void) const
  {
       float s = square();
  
       return cQuaternion(w_ / s, x_ / -s, y_ / -s, z_ / -s);
  }

 private:
  float square(void) const
  {
       return w_*w_+x_*x_+y_*y_+z_*z_;
  }
  float w_,x_,y_,z_;

 };

 inline const cQuaternion operator * (const cQuaternion& aLhs, const cQuaternion& aRhs)
 {
     return(cQuaternion(aLhs) *= aRhs);
 }

 inline const cQuaternion operator + (const cQuaternion& aQuat, float aScalar)
 {
     return(cQuaternion(aQuat) += aScalar);
 }

 inline const cQuaternion operator + (float aScalar, const cQuaternion& aQuat)
 {
     return(cQuaternion(aQuat) += aScalar);
 }

 inline const cQuaternion operator - (const cQuaternion& aQuat, float aScalar)
 {
     return(cQuaternion(aQuat) -= aScalar);
 }

 inline const cQuaternion operator - (float aScalar, const cQuaternion& aQuat)
 {
     return(
cQuaternion(aQuat) -= aScalar);
 }

 inline const cQuaternion operator * (const cQuaternion& aQuat, float aScalar)
 {
     return(cQuaternion(aQuat) *= aScalar);
 }

 inline const cQuaternion operator * (float aScalar, const cQuaternion& aQuat)
 {
     return(cQuaternion(aQuat) *= aScalar);
 }

 inline const cQuaternion operator / (const cQuaternion& aQuat, float aScalar)
 {
     return(cQuaternion(aQuat) /= aScalar);
 }

 inline const cQuaternion makeQuaternionFromAxisAngle(float aX, float aY, float aZ, float aAngle)
 {
      cQuaternion ret;
      ret.setToFromAxisAngle(aX,aY,aZ,aAngle);
      return ret;
 }

 inline const cQuaternion invertQuaternion(const cQuaternion& aQuat)
 {
      return cQuaternion(aQuat.copyInvertQuaternion());
 }
}


#endif//__QUATERNION_H__

댓글 1개:

  1. trackback from: Xcode에서 Hello world만들기
    오늘은 어제 배운 Hello world프로그램을 만들어볼까 합니다. XCODE에선 처음 프로젝트를 열었을때 기본적으로 Hello world프로그램이 만들어져있지만 오늘은 지우고 만들어 보겠습니다. ▲Xcode의 첫 화면입니다. Create a new Xcode project를 클릭합니다. ▲ Create버튼을 클릭하면 이런창이 뜹니다. 이곳에서 C를 클릭합니다. ▲저장하실 위치를 선택후 ▲이런 창이 뜨면 준비가 끝난것 입니다. ▲대부분 c언어는 알고..

    답글삭제