Add physics Joints
This commit is contained in:
parent
0484446bc1
commit
7bb7dfa8a4
|
|
@ -104,12 +104,12 @@ namespace kiwano
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
DistanceJointPtr DistanceJoint::Create(World* world, Param const& param)
|
DistanceJointPtr DistanceJoint::Create(World* world, DistanceJoint::Param const& param)
|
||||||
{
|
{
|
||||||
KGE_ASSERT(param.body_a && param.body_b);
|
KGE_ASSERT(param.body_a && param.body_b);
|
||||||
|
|
||||||
b2DistanceJointDef def;
|
b2DistanceJointDef def;
|
||||||
def.Initialize(param.body_a->GetB2Body(), param.body_b->GetB2Body(), world->Stage2World(param.local_anchor_a), world->Stage2World(param.local_anchor_b));
|
def.Initialize(param.body_a->GetB2Body(), param.body_b->GetB2Body(), world->Stage2World(param.anchor_a), world->Stage2World(param.anchor_b));
|
||||||
def.frequencyHz = param.frequency_hz;
|
def.frequencyHz = param.frequency_hz;
|
||||||
def.dampingRatio = param.damping_ratio;
|
def.dampingRatio = param.damping_ratio;
|
||||||
|
|
||||||
|
|
@ -146,7 +146,7 @@ namespace kiwano
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
FrictionJointPtr FrictionJoint::Create(World* world, Param const& param)
|
FrictionJointPtr FrictionJoint::Create(World* world, FrictionJoint::Param const& param)
|
||||||
{
|
{
|
||||||
KGE_ASSERT(param.body_a && param.body_b);
|
KGE_ASSERT(param.body_a && param.body_b);
|
||||||
|
|
||||||
|
|
@ -200,7 +200,7 @@ namespace kiwano
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
GearJointPtr GearJoint::Create(World* world, Param const& param)
|
GearJointPtr GearJoint::Create(World* world, GearJoint::Param const& param)
|
||||||
{
|
{
|
||||||
KGE_ASSERT(param.joint_a && param.joint_b);
|
KGE_ASSERT(param.joint_a && param.joint_b);
|
||||||
|
|
||||||
|
|
@ -242,7 +242,7 @@ namespace kiwano
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
MotorJointPtr MotorJoint::Create(World* world, Param const& param)
|
MotorJointPtr MotorJoint::Create(World* world, MotorJoint::Param const& param)
|
||||||
{
|
{
|
||||||
KGE_ASSERT(param.body_a && param.body_b);
|
KGE_ASSERT(param.body_a && param.body_b);
|
||||||
|
|
||||||
|
|
@ -280,6 +280,291 @@ namespace kiwano
|
||||||
return world_->World2Stage(raw_joint_->GetMaxTorque());
|
return world_->World2Stage(raw_joint_->GetMaxTorque());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// PrismaticJoint
|
||||||
|
//
|
||||||
|
|
||||||
|
PrismaticJoint::PrismaticJoint()
|
||||||
|
: Joint()
|
||||||
|
, raw_joint_(nullptr)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
PrismaticJoint::PrismaticJoint(World* world, b2PrismaticJointDef* def)
|
||||||
|
: Joint(world, def)
|
||||||
|
, raw_joint_(nullptr)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
PrismaticJointPtr PrismaticJoint::Create(World* world, PrismaticJoint::Param const& param)
|
||||||
|
{
|
||||||
|
KGE_ASSERT(param.body_a && param.body_b);
|
||||||
|
|
||||||
|
b2PrismaticJointDef def;
|
||||||
|
def.Initialize(param.body_a->GetB2Body(), param.body_b->GetB2Body(), world->Stage2World(param.anchor), Stage2World(param.axis));
|
||||||
|
def.enableLimit = param.enable_limit;
|
||||||
|
def.lowerTranslation = world->Stage2World(param.lower_translation);
|
||||||
|
def.upperTranslation = world->Stage2World(param.upper_translation);
|
||||||
|
def.enableMotor = param.enable_motor;
|
||||||
|
def.maxMotorForce = param.max_motor_force;
|
||||||
|
def.motorSpeed = world->Stage2World(param.motor_speed);
|
||||||
|
|
||||||
|
PrismaticJointPtr joint = new PrismaticJoint(world, &def);
|
||||||
|
joint->raw_joint_ = static_cast<b2PrismaticJoint*>(joint->GetB2Joint());
|
||||||
|
return joint;
|
||||||
|
}
|
||||||
|
|
||||||
|
float PrismaticJoint::GetJointTranslation() const
|
||||||
|
{
|
||||||
|
KGE_ASSERT(raw_joint_ && world_);
|
||||||
|
return world_->World2Stage(raw_joint_->GetJointTranslation());
|
||||||
|
}
|
||||||
|
|
||||||
|
float PrismaticJoint::GetJointSpeed() const
|
||||||
|
{
|
||||||
|
KGE_ASSERT(raw_joint_ && world_);
|
||||||
|
return world_->World2Stage(raw_joint_->GetJointSpeed());
|
||||||
|
}
|
||||||
|
|
||||||
|
float PrismaticJoint::GetLowerLimit() const
|
||||||
|
{
|
||||||
|
KGE_ASSERT(raw_joint_ && world_);
|
||||||
|
return world_->World2Stage(raw_joint_->GetLowerLimit());
|
||||||
|
}
|
||||||
|
|
||||||
|
float PrismaticJoint::GetUpperLimit() const
|
||||||
|
{
|
||||||
|
KGE_ASSERT(raw_joint_ && world_);
|
||||||
|
return world_->World2Stage(raw_joint_->GetUpperLimit());
|
||||||
|
}
|
||||||
|
|
||||||
|
void PrismaticJoint::SetLimits(float lower, float upper)
|
||||||
|
{
|
||||||
|
KGE_ASSERT(raw_joint_ && world_);
|
||||||
|
raw_joint_->SetLimits(world_->Stage2World(lower), world_->Stage2World(upper));
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// PulleyJoint
|
||||||
|
//
|
||||||
|
|
||||||
|
PulleyJoint::PulleyJoint()
|
||||||
|
: Joint()
|
||||||
|
, raw_joint_(nullptr)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
PulleyJoint::PulleyJoint(World* world, b2PulleyJointDef* def)
|
||||||
|
: Joint(world, def)
|
||||||
|
, raw_joint_(nullptr)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
PulleyJointPtr PulleyJoint::Create(World* world, PulleyJoint::Param const& param)
|
||||||
|
{
|
||||||
|
KGE_ASSERT(param.body_a && param.body_b);
|
||||||
|
|
||||||
|
b2PulleyJointDef def;
|
||||||
|
def.Initialize(param.body_a->GetB2Body(), param.body_b->GetB2Body(), world->Stage2World(param.ground_anchor_a), world->Stage2World(param.ground_anchor_b),
|
||||||
|
world->Stage2World(param.anchor_a), world->Stage2World(param.anchor_b), param.ratio);
|
||||||
|
|
||||||
|
PulleyJointPtr joint = new PulleyJoint(world, &def);
|
||||||
|
joint->raw_joint_ = static_cast<b2PulleyJoint*>(joint->GetB2Joint());
|
||||||
|
return joint;
|
||||||
|
}
|
||||||
|
|
||||||
|
Point PulleyJoint::GetGroundAnchorA() const
|
||||||
|
{
|
||||||
|
KGE_ASSERT(raw_joint_ && world_);
|
||||||
|
return world_->World2Stage(raw_joint_->GetGroundAnchorA());
|
||||||
|
}
|
||||||
|
|
||||||
|
Point PulleyJoint::GetGroundAnchorB() const
|
||||||
|
{
|
||||||
|
KGE_ASSERT(raw_joint_ && world_);
|
||||||
|
return world_->World2Stage(raw_joint_->GetGroundAnchorB());
|
||||||
|
}
|
||||||
|
|
||||||
|
float PulleyJoint::GetRatio() const
|
||||||
|
{
|
||||||
|
KGE_ASSERT(raw_joint_);
|
||||||
|
return raw_joint_->GetRatio();
|
||||||
|
}
|
||||||
|
|
||||||
|
float PulleyJoint::GetLengthA() const
|
||||||
|
{
|
||||||
|
KGE_ASSERT(raw_joint_ && world_);
|
||||||
|
return world_->World2Stage(raw_joint_->GetLengthA());
|
||||||
|
}
|
||||||
|
|
||||||
|
float PulleyJoint::GetLengthB() const
|
||||||
|
{
|
||||||
|
KGE_ASSERT(raw_joint_ && world_);
|
||||||
|
return world_->World2Stage(raw_joint_->GetLengthB());
|
||||||
|
}
|
||||||
|
|
||||||
|
float PulleyJoint::GetCurrentLengthA() const
|
||||||
|
{
|
||||||
|
KGE_ASSERT(raw_joint_ && world_);
|
||||||
|
return world_->World2Stage(raw_joint_->GetCurrentLengthA());
|
||||||
|
}
|
||||||
|
|
||||||
|
float PulleyJoint::GetCurrentLengthB() const
|
||||||
|
{
|
||||||
|
KGE_ASSERT(raw_joint_ && world_);
|
||||||
|
return world_->World2Stage(raw_joint_->GetCurrentLengthB());
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// RevoluteJoint
|
||||||
|
//
|
||||||
|
|
||||||
|
RevoluteJoint::RevoluteJoint()
|
||||||
|
: Joint()
|
||||||
|
, raw_joint_(nullptr)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
RevoluteJoint::RevoluteJoint(World* world, b2RevoluteJointDef* def)
|
||||||
|
: Joint(world, def)
|
||||||
|
, raw_joint_(nullptr)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
RevoluteJointPtr RevoluteJoint::Create(World* world, RevoluteJoint::Param const& param)
|
||||||
|
{
|
||||||
|
KGE_ASSERT(param.body_a && param.body_b);
|
||||||
|
|
||||||
|
b2RevoluteJointDef def;
|
||||||
|
def.Initialize(param.body_a->GetB2Body(), param.body_b->GetB2Body(), world->Stage2World(param.anchor));
|
||||||
|
def.enableLimit = param.enable_limit;
|
||||||
|
def.lowerAngle = math::Angle2Radian(param.lower_angle);
|
||||||
|
def.upperAngle = math::Angle2Radian(param.upper_angle);
|
||||||
|
def.enableMotor = param.enable_motor;
|
||||||
|
def.maxMotorTorque = world->Stage2World(param.max_motor_torque);
|
||||||
|
def.motorSpeed = math::Angle2Radian(param.motor_speed);
|
||||||
|
|
||||||
|
RevoluteJointPtr joint = new RevoluteJoint(world, &def);
|
||||||
|
joint->raw_joint_ = static_cast<b2RevoluteJoint*>(joint->GetB2Joint());
|
||||||
|
return joint;
|
||||||
|
}
|
||||||
|
|
||||||
|
float RevoluteJoint::GetJointAngle() const
|
||||||
|
{
|
||||||
|
KGE_ASSERT(raw_joint_ && world_);
|
||||||
|
return math::Radian2Angle(raw_joint_->GetJointAngle());
|
||||||
|
}
|
||||||
|
|
||||||
|
float RevoluteJoint::GetJointSpeed() const
|
||||||
|
{
|
||||||
|
KGE_ASSERT(raw_joint_ && world_);
|
||||||
|
return math::Radian2Angle(raw_joint_->GetJointSpeed());
|
||||||
|
}
|
||||||
|
|
||||||
|
float RevoluteJoint::GetLowerLimit() const
|
||||||
|
{
|
||||||
|
KGE_ASSERT(raw_joint_ && world_);
|
||||||
|
return math::Radian2Angle(raw_joint_->GetLowerLimit());
|
||||||
|
}
|
||||||
|
|
||||||
|
float RevoluteJoint::GetUpperLimit() const
|
||||||
|
{
|
||||||
|
KGE_ASSERT(raw_joint_ && world_);
|
||||||
|
return math::Radian2Angle(raw_joint_->GetUpperLimit());
|
||||||
|
}
|
||||||
|
|
||||||
|
void RevoluteJoint::SetLimits(float lower, float upper)
|
||||||
|
{
|
||||||
|
KGE_ASSERT(raw_joint_ && world_);
|
||||||
|
raw_joint_->SetLimits(math::Angle2Radian(lower), math::Angle2Radian(upper));
|
||||||
|
}
|
||||||
|
|
||||||
|
void RevoluteJoint::SetMaxMotorTorque(float torque)
|
||||||
|
{
|
||||||
|
KGE_ASSERT(raw_joint_ && world_);
|
||||||
|
raw_joint_->SetMaxMotorTorque(world_->Stage2World(torque));
|
||||||
|
}
|
||||||
|
|
||||||
|
float RevoluteJoint::GetMaxMotorTorque() const
|
||||||
|
{
|
||||||
|
KGE_ASSERT(raw_joint_ && world_);
|
||||||
|
return world_->World2Stage(raw_joint_->GetMaxMotorTorque());
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// RopeJoint
|
||||||
|
//
|
||||||
|
|
||||||
|
RopeJoint::RopeJoint()
|
||||||
|
: Joint()
|
||||||
|
, raw_joint_(nullptr)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
RopeJoint::RopeJoint(World* world, b2RopeJointDef* def)
|
||||||
|
: Joint(world, def)
|
||||||
|
, raw_joint_(nullptr)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
RopeJointPtr RopeJoint::Create(World* world, RopeJoint::Param const& param)
|
||||||
|
{
|
||||||
|
KGE_ASSERT(param.body_a && param.body_b);
|
||||||
|
|
||||||
|
b2RopeJointDef def;
|
||||||
|
def.bodyA = param.body_a->GetB2Body();
|
||||||
|
def.bodyB = param.body_b->GetB2Body();
|
||||||
|
def.localAnchorA = world->Stage2World(param.local_anchor_a);
|
||||||
|
def.localAnchorB = world->Stage2World(param.local_anchor_b);
|
||||||
|
def.maxLength = world->Stage2World(param.max_length);
|
||||||
|
|
||||||
|
RopeJointPtr joint = new RopeJoint(world, &def);
|
||||||
|
joint->raw_joint_ = static_cast<b2RopeJoint*>(joint->GetB2Joint());
|
||||||
|
return joint;
|
||||||
|
}
|
||||||
|
|
||||||
|
void RopeJoint::SetMaxLength(float length)
|
||||||
|
{
|
||||||
|
KGE_ASSERT(raw_joint_ && world_);
|
||||||
|
raw_joint_->SetMaxLength(world_->Stage2World(length));
|
||||||
|
}
|
||||||
|
|
||||||
|
float RopeJoint::GetMaxLength() const
|
||||||
|
{
|
||||||
|
KGE_ASSERT(raw_joint_ && world_);
|
||||||
|
return world_->World2Stage(raw_joint_->GetMaxLength());
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// WeldJoint
|
||||||
|
//
|
||||||
|
|
||||||
|
WeldJoint::WeldJoint()
|
||||||
|
: Joint()
|
||||||
|
, raw_joint_(nullptr)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
WeldJoint::WeldJoint(World* world, b2WeldJointDef* def)
|
||||||
|
: Joint(world, def)
|
||||||
|
, raw_joint_(nullptr)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
WeldJointPtr WeldJoint::Create(World* world, WeldJoint::Param const& param)
|
||||||
|
{
|
||||||
|
KGE_ASSERT(param.body_a && param.body_b);
|
||||||
|
|
||||||
|
b2WeldJointDef def;
|
||||||
|
def.Initialize(param.body_a->GetB2Body(), param.body_b->GetB2Body(), world->Stage2World(param.anchor));
|
||||||
|
def.frequencyHz = param.frequency_hz;
|
||||||
|
def.dampingRatio = param.damping_ratio;
|
||||||
|
|
||||||
|
WeldJointPtr joint = new WeldJoint(world, &def);
|
||||||
|
joint->raw_joint_ = static_cast<b2WeldJoint*>(joint->GetB2Joint());
|
||||||
|
return joint;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// WheelJoint
|
// WheelJoint
|
||||||
//
|
//
|
||||||
|
|
@ -296,12 +581,12 @@ namespace kiwano
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
WheelJointPtr WheelJoint::Create(World* world, Param const& param)
|
WheelJointPtr WheelJoint::Create(World* world, WheelJoint::Param const& param)
|
||||||
{
|
{
|
||||||
KGE_ASSERT(param.body_a && param.body_b);
|
KGE_ASSERT(param.body_a && param.body_b);
|
||||||
|
|
||||||
b2WheelJointDef def;
|
b2WheelJointDef def;
|
||||||
def.Initialize(param.body_a->GetB2Body(), param.body_b->GetB2Body(), world->Stage2World(param.anchor), world->Stage2World(param.axis));
|
def.Initialize(param.body_a->GetB2Body(), param.body_b->GetB2Body(), world->Stage2World(param.anchor), Stage2World(param.axis));
|
||||||
def.enableMotor = param.enable_motor;
|
def.enableMotor = param.enable_motor;
|
||||||
def.maxMotorTorque = world->Stage2World(param.max_motor_torque);
|
def.maxMotorTorque = world->Stage2World(param.max_motor_torque);
|
||||||
def.motorSpeed = world->Stage2World(param.motor_speed);
|
def.motorSpeed = world->Stage2World(param.motor_speed);
|
||||||
|
|
@ -353,15 +638,14 @@ namespace kiwano
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
MouseJointPtr MouseJoint::Create(World* world, Param const& param)
|
MouseJointPtr MouseJoint::Create(World* world, MouseJoint::Param const& param)
|
||||||
{
|
{
|
||||||
KGE_ASSERT(param.body_a && param.body_b);
|
KGE_ASSERT(param.body_a && param.body_b);
|
||||||
KGE_ASSERT(param.body_a->GetWorld() && param.body_a->GetWorld() == param.body_b->GetWorld());
|
|
||||||
|
|
||||||
b2MouseJointDef def;
|
b2MouseJointDef def;
|
||||||
def.bodyA = param.body_a->GetB2Body();
|
def.bodyA = param.body_a->GetB2Body();
|
||||||
def.bodyB = param.body_b->GetB2Body();
|
def.bodyB = param.body_b->GetB2Body();
|
||||||
def.target = param.body_a->GetWorld()->Stage2World(param.target);
|
def.target = world->Stage2World(param.target);
|
||||||
def.maxForce = param.max_force;
|
def.maxForce = param.max_force;
|
||||||
def.frequencyHz = param.frequency_hz;
|
def.frequencyHz = param.frequency_hz;
|
||||||
def.dampingRatio = param.damping_ratio;
|
def.dampingRatio = param.damping_ratio;
|
||||||
|
|
|
||||||
|
|
@ -31,8 +31,13 @@ namespace kiwano
|
||||||
KGE_DECLARE_SMART_PTR(FrictionJoint);
|
KGE_DECLARE_SMART_PTR(FrictionJoint);
|
||||||
KGE_DECLARE_SMART_PTR(GearJoint);
|
KGE_DECLARE_SMART_PTR(GearJoint);
|
||||||
KGE_DECLARE_SMART_PTR(MotorJoint);
|
KGE_DECLARE_SMART_PTR(MotorJoint);
|
||||||
KGE_DECLARE_SMART_PTR(WheelJoint);
|
|
||||||
KGE_DECLARE_SMART_PTR(MouseJoint);
|
KGE_DECLARE_SMART_PTR(MouseJoint);
|
||||||
|
KGE_DECLARE_SMART_PTR(PrismaticJoint);
|
||||||
|
KGE_DECLARE_SMART_PTR(PulleyJoint);
|
||||||
|
KGE_DECLARE_SMART_PTR(RevoluteJoint);
|
||||||
|
KGE_DECLARE_SMART_PTR(RopeJoint);
|
||||||
|
KGE_DECLARE_SMART_PTR(WeldJoint);
|
||||||
|
KGE_DECLARE_SMART_PTR(WheelJoint);
|
||||||
|
|
||||||
// ¹Ø½Ú
|
// ¹Ø½Ú
|
||||||
class KGE_API Joint
|
class KGE_API Joint
|
||||||
|
|
@ -93,22 +98,22 @@ namespace kiwano
|
||||||
public:
|
public:
|
||||||
struct Param : public Joint::ParamBase
|
struct Param : public Joint::ParamBase
|
||||||
{
|
{
|
||||||
Point local_anchor_a;
|
Point anchor_a;
|
||||||
Point local_anchor_b;
|
Point anchor_b;
|
||||||
float frequency_hz;
|
float frequency_hz;
|
||||||
float damping_ratio;
|
float damping_ratio;
|
||||||
|
|
||||||
Param(
|
Param(
|
||||||
Body* body_a,
|
Body* body_a,
|
||||||
Body* body_b,
|
Body* body_b,
|
||||||
Point const& local_anchor_a,
|
Point const& anchor_a,
|
||||||
Point const& local_anchor_b,
|
Point const& anchor_b,
|
||||||
float frequency_hz = 0.f,
|
float frequency_hz = 0.f,
|
||||||
float damping_ratio = 0.f
|
float damping_ratio = 0.f
|
||||||
)
|
)
|
||||||
: ParamBase(body_a, body_b)
|
: ParamBase(body_a, body_b)
|
||||||
, local_anchor_a(local_anchor_a)
|
, anchor_a(anchor_a)
|
||||||
, local_anchor_b(local_anchor_b)
|
, anchor_b(anchor_b)
|
||||||
, frequency_hz(frequency_hz)
|
, frequency_hz(frequency_hz)
|
||||||
, damping_ratio(damping_ratio)
|
, damping_ratio(damping_ratio)
|
||||||
{}
|
{}
|
||||||
|
|
@ -116,12 +121,12 @@ namespace kiwano
|
||||||
Param(
|
Param(
|
||||||
BodyPtr body_a,
|
BodyPtr body_a,
|
||||||
BodyPtr body_b,
|
BodyPtr body_b,
|
||||||
Point const& local_anchor_a,
|
Point const& anchor_a,
|
||||||
Point const& local_anchor_b,
|
Point const& anchor_b,
|
||||||
float frequency_hz = 0.f,
|
float frequency_hz = 0.f,
|
||||||
float damping_ratio = 0.f
|
float damping_ratio = 0.f
|
||||||
)
|
)
|
||||||
: Param(body_a.get(), body_b.get(), local_anchor_a, local_anchor_b, frequency_hz, damping_ratio)
|
: Param(body_a.get(), body_b.get(), anchor_a, anchor_b, frequency_hz, damping_ratio)
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -297,6 +302,341 @@ namespace kiwano
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// 平移关节
|
||||||
|
class KGE_API PrismaticJoint
|
||||||
|
: public Joint
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
struct Param : public Joint::ParamBase
|
||||||
|
{
|
||||||
|
Point anchor;
|
||||||
|
Vec2 axis;
|
||||||
|
bool enable_limit;
|
||||||
|
float lower_translation;
|
||||||
|
float upper_translation;
|
||||||
|
bool enable_motor;
|
||||||
|
float max_motor_force;
|
||||||
|
float motor_speed;
|
||||||
|
|
||||||
|
Param(
|
||||||
|
Body* body_a,
|
||||||
|
Body* body_b,
|
||||||
|
Point const& anchor,
|
||||||
|
Vec2 const& axis,
|
||||||
|
bool enable_limit = false,
|
||||||
|
float lower_translation = 0.0f,
|
||||||
|
float upper_translation = 0.0f,
|
||||||
|
bool enable_motor = false,
|
||||||
|
float max_motor_force = 0.0f,
|
||||||
|
float motor_speed = 0.0f
|
||||||
|
)
|
||||||
|
: ParamBase(body_a, body_b)
|
||||||
|
, anchor(anchor)
|
||||||
|
, axis(axis)
|
||||||
|
, enable_limit(enable_limit)
|
||||||
|
, lower_translation(lower_translation)
|
||||||
|
, upper_translation(upper_translation)
|
||||||
|
, enable_motor(enable_motor)
|
||||||
|
, max_motor_force(max_motor_force)
|
||||||
|
, motor_speed(motor_speed)
|
||||||
|
{}
|
||||||
|
|
||||||
|
Param(
|
||||||
|
BodyPtr body_a,
|
||||||
|
BodyPtr body_b,
|
||||||
|
Point const& anchor,
|
||||||
|
Vec2 const& axis,
|
||||||
|
bool enable_limit = false,
|
||||||
|
float lower_translation = 0.0f,
|
||||||
|
float upper_translation = 0.0f,
|
||||||
|
bool enable_motor = false,
|
||||||
|
float max_motor_force = 0.0f,
|
||||||
|
float motor_speed = 0.0f
|
||||||
|
)
|
||||||
|
: Param(body_a.get(), body_b.get(), anchor, axis, enable_limit, lower_translation, upper_translation, enable_motor, max_motor_force, motor_speed)
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
|
||||||
|
PrismaticJoint();
|
||||||
|
PrismaticJoint(World* world, b2PrismaticJointDef* def);
|
||||||
|
|
||||||
|
static PrismaticJointPtr Create(World* world, Param const& param);
|
||||||
|
|
||||||
|
float GetReferenceAngle() const { KGE_ASSERT(raw_joint_); return math::Radian2Angle(raw_joint_->GetReferenceAngle()); }
|
||||||
|
float GetJointTranslation() const;
|
||||||
|
float GetJointSpeed() const;
|
||||||
|
|
||||||
|
bool IsLimitEnabled() const { KGE_ASSERT(raw_joint_); return raw_joint_->IsLimitEnabled(); }
|
||||||
|
void EnableLimit(bool flag) { KGE_ASSERT(raw_joint_); raw_joint_->EnableLimit(flag); }
|
||||||
|
|
||||||
|
float GetLowerLimit() const;
|
||||||
|
float GetUpperLimit() const;
|
||||||
|
void SetLimits(float lower, float upper);
|
||||||
|
|
||||||
|
bool IsMotorEnabled() const { KGE_ASSERT(raw_joint_); return raw_joint_->IsMotorEnabled(); }
|
||||||
|
void EnableMotor(bool flag) { KGE_ASSERT(raw_joint_); raw_joint_->EnableMotor(flag); }
|
||||||
|
|
||||||
|
// 设置马达转速 [degree/s]
|
||||||
|
void SetMotorSpeed(float speed) { KGE_ASSERT(raw_joint_); raw_joint_->SetMotorSpeed(math::Angle2Radian(speed)); }
|
||||||
|
float GetMotorSpeed() const { KGE_ASSERT(raw_joint_); return math::Radian2Angle(raw_joint_->GetMotorSpeed()); }
|
||||||
|
|
||||||
|
// 设定最大马达力 [N]
|
||||||
|
void SetMaxMotorForce(float force) { KGE_ASSERT(raw_joint_); raw_joint_->SetMaxMotorForce(force); }
|
||||||
|
float GetMaxMotorForce() const { KGE_ASSERT(raw_joint_); return raw_joint_->GetMaxMotorForce(); }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
b2PrismaticJoint* raw_joint_;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// 滑轮关节
|
||||||
|
class KGE_API PulleyJoint
|
||||||
|
: public Joint
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
struct Param : public Joint::ParamBase
|
||||||
|
{
|
||||||
|
Point anchor_a;
|
||||||
|
Point anchor_b;
|
||||||
|
Point ground_anchor_a;
|
||||||
|
Point ground_anchor_b;
|
||||||
|
float ratio;
|
||||||
|
|
||||||
|
Param(
|
||||||
|
Body* body_a,
|
||||||
|
Body* body_b,
|
||||||
|
Point const& anchor_a,
|
||||||
|
Point const& anchor_b,
|
||||||
|
Point const& ground_anchor_a,
|
||||||
|
Point const& ground_anchor_b,
|
||||||
|
float ratio = 1.0f
|
||||||
|
)
|
||||||
|
: ParamBase(body_a, body_b)
|
||||||
|
, anchor_a(anchor_a)
|
||||||
|
, anchor_b(anchor_b)
|
||||||
|
, ground_anchor_a(ground_anchor_a)
|
||||||
|
, ground_anchor_b(ground_anchor_b)
|
||||||
|
, ratio(ratio)
|
||||||
|
{}
|
||||||
|
|
||||||
|
Param(
|
||||||
|
BodyPtr body_a,
|
||||||
|
BodyPtr body_b,
|
||||||
|
Point const& anchor_a,
|
||||||
|
Point const& anchor_b,
|
||||||
|
Point const& ground_anchor_a,
|
||||||
|
Point const& ground_anchor_b,
|
||||||
|
float ratio = 1.0f
|
||||||
|
)
|
||||||
|
: Param(body_a.get(), body_b.get(), anchor_a, anchor_b, ground_anchor_a, ground_anchor_b, ratio)
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
|
||||||
|
PulleyJoint();
|
||||||
|
PulleyJoint(World* world, b2PulleyJointDef* def);
|
||||||
|
|
||||||
|
static PulleyJointPtr Create(World* world, Param const& param);
|
||||||
|
|
||||||
|
Point GetGroundAnchorA() const;
|
||||||
|
Point GetGroundAnchorB() const;
|
||||||
|
|
||||||
|
float GetRatio() const;
|
||||||
|
|
||||||
|
float GetLengthA() const;
|
||||||
|
float GetLengthB() const;
|
||||||
|
|
||||||
|
float GetCurrentLengthA() const;
|
||||||
|
float GetCurrentLengthB() const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
b2PulleyJoint* raw_joint_;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// 旋转关节
|
||||||
|
class KGE_API RevoluteJoint
|
||||||
|
: public Joint
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
struct Param : public Joint::ParamBase
|
||||||
|
{
|
||||||
|
Point anchor;
|
||||||
|
bool enable_limit;
|
||||||
|
float lower_angle;
|
||||||
|
float upper_angle;
|
||||||
|
bool enable_motor;
|
||||||
|
float max_motor_torque;
|
||||||
|
float motor_speed;
|
||||||
|
|
||||||
|
Param(
|
||||||
|
Body* body_a,
|
||||||
|
Body* body_b,
|
||||||
|
Point const& anchor,
|
||||||
|
bool enable_limit = false,
|
||||||
|
float lower_angle = 0.0f,
|
||||||
|
float upper_angle = 0.0f,
|
||||||
|
bool enable_motor = false,
|
||||||
|
float max_motor_torque = 0.0f,
|
||||||
|
float motor_speed = 0.0f
|
||||||
|
)
|
||||||
|
: ParamBase(body_a, body_b)
|
||||||
|
, anchor(anchor)
|
||||||
|
, enable_limit(enable_limit)
|
||||||
|
, lower_angle(lower_angle)
|
||||||
|
, upper_angle(upper_angle)
|
||||||
|
, enable_motor(enable_motor)
|
||||||
|
, max_motor_torque(max_motor_torque)
|
||||||
|
, motor_speed(motor_speed)
|
||||||
|
{}
|
||||||
|
|
||||||
|
Param(
|
||||||
|
BodyPtr body_a,
|
||||||
|
BodyPtr body_b,
|
||||||
|
Point const& anchor,
|
||||||
|
bool enable_limit = false,
|
||||||
|
float lower_angle = 0.0f,
|
||||||
|
float upper_angle = 0.0f,
|
||||||
|
bool enable_motor = false,
|
||||||
|
float max_motor_torque = 0.0f,
|
||||||
|
float motor_speed = 0.0f
|
||||||
|
)
|
||||||
|
: Param(body_a.get(), body_b.get(), anchor, enable_limit, lower_angle, upper_angle, enable_motor, max_motor_torque, motor_speed)
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
|
||||||
|
RevoluteJoint();
|
||||||
|
RevoluteJoint(World* world, b2RevoluteJointDef* def);
|
||||||
|
|
||||||
|
static RevoluteJointPtr Create(World* world, Param const& param);
|
||||||
|
|
||||||
|
float GetReferenceAngle() const { KGE_ASSERT(raw_joint_); return math::Radian2Angle(raw_joint_->GetReferenceAngle()); }
|
||||||
|
float GetJointAngle() const;
|
||||||
|
float GetJointSpeed() const;
|
||||||
|
|
||||||
|
bool IsLimitEnabled() const { KGE_ASSERT(raw_joint_); return raw_joint_->IsLimitEnabled(); }
|
||||||
|
void EnableLimit(bool flag) { KGE_ASSERT(raw_joint_); raw_joint_->EnableLimit(flag); }
|
||||||
|
|
||||||
|
float GetLowerLimit() const;
|
||||||
|
float GetUpperLimit() const;
|
||||||
|
void SetLimits(float lower, float upper);
|
||||||
|
|
||||||
|
bool IsMotorEnabled() const { KGE_ASSERT(raw_joint_); return raw_joint_->IsMotorEnabled(); }
|
||||||
|
void EnableMotor(bool flag) { KGE_ASSERT(raw_joint_); raw_joint_->EnableMotor(flag); }
|
||||||
|
|
||||||
|
// 设置马达转速 [degree/s]
|
||||||
|
void SetMotorSpeed(float speed) { KGE_ASSERT(raw_joint_); raw_joint_->SetMotorSpeed(math::Angle2Radian(speed)); }
|
||||||
|
float GetMotorSpeed() const { KGE_ASSERT(raw_joint_); return math::Radian2Angle(raw_joint_->GetMotorSpeed()); }
|
||||||
|
|
||||||
|
// 设定最大马达转矩 [N/m]
|
||||||
|
void SetMaxMotorTorque(float torque);
|
||||||
|
float GetMaxMotorTorque() const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
b2RevoluteJoint* raw_joint_;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// 绳关节
|
||||||
|
class KGE_API RopeJoint
|
||||||
|
: public Joint
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
struct Param : public Joint::ParamBase
|
||||||
|
{
|
||||||
|
Point local_anchor_a;
|
||||||
|
Point local_anchor_b;
|
||||||
|
float max_length;
|
||||||
|
|
||||||
|
Param(
|
||||||
|
Body* body_a,
|
||||||
|
Body* body_b,
|
||||||
|
Point const& local_anchor_a,
|
||||||
|
Point const& local_anchor_b,
|
||||||
|
float max_length = 0.f
|
||||||
|
)
|
||||||
|
: ParamBase(body_a, body_b)
|
||||||
|
, local_anchor_a(local_anchor_a)
|
||||||
|
, local_anchor_b(local_anchor_b)
|
||||||
|
, max_length(max_length)
|
||||||
|
{}
|
||||||
|
|
||||||
|
Param(
|
||||||
|
BodyPtr body_a,
|
||||||
|
BodyPtr body_b,
|
||||||
|
Point const& local_anchor_a,
|
||||||
|
Point const& local_anchor_b,
|
||||||
|
float max_length = 0.f
|
||||||
|
)
|
||||||
|
: Param(body_a.get(), body_b.get(), local_anchor_a, local_anchor_b, max_length)
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
|
||||||
|
RopeJoint();
|
||||||
|
RopeJoint(World* world, b2RopeJointDef* def);
|
||||||
|
|
||||||
|
static RopeJointPtr Create(World* world, Param const& param);
|
||||||
|
|
||||||
|
void SetMaxLength(float length);
|
||||||
|
float GetMaxLength() const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
b2RopeJoint* raw_joint_;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// 焊接关节
|
||||||
|
class KGE_API WeldJoint
|
||||||
|
: public Joint
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
struct Param : public Joint::ParamBase
|
||||||
|
{
|
||||||
|
Point anchor;
|
||||||
|
float frequency_hz;
|
||||||
|
float damping_ratio;
|
||||||
|
|
||||||
|
Param(
|
||||||
|
Body* body_a,
|
||||||
|
Body* body_b,
|
||||||
|
Point const& anchor,
|
||||||
|
float frequency_hz = 0.f,
|
||||||
|
float damping_ratio = 0.f
|
||||||
|
)
|
||||||
|
: ParamBase(body_a, body_b)
|
||||||
|
, anchor(anchor)
|
||||||
|
, frequency_hz(frequency_hz)
|
||||||
|
, damping_ratio(damping_ratio)
|
||||||
|
{}
|
||||||
|
|
||||||
|
Param(
|
||||||
|
BodyPtr body_a,
|
||||||
|
BodyPtr body_b,
|
||||||
|
Point const& anchor,
|
||||||
|
float frequency_hz = 0.f,
|
||||||
|
float damping_ratio = 0.f
|
||||||
|
)
|
||||||
|
: Param(body_a.get(), body_b.get(), anchor, frequency_hz, damping_ratio)
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
|
||||||
|
WeldJoint();
|
||||||
|
WeldJoint(World* world, b2WeldJointDef* def);
|
||||||
|
|
||||||
|
static WeldJointPtr Create(World* world, Param const& param);
|
||||||
|
|
||||||
|
// 设置弹簧阻尼器频率 [赫兹]
|
||||||
|
void SetFrequency(float hz) { KGE_ASSERT(raw_joint_); raw_joint_->SetFrequency(hz); }
|
||||||
|
float GetFrequency() const { KGE_ASSERT(raw_joint_); return raw_joint_->GetFrequency(); }
|
||||||
|
|
||||||
|
// 设置阻尼比
|
||||||
|
void SetDampingRatio(float ratio) { KGE_ASSERT(raw_joint_); raw_joint_->SetDampingRatio(ratio); }
|
||||||
|
float GetDampingRatio() const { KGE_ASSERT(raw_joint_); return raw_joint_->GetDampingRatio(); }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
b2WeldJoint* raw_joint_;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
// ÂֹؽÚ
|
// ÂֹؽÚ
|
||||||
class KGE_API WheelJoint
|
class KGE_API WheelJoint
|
||||||
: public Joint
|
: public Joint
|
||||||
|
|
@ -361,11 +701,11 @@ namespace kiwano
|
||||||
bool IsMotorEnabled() const { KGE_ASSERT(raw_joint_); return raw_joint_->IsMotorEnabled(); }
|
bool IsMotorEnabled() const { KGE_ASSERT(raw_joint_); return raw_joint_->IsMotorEnabled(); }
|
||||||
void EnableMotor(bool flag) { KGE_ASSERT(raw_joint_); raw_joint_->EnableMotor(flag); }
|
void EnableMotor(bool flag) { KGE_ASSERT(raw_joint_); raw_joint_->EnableMotor(flag); }
|
||||||
|
|
||||||
// 设置马达转速 [度/秒]
|
// 设置马达转速 [degree/s]
|
||||||
void SetMotorSpeed(float speed) { KGE_ASSERT(raw_joint_); raw_joint_->SetMotorSpeed(math::Angle2Radian(speed)); }
|
void SetMotorSpeed(float speed) { KGE_ASSERT(raw_joint_); raw_joint_->SetMotorSpeed(math::Angle2Radian(speed)); }
|
||||||
float GetMotorSpeed() const { KGE_ASSERT(raw_joint_); return math::Radian2Angle(raw_joint_->GetMotorSpeed()); }
|
float GetMotorSpeed() const { KGE_ASSERT(raw_joint_); return math::Radian2Angle(raw_joint_->GetMotorSpeed()); }
|
||||||
|
|
||||||
// 设定最大马达转矩
|
// 设定最大马达转矩 [N/m]
|
||||||
void SetMaxMotorTorque(float torque);
|
void SetMaxMotorTorque(float torque);
|
||||||
float GetMaxMotorTorque() const;
|
float GetMaxMotorTorque() const;
|
||||||
|
|
||||||
|
|
@ -425,11 +765,11 @@ namespace kiwano
|
||||||
|
|
||||||
static MouseJointPtr Create(World* world, Param const& param);
|
static MouseJointPtr Create(World* world, Param const& param);
|
||||||
|
|
||||||
// 设定最大摩擦力
|
// 设定最大摩擦力 [N]
|
||||||
void SetMaxForce(float force);
|
void SetMaxForce(float force);
|
||||||
float GetMaxForce() const;
|
float GetMaxForce() const;
|
||||||
|
|
||||||
// 设置响应速度 [赫兹]
|
// 设置响应速度 [hz]
|
||||||
void SetFrequency(float hz) { KGE_ASSERT(raw_joint_); raw_joint_->SetFrequency(hz); }
|
void SetFrequency(float hz) { KGE_ASSERT(raw_joint_); raw_joint_->SetFrequency(hz); }
|
||||||
float GetFrequency() const { KGE_ASSERT(raw_joint_); return raw_joint_->GetFrequency(); }
|
float GetFrequency() const { KGE_ASSERT(raw_joint_); return raw_joint_->GetFrequency(); }
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue