chipmunk约束
约束是用来描述两个刚体如何相互作用的。简单来说就是关节。
Pin Joints
将2个刚体用固定的杠杆连接,两个刚体相对位置固定,可绕各自连接点自由旋转。
var pinJoint = new cp.PinJoint(body1, body2, anchor1, anchor1);
space.addConstraint(pinJoint);
anchor1:杠杆连接位置,相对于body1重心的相对坐标
anchor2:杠杆连接位置,相对于body2重心的相对坐标
Slide Joints
将2个刚体用可伸缩的杠杆连接,两个刚体相对位置固定,可绕各自连接点自由旋转。
var slideJoint = new cp.SlideJoint(body1, body2, anchor1, anchor1, min, max);
space.addConstraint(slideJoint);
min:杠杆最小伸缩长度
max:杠杆最大伸缩长度
Pivot Joints
将2个刚体用长度为0的杠杆连接,两个刚体相对位置固定,可绕各自连接点自由旋转。
可用于鼠标拖动刚体
// 创建方式1
var pivotJoint = new cp.PivotJoint(body1, body2, anchor);
space.addConstraint(pivotJoint);
// 创建方式2
var pivotJoint = new cp.PivotJoint(body1, body2, anchor1,anchor2);
space.addConstraint(pivotJoint);
anchor: 杠杆位置(世界坐标)
anchor1: 杠杆连接位置,相对于body1重心的相对坐标
anchor2: 杠杆连接位置,相对于body2重心的相对坐标
Groove Joints
在刚体1上焊接一根固定杠杆,刚体2与杠杆连接,可在杠杆上移动旋转,可绕连接点自由旋转
var grooveJoint = new cp.GrooveJoint(body1, body2, groove_a, groove_a, anchor2);
space.addConstraint(grooveJoint);
groove_a:杠杆起点相对于body1重心的相对坐标
groove_b:杠杆终点相对于body1重心的相对坐标
anchor2: 杠杆连接位置,相对于body2重心的相对坐标
Damped Springs
将2个刚体用弹簧连接,可绕各自连接点自由旋转
var dampedSpring = new cp.DampedSpring(body1, body2, anchor1, anchor2, restLength, stiffness, damping);
space.addConstraint(dampedSpring);
restLength:弹簧不受力时的长度
stiffness: 弹簧系数(刚度)
damping: 弹簧阻尼的柔软度(一般0-1)
上面参数的效果我也不太懂,具体的自己试
Damped Rotary Springs
类似Damped Springs,只是它的约束是弧度,而不是距离
var dampedRotarySpring = new cp.DampedRotarySpring(body1, body2, restAngle, stiffness, damping);
space.addConstraint(dampedRotarySpring);
restLength:弹簧不受力时的角度差
上面参数的效果我也不太懂,具体的自己试
Rotary Limit Joint
约束刚体1与刚体2的角度差在一定范围内
var rotaryLimitJoint = new cp.RotaryLimitJoint(body1, body2, minAngle, maxAngle);
space.addConstraint(rotaryLimitJoint);
minAngle:body1与body2的最小弧度差
maxAngle:body1与body2的最大弧度差
Ratchet Joint
棘轮关节,具体效果不好描述。
刚体1顺时针转动不影响刚体2,逆时针转动则刚体2同时逆时针转动同等角度
刚体2逆时针转动不影响刚体2,顺时针转动则刚体1同时顺时针转动同等角度
var ratchetJoint = new cp.RatchetJoint(body1, body2, phase, ratchet);
space.addConstraint(ratchetJoint);
ratchet:“clicks”间的距离
phase: 决定棘轮角度的时候的初始位移
这个参数的效果我也不太懂,具体的自己试
Gear Joint
齿轮关节,保持着2个刚体恒定的角速度比
var gearJoint = new cp.GearJoint(body1, body2, phase, ratio);
space.addConstraint(gearJoint);
phase:初始弧度差
ratio:body1与body2的角速度比(可负,即反向)
Simple Motor
简单马达,保持着2个刚体恒定的角速度比
var simpleMotor = new cp.SimpleMotor(body1, body2, rate);
space.addConstraint(simpleMotor);
rate:恒定的角速度
关节使用注意事项
- 关节可连接动态刚体与静态刚体
- 两个刚体可以添加多个关节,但要确保他们彼此不会冲突。否则会引起刚体抖动或者剧烈的旋转
- 刚体销毁前要先销毁其相连的关节