/* ========================================================================== * ÀÛ ¼º ÀÚ : À̼ø±Ô * ÀÛ ¼º ÀÏ : 2006.12.20 * ³» ¿ë : Ä«¸Þ¶ó * ÁÖÀÇ»çÇ× : *===========================================================================*/ #pragma once /// Ä«¸Þ¶ó ////////////////////////////////////////////////////////////////////////// // Y Z // NI: |__ Z MAX(APP): |__ X // / / // -X -Y ////////////////////////////////////////////////////////////////////////// class cCamera { friend class cCameraManager; static const unsigned int MIN_NEAR_DIST = 10; static const unsigned int MAX_FAR_DIST = 50000; public: cCamera(); virtual ~cCamera(); /// ÃʱâÈ­ ¹× Á¾·á virtual bool Init( float width = 800.f, float height = 600.f ); /// Ä«¸Þ¶óÀÇ À§Ä¡ ¹æÇâ Á¤º¸¸¦ ¸®¼Â virtual void Reset(){}// = 0; virtual void Shake() {} /// ó¸® virtual void OnProcess( unsigned long deltaTime, unsigned long accumTime ); virtual void Update( unsigned long accumTime ); /// ±Ù°Å¸® float GetNearDistance() const; /// ¿ø°Å¸® void SetFarDistance( float farDist ); float GetFarDistance() const; /// ½Ã¾ß °¢»Ô´ë void SetViewFrustum( float width, float height ); void SetViewFrustum( float width, float height, float fovyDegree, float farDist ); void SetViewFrustum( float left, float right, float top, float bottom, float farDist ); /// ºäÆ÷Æ® void SetViewPort( float left = 0.f, float right = 1.f, float top = 1.f, float bottom = 0.f ); /// À̵¿ void SetTranslate( const NiPoint3& trans ); void SetTranslate( float x, float y, float z ); void Translate( const NiPoint3& move ); const NiPoint3& GetWorldTranslate() const; /// ȸÀü void SetRotate( const NiMatrix3& rot ); void Rotate( const NiPoint3& axis, float angle ); void Pitch( float angle ); void Yaw( float angle ); /// ¹æÇâ NiPoint3 GetWorldDirection() const; NiPoint3 GetWorldRightDir() const; NiNode* GetOrientNode() { return mOrientNode; } void ChangeNiCamera( NiCamera* cam ); /// ¼Ó·Â void SetSpeed( float unitsPerSec ); /// Á¾È¾ºñ float GetAspectRatio() const; /// ¸¶¿ì½º ÁÂÇ¥¿¡ ÇØ´çÇÏ´Â ¹ÝÁ÷¼± bool GetRayFromWindowPoint( long mouseX, long mouseY, NiPoint3& origin, NiPoint3& dir ) const; /// ½ÃÁ¡ virtual void SetLookAt( const NiPoint3& target ); void SetLookAt( float x, float y, float z ); const NiPoint3& GetLookAt() const; void ResetLookAt( const NiPoint3& target ); /// ½ÃÁ¡À¸·ÎºÎÅÍÀÇ °Å¸® void SetLookAtDistance( float dist ); float GetLookAtDistance() const; /// °»½Å ¿©ºÎ bool GetNeedUpdate() const; /// ¿£Áø Ä«¸Þ¶ó·Î Çüº¯È¯ operator NiCamera*() const { return mNiCamera; } protected: /// ÀԷ ó¸® virtual void OnProcessMouse( unsigned long time ) = 0; protected: /// È­¸é Å©±â float mWidth; float mHeight; /// ¼öÁ÷ ½Ã¾ß°¢ float mFovyDegree; /// ¿ø°Å¸® float mFarDistance; /// Á¾È¾ºñ float mAspectRatio; /// ¿£Áø Ä«¸Þ¶ó NiCameraPtr mNiCamera; /// Ä«¸Þ¶ó º¯È¯¿ë ³ëµå NiNodePtr mOrientNode; /// ¼Ó·Â float mSpeed; /// ½ÃÁ¡ NiPoint3 mTargetLookAt; NiPoint3 mLookAt; /// º¸Á¤µÈ ½ÃÁ¡°ú Ä«¸Þ¶ó »çÀÌÀÇ ½ÇÁ¦ °Å¸® float mLookAtDistance; /// °»½Å ¿©ºÎ bool mNeedUpdate; }; inline void cCamera::Update( unsigned long accumTime ) { mOrientNode->Update( accumTime * 0.001f ); } inline void cCamera::SetSpeed( float unitsPerSec ) { mSpeed = unitsPerSec; } inline float cCamera::GetNearDistance() const { return float(MIN_NEAR_DIST); } inline float cCamera::GetFarDistance() const { return mFarDistance; } inline float cCamera::GetAspectRatio() const { return mAspectRatio; } inline const NiPoint3& cCamera::GetWorldTranslate() const { return mNiCamera->GetWorldTranslate(); } inline NiPoint3 cCamera::GetWorldDirection() const { return mNiCamera->GetWorldDirection(); } inline NiPoint3 cCamera::GetWorldRightDir() const { return mNiCamera->GetWorldRightVector(); } inline bool cCamera::GetRayFromWindowPoint( long mouseX, long mouseY, NiPoint3& origin, NiPoint3& dir ) const { return mNiCamera->WindowPointToRay( mouseX, mouseY, origin, dir ); } inline void cCamera::SetLookAt( const NiPoint3& target ) { mTargetLookAt = target; } inline void cCamera::SetLookAt( float x, float y, float z ) { mTargetLookAt.x = x; mTargetLookAt.y = y; mTargetLookAt.z = z; } inline const NiPoint3& cCamera::GetLookAt() const { return mLookAt; } inline void cCamera::ResetLookAt( const NiPoint3& target ) { mLookAt = mTargetLookAt = target; } inline void cCamera::SetLookAtDistance( float dist ) { mLookAtDistance = dist; } inline float cCamera::GetLookAtDistance() const { return mLookAtDistance; } inline bool cCamera::GetNeedUpdate() const { return mNeedUpdate; }