约束类型

销关节

  1. cpPinJoint *cpPinJointAlloc(void)
  2. cpPinJoint *cpPinJointInit(cpPinJoint *joint, cpBody *a, cpBody *b, cpVect anchr1, cpVect anchr2)
  3. cpConstraint *cpPinJointNew(cpBody *a, cpBody *b, cpVect anchr1, cpVect anchr2)

ab是被连接的两个刚体,anchr1anchr2是这两个刚体的锚点。当关节被创建的时候距离便被确定,如果你想要设定一个特定的距离,使用setter函数来重写它。

属性

  • cpVect cpPinJointGetAnchr1(const cpConstraint *constraint)
  • void cpPinJointSetAnchr1(cpConstraint *constraint, cpVect value)
  • cpVect cpPinJointGetAnchr2(const cpConstraint *constraint)
  • void cpPinJointSetAnchr2(cpConstraint *constraint, cpVect value)
  • cpFloat cpPinJointGetDist(const cpConstraint *constraint)
  • void cpPinJointSetDist(cpConstraint *constraint, cpFloat value)

滑动关节

  1. cpSlideJoint *cpSlideJointAlloc(void)
  2. cpSlideJoint *cpSlideJointInit(
  3. cpSlideJoint *joint, cpBody *a, cpBody *b,
  4. cpVect anchr1, cpVect anchr2, cpFloat min, cpFloat max
  5. )
  6. cpConstraint *cpSlideJointNew(cpBody *a, cpBody *b, cpVect anchr1, cpVect anchr2, cpFloat min, cpFloat max)

ab是被连接的两个刚体,anchr1anchr2是这两个刚体的锚点, minmax定义了两个锚点间的最小最大距离。

属性

  • cpVect cpSlideJointGetAnchr1(const cpConstraint *constraint)
  • void cpSlideJointSetAnchr1(cpConstraint *constraint, cpVect value)
  • cpVect cpSlideJointGetAnchr2(const cpConstraint *constraint)
  • void cpSlideJointSetAnchr2(cpConstraint *constraint, cpVect value)
  • cpFloat cpSlideJointGetMin(const cpConstraint *constraint)
  • void cpSlideJointSetMin(cpConstraint *constraint, cpFloat value)
  • cpFloat cpSlideJointGetMax(const cpConstraint *constraint)
  • void cpSlideJointSetMax(cpConstraint *constraint, cpFloat value)

枢轴关节

  1. cpPivotJoint *cpPivotJointAlloc(void)
  2. cpPivotJoint *cpPivotJointInit(cpPivotJoint *joint, cpBody *a, cpBody *b, cpVect pivot)
  3. cpConstraint *cpPivotJointNew(cpBody *a, cpBody *b, cpVect pivot)
  4. cpConstraint *cpPivotJointNew2(cpBody *a, cpBody *b, cpVect anchr1, cpVect anchr2)

ab是关节连接的两个刚体,pivot是世界坐标系下的枢轴点。因为枢轴点位置是在世界坐标系下,所以你必须确保两个刚体已经出于正确的位置上。另外你可以指定基于一对锚点的轴关节,但是要确保刚体处于正确的位置上因为一旦你空间开启了模拟,关节将会修正它自身。

属性

  • cpVect cpPivotJointGetAnchr1(const cpConstraint *constraint)
  • void cpPivotJointSetAnchr1(cpConstraint *constraint, cpVect value)
  • cpVect cpPivotJointGetAnchr2(const cpConstraint *constraint)
  • void cpPivotJointSetAnchr2(cpConstraint *constraint, cpVect value)

沟槽关节

  1. cpGrooveJoint *cpGrooveJointAlloc(void)
  2. cpGrooveJoint *cpGrooveJointInit(
  3. cpGrooveJoint *joint, cpBody *a, cpBody *b,
  4. cpVect groove_a, cpVect groove_b, cpVect anchr2
  5. )
  6. cpConstraint *cpGrooveJointNew(cpBody *a, cpBody *b, cpVect groove_a, cpVect groove_b, cpVect anchr2)

沟槽在刚体a上从groov_agroov_b,枢轴被附加在刚体banchr2锚点上。所有的坐标都是刚体局部坐标。

属性

  • cpVect cpGrooveJointGetGrooveA(const cpConstraint *constraint)
  • void cpGrooveJointSetGrooveA(cpConstraint *constraint, cpVect value)
  • cpVect cpGrooveJointGetGrooveB(const cpConstraint *constraint)
  • void cpGrooveJointSetGrooveB(cpConstraint *constraint, cpVect value)
  • cpVect cpGrooveJointGetAnchr2(const cpConstraint *constraint)
  • void cpGrooveJointSetAnchr2(cpConstraint *constraint, cpVect value)

阻尼弹簧

  1. cpDampedSpring *cpDampedSpringAlloc(void)
  2. cpDampedSpring *cpDampedSpringInit(
  3. cpDampedSpring *joint, cpBody *a, cpBody *b, cpVect anchr1, cpVect anchr2,
  4. cpFloat restLength, cpFloat stiffness, cpFloat damping
  5. )
  6. cpConstraint *cpDampedSpringNew(
  7. cpBody *a, cpBody *b, cpVect anchr1, cpVect anchr2,
  8. cpFloat restLength, cpFloat stiffness, cpFloat damping
  9. )

和滑动关节的定义很类似。restLength是弹簧想要的长度,stiffness是弹簧系数(Young’s modulus),dampling用来描述弹簧阻尼的柔软度。

属性

  • cpVect cpDampedSpringGetAnchr1(const cpConstraint *constraint)
  • void cpDampedSpringSetAnchr1(cpConstraint *constraint, cpVect value)
  • cpVect cpDampedSpringGetAnchr2(const cpConstraint *constraint)
  • void cpDampedSpringSetAnchr2(cpConstraint *constraint, cpVect value)
  • cpFloat cpDampedSpringGetRestLength(const cpConstraint *constraint)
  • void cpDampedSpringSetRestLength(cpConstraint *constraint, cpFloat value)
  • cpFloat cpDampedSpringGetStiffness(const cpConstraint *constraint)
  • void cpDampedSpringSetStiffness(cpConstraint *constraint, cpFloat value)
  • cpFloat cpDampedSpringGetDamping(const cpConstraint *constraint)
  • void cpDampedSpringSetDamping(cpConstraint *constraint, cpFloat value)

阻尼旋转弹簧

  1. cpDampedRotarySpring *cpDampedRotarySpringAlloc(void)
  2. cpDampedRotarySpring *cpDampedRotarySpringInit(
  3. cpDampedRotarySpring *joint, cpBody *a, cpBody *b,
  4. cpFloat restAngle, cpFloat stiffness, cpFloat damping
  5. )
  6. cpConstraint *cpDampedRotarySpringNew(cpBody *a, cpBody *b, cpFloat restAngle, cpFloat stiffness, cpFloat damping)

犹如阻尼弹簧,但却在角度层面起作用。restAngle是刚体间想要的相对角度,stiffnessdampling和阻尼弹簧的基本一样。

属性

  • cpFloat cpDampedRotarySpringGetRestAngle(const cpConstraint *constraint)
  • void cpDampedRotarySpringSetRestAngle(cpConstraint *constraint, cpFloat value)
  • cpFloat cpDampedRotarySpringGetStiffness(const cpConstraint *constraint)
  • void cpDampedRotarySpringSetStiffness(cpConstraint *constraint, cpFloat value)
  • cpFloat cpDampedRotarySpringGetDamping(const cpConstraint *constraint)
  • void cpDampedRotarySpringSetDamping(cpConstraint *constraint, cpFloat value)

旋转限位关节

  1. cpRotaryLimitJoint *cpRotaryLimitJointAlloc(void)
  2. cpRotaryLimitJoint *cpRotaryLimitJointInit(cpRotaryLimitJoint *joint, cpBody *a, cpBody *b, cpFloat min, cpFloat max)
  3. cpConstraint *cpRotaryLimitJointNew(cpBody *a, cpBody *b, cpFloat min, cpFloat max)

旋转限位关节约束着两个刚体间的相对角度。minmax就是最小和最大的相对角度,单位为弧度。它被实现以便可能使范围大于一整圈。

属性

  • cpFloat cpRotaryLimitJointGetMin(const cpConstraint *constraint)
  • void cpRotaryLimitJointSetMin(cpConstraint *constraint, cpFloat value)
  • cpFloat cpRotaryLimitJointGetMax(const cpConstraint *constraint)
  • void cpRotaryLimitJointSetMax(cpConstraint *constraint, cpFloat value)

棘轮关节

  1. cpRatchetJoint *cpRatchetJointAlloc(void);
  2. cpRatchetJoint *cpRatchetJointInit(cpRatchetJoint *joint, cpBody *a, cpBody *b, cpFloat phase, cpFloat ratchet);
  3. cpConstraint *cpRatchetJointNew(cpBody *a, cpBody *b, cpFloat phase, cpFloat ratchet);

工作起来像套筒扳手。ratchet是”clicks”间的距离,phase是当决定棘轮角度的时候的初始位移。

属性

  • cpFloat cpRatchetJointGetAngle(const cpConstraint *constraint)
  • void cpRatchetJointSetAngle(cpConstraint *constraint, cpFloat value)
  • cpFloat cpRatchetJointGetPhase(const cpConstraint *constraint)
  • void cpRatchetJointSetPhase(cpConstraint *constraint, cpFloat value)
  • cpFloat cpRatchetJointGetRatchet(const cpConstraint *constraint)
  • void cpRatchetJointSetRatchet(cpConstraint *constraint, cpFloat value)

齿轮关节

  1. cpGearJoint *cpGearJointAlloc(void);
  2. cpGearJoint *cpGearJointInit(cpGearJoint *joint, cpBody *a, cpBody *b, cpFloat phase, cpFloat ratio);
  3. cpConstraint *cpGearJointNew(cpBody *a, cpBody *b, cpFloat phase, cpFloat ratio);

齿轮关节保持着一对刚体恒定的角速度比。ratio总是测量绝对值,目前无法设定相对于第三个刚体的角速度。phase是两个刚体的初始角度偏移量。

属性

  • cpFloat cpGearJointGetPhase(const cpConstraint *constraint)
  • void cpGearJointSetPhase(cpConstraint *constraint, cpFloat value)
  • cpFloat cpGearJointGetRatio(const cpConstraint *constraint)
  • void cpGearJointSetRatio(cpConstraint *constraint, cpFloat value)

简单马达

  1. cpSimpleMotor *cpSimpleMotorAlloc(void);
  2. cpSimpleMotor *cpSimpleMotorInit(cpSimpleMotor *joint, cpBody *a, cpBody *b, cpFloat rate);
  3. cpConstraint *cpSimpleMotorNew(cpBody *a, cpBody *b, cpFloat rate);

简单马达保持着一对刚体恒定的角速度比。rate是所需的相对角速度。通常你会给马达设定一个最大力(扭矩)否则他们会申请一个无限大的扭矩来使得刚体移动。

属性

  • cpFloat cpSimpleMotorGetRate(const cpConstraint *constraint)
  • void cpSimpleMotorSetRate(cpConstraint *constraint, cpFloat value)

札记

  • 你可以为两个刚体添加多个关节,但要确保他们彼此不会冲突。否则会引起刚体抖动或者剧烈的旋转。