Chipmunk 约束类型
优质
小牛编辑
128浏览
2023-12-01
销关节
cpPinJoint *cpPinJointAlloc(void)
cpPinJoint *cpPinJointInit(cpPinJoint *joint, cpBody *a, cpBody *b, cpVect anchr1, cpVect anchr2)
cpConstraint *cpPinJointNew(cpBody *a, cpBody *b, cpVect anchr1, cpVect anchr2)
a
和b
是被连接的两个刚体,anchr1
和anchr2
是这两个刚体的锚点。当关节被创建的时候距离便被确定,如果你想要设定一个特定的距离,使用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)
滑动关节
cpSlideJoint *cpSlideJointAlloc(void)
cpSlideJoint *cpSlideJointInit(
cpSlideJoint *joint, cpBody *a, cpBody *b,
cpVect anchr1, cpVect anchr2, cpFloat min, cpFloat max
)
cpConstraint *cpSlideJointNew(cpBody *a, cpBody *b, cpVect anchr1, cpVect anchr2, cpFloat min, cpFloat max)
a
和b
是被连接的两个刚体,anchr1
和anchr2
是这两个刚体的锚点, min
和max
定义了两个锚点间的最小最大距离。
属性
- 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)
枢轴关节
cpPivotJoint *cpPivotJointAlloc(void)
cpPivotJoint *cpPivotJointInit(cpPivotJoint *joint, cpBody *a, cpBody *b, cpVect pivot)
cpConstraint *cpPivotJointNew(cpBody *a, cpBody *b, cpVect pivot)
cpConstraint *cpPivotJointNew2(cpBody *a, cpBody *b, cpVect anchr1, cpVect anchr2)
a
和b
是关节连接的两个刚体,pivot
是世界坐标系下的枢轴点。因为枢轴点位置是在世界坐标系下,所以你必须确保两个刚体已经出于正确的位置上。另外你可以指定基于一对锚点的轴关节,但是要确保刚体处于正确的位置上因为一旦你空间开启了模拟,关节将会修正它自身。
属性
- cpVect cpPivotJointGetAnchr1(const cpConstraint *constraint)
- void cpPivotJointSetAnchr1(cpConstraint *constraint, cpVect value)
- cpVect cpPivotJointGetAnchr2(const cpConstraint *constraint)
- void cpPivotJointSetAnchr2(cpConstraint *constraint, cpVect value)
沟槽关节
cpGrooveJoint *cpGrooveJointAlloc(void)
cpGrooveJoint *cpGrooveJointInit(
cpGrooveJoint *joint, cpBody *a, cpBody *b,
cpVect groove_a, cpVect groove_b, cpVect anchr2
)
cpConstraint *cpGrooveJointNew(cpBody *a, cpBody *b, cpVect groove_a, cpVect groove_b, cpVect anchr2)
沟槽在刚体a
上从groov_a
到groov_b
,枢轴被附加在刚体b
的anchr2
锚点上。所有的坐标都是刚体局部坐标。
属性
- 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)
阻尼弹簧
cpDampedSpring *cpDampedSpringAlloc(void)
cpDampedSpring *cpDampedSpringInit(
cpDampedSpring *joint, cpBody *a, cpBody *b, cpVect anchr1, cpVect anchr2,
cpFloat restLength, cpFloat stiffness, cpFloat damping
)
cpConstraint *cpDampedSpringNew(
cpBody *a, cpBody *b, cpVect anchr1, cpVect anchr2,
cpFloat restLength, cpFloat stiffness, cpFloat damping
)
和滑动关节的定义很类似。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)
阻尼旋转弹簧
cpDampedRotarySpring *cpDampedRotarySpringAlloc(void)
cpDampedRotarySpring *cpDampedRotarySpringInit(
cpDampedRotarySpring *joint, cpBody *a, cpBody *b,
cpFloat restAngle, cpFloat stiffness, cpFloat damping
)
cpConstraint *cpDampedRotarySpringNew(cpBody *a, cpBody *b, cpFloat restAngle, cpFloat stiffness, cpFloat damping)
犹如阻尼弹簧,但却在角度层面起作用。restAngle
是刚体间想要的相对角度,stiffness
和dampling
和阻尼弹簧的基本一样。
属性
- 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)
旋转限位关节
cpRotaryLimitJoint *cpRotaryLimitJointAlloc(void)
cpRotaryLimitJoint *cpRotaryLimitJointInit(cpRotaryLimitJoint *joint, cpBody *a, cpBody *b, cpFloat min, cpFloat max)
cpConstraint *cpRotaryLimitJointNew(cpBody *a, cpBody *b, cpFloat min, cpFloat max)
旋转限位关节约束着两个刚体间的相对角度。min
和max
就是最小和最大的相对角度,单位为弧度。它被实现以便可能使范围大于一整圈。
属性
- cpFloat cpRotaryLimitJointGetMin(const cpConstraint *constraint)
- void cpRotaryLimitJointSetMin(cpConstraint *constraint, cpFloat value)
- cpFloat cpRotaryLimitJointGetMax(const cpConstraint *constraint)
- void cpRotaryLimitJointSetMax(cpConstraint *constraint, cpFloat value)
棘轮关节
cpRatchetJoint *cpRatchetJointAlloc(void);
cpRatchetJoint *cpRatchetJointInit(cpRatchetJoint *joint, cpBody *a, cpBody *b, cpFloat phase, cpFloat ratchet);
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)
齿轮关节
cpGearJoint *cpGearJointAlloc(void);
cpGearJoint *cpGearJointInit(cpGearJoint *joint, cpBody *a, cpBody *b, cpFloat phase, cpFloat ratio);
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)
简单马达
cpSimpleMotor *cpSimpleMotorAlloc(void);
cpSimpleMotor *cpSimpleMotorInit(cpSimpleMotor *joint, cpBody *a, cpBody *b, cpFloat rate);
cpConstraint *cpSimpleMotorNew(cpBody *a, cpBody *b, cpFloat rate);
简单马达保持着一对刚体恒定的角速度比。rate
是所需的相对角速度。通常你会给马达设定一个最大力(扭矩)否则他们会申请一个无限大的扭矩来使得刚体移动。
属性
- cpFloat cpSimpleMotorGetRate(const cpConstraint *constraint)
- void cpSimpleMotorSetRate(cpConstraint *constraint, cpFloat value)
札记
- 你可以为两个刚体添加多个关节,但要确保他们彼此不会冲突。否则会引起刚体抖动或者剧烈的旋转。