22#include <kiwano-physics/PhysicBody.h>
28KGE_DECLARE_SMART_PTR(Joint);
29KGE_DECLARE_SMART_PTR(DistanceJoint);
30KGE_DECLARE_SMART_PTR(FrictionJoint);
31KGE_DECLARE_SMART_PTR(GearJoint);
32KGE_DECLARE_SMART_PTR(MotorJoint);
33KGE_DECLARE_SMART_PTR(MouseJoint);
34KGE_DECLARE_SMART_PTR(PrismaticJoint);
35KGE_DECLARE_SMART_PTR(PulleyJoint);
36KGE_DECLARE_SMART_PTR(RevoluteJoint);
37KGE_DECLARE_SMART_PTR(RopeJoint);
38KGE_DECLARE_SMART_PTR(WeldJoint);
39KGE_DECLARE_SMART_PTR(WheelJoint);
75 bool collide_connected;
80 , collide_connected(false)
84 ParamBase(PhysicBodyPtr body_a, PhysicBodyPtr body_b)
96 virtual bool Init(PhysicWorld* world);
100 bool Init(PhysicWorld* world, b2JointDef* joint_def);
104 PhysicBodyPtr GetBodyA()
const;
108 PhysicBodyPtr GetBodyB()
const;
112 PhysicWorld* GetWorld()
const;
120 b2Joint* GetB2Joint()
const;
124 void SetB2Joint(b2Joint* joint);
151 Param(PhysicBodyPtr body_a, PhysicBodyPtr body_b,
const Point& anchor_a,
const Point& anchor_b)
156 , damping_ratio(0.0f)
164 DistanceJoint(
const Param& param);
168 bool Init(PhysicWorld* world)
override;
172 void SetLength(
float length);
176 float GetLength()
const;
180 void SetFrequency(
float hz);
184 float GetFrequency()
const;
188 void SetDampingRatio(
float ratio);
192 float GetDampingRatio()
const;
196 b2DistanceJoint* raw_joint_;
215 Param(PhysicBodyPtr body_a, PhysicBodyPtr body_b,
const Point& anchor,
float max_force = 0.f,
float max_torque = 0.f)
218 , max_force(max_force)
219 , max_torque(max_torque)
227 FrictionJoint(
const Param& param);
231 bool Init(PhysicWorld* world)
override;
235 void SetMaxForce(
float force);
239 float GetMaxForce()
const;
243 void SetMaxTorque(
float torque);
247 float GetMaxTorque()
const;
251 b2FrictionJoint* raw_joint_;
268 :
Param(nullptr, nullptr)
272 Param(JointPtr joint_a, JointPtr joint_b,
float ratio = 1.f)
274 , joint_a(joint_a.Get())
275 , joint_b(joint_b.Get())
284 GearJoint(
const Param& param);
288 bool Init(PhysicWorld* world)
override;
292 void SetRatio(
float ratio);
296 float GetRatio()
const;
300 b2GearJoint* raw_joint_;
317 :
Param(nullptr, nullptr)
321 Param(PhysicBodyPtr body_a, PhysicBodyPtr body_b,
float max_force = 0.f,
float max_torque = 0.f)
323 , max_force(max_force)
324 , max_torque(max_torque)
325 , correction_factor(0.3f)
333 MotorJoint(
const Param& param);
337 bool Init(PhysicWorld* world)
override;
341 void SetMaxForce(
float force);
345 float GetMaxForce()
const;
349 void SetMaxTorque(
float torque);
353 float GetMaxTorque()
const;
357 b2MotorJoint* raw_joint_;
383 Param(PhysicBodyPtr body_a, PhysicBodyPtr body_b,
const Point& anchor,
const Vec2& axis)
387 , enable_limit(false)
388 , lower_translation(0.0f)
389 , upper_translation(0.0f)
390 , enable_motor(false)
391 , max_motor_force(0.0f)
400 PrismaticJoint(
const Param& param);
404 bool Init(PhysicWorld* world)
override;
408 float GetReferenceAngle()
const;
412 float GetJointTranslation()
const;
416 float GetJointSpeed()
const;
420 bool IsLimitEnabled()
const;
424 void EnableLimit(
bool flag);
428 float GetLowerLimit()
const;
432 float GetUpperLimit()
const;
436 void SetLimits(
float lower,
float upper);
440 bool IsMotorEnabled()
const;
444 void EnableMotor(
bool flag);
448 void SetMotorSpeed(
float speed);
452 float GetMotorSpeed()
const;
456 void SetMaxMotorForce(
float force);
460 float GetMaxMotorForce()
const;
464 b2PrismaticJoint* raw_joint_;
487 Param(PhysicBodyPtr body_a, PhysicBodyPtr body_b,
const Point& anchor_a,
const Point& anchor_b,
488 const Point& ground_anchor_a,
const Point& ground_anchor_b,
float ratio = 1.0f)
492 , ground_anchor_a(ground_anchor_a)
493 , ground_anchor_b(ground_anchor_b)
502 PulleyJoint(
const Param& param);
506 bool Init(PhysicWorld* world)
override;
510 Point GetGroundAnchorA()
const;
514 Point GetGroundAnchorB()
const;
518 float GetRatio()
const;
522 float GetLengthA()
const;
526 float GetLengthB()
const;
530 float GetCurrentLengthA()
const;
534 float GetCurrentLengthB()
const;
538 b2PulleyJoint* raw_joint_;
563 Param(PhysicBodyPtr body_a, PhysicBodyPtr body_b,
const Point& anchor)
566 , enable_limit(false)
569 , enable_motor(false)
570 , max_motor_torque(0.0f)
579 RevoluteJoint(
const Param& param);
583 bool Init(PhysicWorld* world)
override;
587 float GetReferenceAngle()
const;
591 float GetJointAngle()
const;
595 float GetJointSpeed()
const;
599 bool IsLimitEnabled()
const;
603 void EnableLimit(
bool flag);
607 float GetLowerLimit()
const;
611 float GetUpperLimit()
const;
615 void SetLimits(
float lower,
float upper);
619 bool IsMotorEnabled()
const;
623 void EnableMotor(
bool flag);
627 void SetMotorSpeed(
float speed);
631 float GetMotorSpeed()
const;
635 void SetMaxMotorTorque(
float torque);
639 float GetMaxMotorTorque()
const;
643 b2RevoluteJoint* raw_joint_;
664 Param(PhysicBodyPtr body_a, PhysicBodyPtr body_b,
const Point& local_anchor_a,
const Point& local_anchor_b)
666 , local_anchor_a(local_anchor_a)
667 , local_anchor_b(local_anchor_b)
676 RopeJoint(
const Param& param);
680 bool Init(PhysicWorld* world)
override;
684 void SetMaxLength(
float length);
688 float GetMaxLength()
const;
692 b2RopeJoint* raw_joint_;
713 Param(PhysicBodyPtr body_a, PhysicBodyPtr body_b,
const Point& anchor)
717 , damping_ratio(0.0f)
725 WeldJoint(
const Param& param);
729 bool Init(PhysicWorld* world)
override;
733 float GetReferenceAngle()
const;
737 void SetFrequency(
float hz);
741 float GetFrequency()
const;
745 void SetDampingRatio(
float ratio);
749 float GetDampingRatio()
const;
753 b2WeldJoint* raw_joint_;
778 Param(PhysicBodyPtr body_a, PhysicBodyPtr body_b,
const Point& anchor,
const Vec2& axis)
782 , enable_motor(false)
783 , max_motor_torque(0.0f)
786 , damping_ratio(0.7f)
794 WheelJoint(
const Param& param);
798 bool Init(PhysicWorld* world)
override;
802 float GetJointTranslation()
const;
806 float GetJointLinearSpeed()
const;
810 float GetJointAngle()
const;
814 float GetJointAngularSpeed()
const;
818 bool IsMotorEnabled()
const;
822 void EnableMotor(
bool flag);
826 void SetMotorSpeed(
float speed);
830 float GetMotorSpeed()
const;
834 void SetMaxMotorTorque(
float torque);
838 float GetMaxMotorTorque()
const;
842 void SetSpringFrequencyHz(
float hz);
846 float GetSpringFrequencyHz()
const;
850 void SetSpringDampingRatio(
float ratio);
854 float GetSpringDampingRatio()
const;
858 b2WheelJoint* raw_joint_;
881 Param(PhysicBodyPtr body_a, PhysicBodyPtr body_b,
const Point& target)
886 , damping_ratio(0.7f)
894 MouseJoint(
const Param& param);
898 bool Init(PhysicWorld* world)
override;
902 void SetMaxForce(
float force);
906 float GetMaxForce()
const;
910 void SetFrequency(
float hz);
914 float GetFrequency()
const;
918 void SetDampingRatio(
float ratio);
922 float GetDampingRatio()
const;
926 b2MouseJoint* raw_joint_;
942 KGE_ASSERT(raw_joint_);
943 raw_joint_->SetFrequency(hz);
947 KGE_ASSERT(raw_joint_);
948 return raw_joint_->GetFrequency();
952 KGE_ASSERT(raw_joint_);
953 raw_joint_->SetDampingRatio(ratio);
957 KGE_ASSERT(raw_joint_);
958 return raw_joint_->GetDampingRatio();
963 KGE_ASSERT(raw_joint_);
964 return math::Radian2Degree(raw_joint_->GetReferenceAngle());
968 KGE_ASSERT(raw_joint_);
969 return raw_joint_->IsLimitEnabled();
973 KGE_ASSERT(raw_joint_);
974 raw_joint_->EnableLimit(flag);
978 KGE_ASSERT(raw_joint_);
979 return raw_joint_->IsMotorEnabled();
983 KGE_ASSERT(raw_joint_);
984 raw_joint_->EnableMotor(flag);
988 KGE_ASSERT(raw_joint_);
989 raw_joint_->SetMotorSpeed(math::Degree2Radian(speed));
993 KGE_ASSERT(raw_joint_);
994 return math::Radian2Degree(raw_joint_->GetMotorSpeed());
998 KGE_ASSERT(raw_joint_);
999 raw_joint_->SetMaxMotorForce(force);
1003 KGE_ASSERT(raw_joint_);
1004 return raw_joint_->GetMaxMotorForce();
1009 KGE_ASSERT(raw_joint_);
1010 return math::Radian2Degree(raw_joint_->GetReferenceAngle());
1014 KGE_ASSERT(raw_joint_);
1015 return raw_joint_->IsLimitEnabled();
1019 KGE_ASSERT(raw_joint_);
1020 raw_joint_->EnableLimit(flag);
1024 KGE_ASSERT(raw_joint_);
1025 return raw_joint_->IsMotorEnabled();
1029 KGE_ASSERT(raw_joint_);
1030 raw_joint_->EnableMotor(flag);
1034 KGE_ASSERT(raw_joint_);
1035 raw_joint_->SetMotorSpeed(math::Degree2Radian(speed));
1039 KGE_ASSERT(raw_joint_);
1040 return math::Radian2Degree(raw_joint_->GetMotorSpeed());
1045 KGE_ASSERT(raw_joint_);
1046 return math::Radian2Degree(raw_joint_->GetReferenceAngle());
1050 KGE_ASSERT(raw_joint_);
1051 raw_joint_->SetFrequency(hz);
1055 KGE_ASSERT(raw_joint_);
1056 return raw_joint_->GetFrequency();
1060 KGE_ASSERT(raw_joint_);
1061 raw_joint_->SetDampingRatio(ratio);
1065 KGE_ASSERT(raw_joint_);
1066 return raw_joint_->GetDampingRatio();
1071 KGE_ASSERT(raw_joint_);
1072 return math::Radian2Degree(raw_joint_->GetJointAngle());
1076 KGE_ASSERT(raw_joint_);
1077 return math::Radian2Degree(raw_joint_->GetJointAngularSpeed());
1081 KGE_ASSERT(raw_joint_);
1082 return raw_joint_->IsMotorEnabled();
1086 KGE_ASSERT(raw_joint_);
1087 raw_joint_->EnableMotor(flag);
1091 KGE_ASSERT(raw_joint_);
1092 raw_joint_->SetMotorSpeed(math::Degree2Radian(speed));
1096 KGE_ASSERT(raw_joint_);
1097 return math::Radian2Degree(raw_joint_->GetMotorSpeed());
1101 KGE_ASSERT(raw_joint_);
1102 raw_joint_->SetSpringFrequencyHz(hz);
1106 KGE_ASSERT(raw_joint_);
1107 return raw_joint_->GetSpringFrequencyHz();
1111 KGE_ASSERT(raw_joint_);
1112 raw_joint_->SetSpringDampingRatio(ratio);
1116 KGE_ASSERT(raw_joint_);
1117 return raw_joint_->GetSpringDampingRatio();
1122 KGE_ASSERT(raw_joint_);
1123 raw_joint_->SetFrequency(hz);
1127 KGE_ASSERT(raw_joint_);
1128 return raw_joint_->GetFrequency();
1132 KGE_ASSERT(raw_joint_);
1133 raw_joint_->SetDampingRatio(ratio);
1137 KGE_ASSERT(raw_joint_);
1138 return raw_joint_->GetDampingRatio();
基础对象
Definition: ObjectBase.h:137
固定距离关节
Definition: Joint.h:135
void SetFrequency(float hz)
设置弹簧响应速度 [赫兹]
Definition: Joint.h:940
float GetFrequency() const
获取弹簧响应速度 [赫兹]
Definition: Joint.h:945
float GetDampingRatio() const
获取阻尼率
Definition: Joint.h:955
void SetDampingRatio(float ratio)
设置阻尼率
Definition: Joint.h:950
摩擦关节
Definition: Joint.h:202
齿轮关节
Definition: Joint.h:257
PhysicWorld * GetWorld() const
获取物理世界
Definition: Joint.h:935
Type
关节类型
Definition: Joint.h:54
b2Joint * GetB2Joint() const
获取b2Joint
Definition: Joint.h:931
马达关节
Definition: Joint.h:306
鼠标关节
Definition: Joint.h:865
void SetDampingRatio(float ratio)
设置阻尼率
Definition: Joint.h:1130
float GetDampingRatio() const
获取阻尼率
Definition: Joint.h:1135
float GetFrequency() const
获取响应速度 [hz]
Definition: Joint.h:1125
void SetFrequency(float hz)
设置响应速度 [hz]
Definition: Joint.h:1120
物体
Definition: PhysicBody.h:40
物理世界
Definition: PhysicWorld.h:45
平移关节
Definition: Joint.h:363
void SetMaxMotorForce(float force)
设置最大马达力 [N]
Definition: Joint.h:996
float GetMaxMotorForce() const
获取最大马达力 [N]
Definition: Joint.h:1001
bool IsMotorEnabled() const
是否启用马达
Definition: Joint.h:976
bool IsLimitEnabled() const
是否启用关节限制
Definition: Joint.h:966
float GetMotorSpeed() const
获取马达转速 [degree/s]
Definition: Joint.h:991
float GetReferenceAngle() const
获取参考角
Definition: Joint.h:961
void EnableMotor(bool flag)
设置是否启用马达
Definition: Joint.h:981
void EnableLimit(bool flag)
设置是否启用关节限制
Definition: Joint.h:971
void SetMotorSpeed(float speed)
设置马达转速 [degree/s]
Definition: Joint.h:986
滑轮关节
Definition: Joint.h:470
旋转关节
Definition: Joint.h:544
bool IsMotorEnabled() const
是否启用马达
Definition: Joint.h:1022
float GetMotorSpeed() const
获取马达转速 [degree/s]
Definition: Joint.h:1037
bool IsLimitEnabled() const
是否启用关节限制
Definition: Joint.h:1012
void EnableLimit(bool flag)
设置是否启用关节限制
Definition: Joint.h:1017
float GetReferenceAngle() const
获取参考角
Definition: Joint.h:1007
void EnableMotor(bool flag)
设置是否启用马达
Definition: Joint.h:1027
void SetMotorSpeed(float speed)
设置马达转速 [degree/s]
Definition: Joint.h:1032
绳关节
Definition: Joint.h:649
焊接关节
Definition: Joint.h:698
float GetDampingRatio() const
获取阻尼率
Definition: Joint.h:1063
float GetReferenceAngle() const
获取物体B相对于物体A的角度
Definition: Joint.h:1043
void SetDampingRatio(float ratio)
设置阻尼率
Definition: Joint.h:1058
void SetFrequency(float hz)
设置弹簧响应速度 [赫兹]
Definition: Joint.h:1048
float GetFrequency() const
获取弹簧响应速度 [赫兹]
Definition: Joint.h:1053
轮关节
Definition: Joint.h:759
float GetSpringFrequencyHz() const
获取弹簧响应速度
Definition: Joint.h:1104
float GetSpringDampingRatio() const
获取弹簧阻尼率
Definition: Joint.h:1114
float GetJointAngle() const
获取关节当前的角度
Definition: Joint.h:1069
float GetJointAngularSpeed() const
获取关节当前的旋转速度
Definition: Joint.h:1074
void SetSpringFrequencyHz(float hz)
设置弹簧响应速度
Definition: Joint.h:1099
float GetMotorSpeed() const
获取马达转速 [degree/s]
Definition: Joint.h:1094
void SetMotorSpeed(float speed)
设置马达转速 [degree/s]
Definition: Joint.h:1089
void SetSpringDampingRatio(float ratio)
设置弹簧阻尼率
Definition: Joint.h:1109
void EnableMotor(bool flag)
设置是否启用马达
Definition: Joint.h:1084
bool IsMotorEnabled() const
是否启用马达
Definition: Joint.h:1079
固定距离关节参数
Definition: Joint.h:140
float damping_ratio
阻尼率,值越大关节运动阻尼越大
Definition: Joint.h:144
Point anchor_b
关节在物体B上的连接点
Definition: Joint.h:142
Point anchor_a
关节在物体A上的连接点
Definition: Joint.h:141
float frequency_hz
响应速度,数值越高关节响应的速度越快,看上去越坚固
Definition: Joint.h:143
float max_force
最大摩擦力
Definition: Joint.h:207
Point anchor
摩擦作用点
Definition: Joint.h:206
float max_torque
最大扭力
Definition: Joint.h:208
齿轮关节参数
Definition: Joint.h:262
float ratio
齿轮传动比
Definition: Joint.h:265
Joint * joint_b
关节B(旋转关节/平移关节)
Definition: Joint.h:264
Joint * joint_a
关节A(旋转关节/平移关节)
Definition: Joint.h:263
关节基础参数
Definition: Joint.h:72
PhysicBody * body_a
关节连接的物体A
Definition: Joint.h:73
PhysicBody * body_b
关节连接的物体B
Definition: Joint.h:74
马达关节参数
Definition: Joint.h:311
float max_force
最大摩擦力
Definition: Joint.h:312
float max_torque
最大转矩
Definition: Joint.h:313
float correction_factor
位置矫正因子(范围 0-1)
Definition: Joint.h:314
鼠标关节参数
Definition: Joint.h:870
float frequency_hz
响应速度,数值越高关节响应的速度越快,看上去越坚固
Definition: Joint.h:873
Point target
关节作用目标位置
Definition: Joint.h:871
float max_force
作用在物体A上的最大力
Definition: Joint.h:872
float damping_ratio
阻尼率,值越大关节运动阻尼越大
Definition: Joint.h:874
平移关节参数
Definition: Joint.h:368
Vec2 axis
物体A滑动的方向
Definition: Joint.h:370
float max_motor_force
最大马达力 [N]
Definition: Joint.h:375
Point anchor
关节位置
Definition: Joint.h:369
float lower_translation
移动的最小限制,与方向同向为正,反向为负,启用限制后才有效果
Definition: Joint.h:372
float motor_speed
马达转速 [degree/s]
Definition: Joint.h:376
float upper_translation
移动的最大限制,与方向同向为正,反向为负,启用限制后才有效果
Definition: Joint.h:373
bool enable_limit
是否启用限制
Definition: Joint.h:371
bool enable_motor
是否启用马达
Definition: Joint.h:374
滑轮关节参数
Definition: Joint.h:475
float ratio
滑轮比,关节传动时,滑轮上升和下降的两头的位移比例
Definition: Joint.h:480
Point anchor_a
关节在物体A上的作用点
Definition: Joint.h:476
Point ground_anchor_b
物体B对应的滑轮的位置
Definition: Joint.h:479
Point anchor_b
关节在物体B上的作用点
Definition: Joint.h:477
Point ground_anchor_a
物体A对应的滑轮的位置
Definition: Joint.h:478
旋转关节参数
Definition: Joint.h:549
float motor_speed
马达转速 [degree/s]
Definition: Joint.h:556
Point anchor
关节位置
Definition: Joint.h:550
bool enable_motor
是否启用马达
Definition: Joint.h:554
bool enable_limit
是否启用限制
Definition: Joint.h:551
float upper_angle
移动的最大限制,与方向同向为正,反向为负,启用限制后才有效果
Definition: Joint.h:553
float lower_angle
移动的最小限制,与方向同向为正,反向为负,启用限制后才有效果
Definition: Joint.h:552
float max_motor_torque
最大马达力 [N]
Definition: Joint.h:555
绳关节参数
Definition: Joint.h:654
float max_length
绳索最大长度
Definition: Joint.h:657
Point local_anchor_b
关节在物体B上的连接点
Definition: Joint.h:656
Point local_anchor_a
关节在物体A上的连接点
Definition: Joint.h:655
焊接关节参数
Definition: Joint.h:703
float frequency_hz
响应速度,数值越高关节响应的速度越快,看上去越坚固
Definition: Joint.h:705
float damping_ratio
阻尼率,值越大关节运动阻尼越大
Definition: Joint.h:706
Point anchor
焊接位置
Definition: Joint.h:704
轮关节参数
Definition: Joint.h:764
float max_motor_torque
最大马达力 [N]
Definition: Joint.h:768
float damping_ratio
弹簧阻尼率,值越大关节运动阻尼越大
Definition: Joint.h:771
float motor_speed
马达转速 [degree/s]
Definition: Joint.h:769
Vec2 axis
物体A滑动方向
Definition: Joint.h:766
bool enable_motor
是否启用马达
Definition: Joint.h:767
Point anchor
轮关节位置
Definition: Joint.h:765
float frequency_hz
响应速度,数值越高关节响应的速度越快,看上去越坚固
Definition: Joint.h:770