00001 #ifndef PH_JOINT1D_H 00002 #define PH_JOINT1D_H 00003 00004 #include "PHJoint.h" 00005 00006 namespace Spr{; 00007 00008 struct XJoint1D; 00009 00010 /// 1自由度の関節 00011 class PHJoint1D:public PHJointBase{ 00012 public: 00013 SGOBJECTDEFABST(PHJoint1D); 00014 double minPosition; ///< 可動範囲(最大値) 00015 double maxPosition; ///< 可動範囲(最小値) 00016 double torque; ///< トルク 00017 double accel; ///< 関節加速度 00018 double position; ///< 変位 00019 double velocity; ///< 速度 00020 void AddTorque(double t){ torque+=t; } ///< トルクを追加 00021 void SetTorque(double t){ torque=t; } ///< トルクを設定 00022 double GetTorque(){ return torque; } ///< トルクを取得 00023 double GetPosition(){ return position; }///< 関節角度を取得 00024 double GetVelocity(){ return velocity; }///< 関節速度を取得 00025 virtual void Integrate(SGScene* scene); ///< 積分 00026 void CompArticulatedInertia(double dt); ///< articulated inertia & ZA-force 00027 void CalcAccel(double dt); ///< このジョイントの加速度計算.詳細は基本クラスのコメントを参照. 00028 00029 /// 関節の自由度 00030 virtual int GetJointDof(){ return 1; } 00031 /// 関節位置の取得 00032 virtual double GetJointPosition(int i){ return position; } 00033 /// 関節速度の取得 00034 virtual double GetJointVelocity(int i){ return velocity; } 00035 /// 関節加速度の取得 00036 virtual double GetJointAccel(int i){ return accel; } 00037 /// 関節トルクの取得 00038 virtual double GetJointTorque(int i){ return torque; } 00039 /// 関節トルクの設定 00040 virtual void SetJointTorque(double v, int i){ torque = v; } 00041 /// 関節トルクを加える 00042 virtual void AddJointTorque(double v, int i){ torque += v; } 00043 00044 void SaveX(XJoint1D&) const; 00045 void LoadX(const XJoint1D&); 00046 protected: 00047 SpVec6d s; ///< spatial joint axis in Fc coord. 00048 // sを含むキャッシュ変数 00049 SpVec6d Ia_s; 00050 double dot_s_Ia_s, dot_s_Z_plus_Ia_c; 00051 00052 virtual void Reset(); 00053 /// 状態の読み出し 00054 virtual void LoadState(const SGBehaviorStates& states); 00055 /// 状態の保存 00056 virtual void SaveState(SGBehaviorStates& states) const; 00057 00058 virtual void ClearTorqueRecursive(); 00059 virtual void LimitAngle(double& d){} 00060 }; 00061 00062 /// 蝶番関節 00063 class PHJointHinge:public PHJoint1D{ 00064 protected: 00065 double massFactor; 00066 public: 00067 SGOBJECTDEF(PHJointHinge); 00068 virtual void CompJointAxis(); 00069 virtual void CompRelativePosition(); 00070 virtual void CompRelativeVelocity(); 00071 virtual void CompCoriolisAccel(); 00072 protected: 00073 virtual void Loaded(SGScene* s); 00074 virtual double MassFactor(); 00075 virtual void LimitAngle(double& t){ 00076 if (!_finite(t) || t > 1e6 || t < -1e6){ 00077 if (t>0) t = (double)M_PI; 00078 else t= - (double)M_PI; 00079 return; 00080 } 00081 int times; 00082 if (t > M_PI){ 00083 times = int((t+M_PI) / (2*M_PI)); 00084 }else if (t < -M_PI){ 00085 times = int((t-M_PI) / (2*M_PI)); 00086 }else{ 00087 return; 00088 } 00089 t -= (double)(times*(2*M_PI)); 00090 if (t < -M_PI || M_PI <= t){ 00091 DSTR << t << std::endl; 00092 assert(0); 00093 } 00094 } 00095 }; 00096 /// スライド関節 00097 class PHJointSlider:public PHJoint1D{ 00098 protected: 00099 double massFactor; 00100 public: 00101 SGOBJECTDEF(PHJointSlider); 00102 virtual void Loaded(SGScene* s); 00103 virtual double MassFactor(); 00104 virtual void CompJointAxis(); 00105 virtual void CompRelativePosition(); 00106 virtual void CompRelativeVelocity(); 00107 virtual void CompCoriolisAccel(); 00108 }; 00109 00110 } 00111 00112 #endif