p2之关节
Posted honghong87
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了p2之关节相关的知识,希望对你有一定的参考价值。
P2中使用Constraint及其子类表示关节,也就是将两个刚体按照指定的规则约束在一起,形成有规律的、相互限制的运动模拟。P2关节模拟中,两个刚体没有通过任何刚体连接,只是通过算法模拟出关节运动轨迹。为了更加直观,p2DebugDraw类中使用黑色的线段表示连接刚体的连杆,黑点圆的表示关节节点anchor。
P2中关节有5种,每一种都有独特的约束规则,包括距离关节DistanceConstraint、齿轮关节GearConstraint、锁定关节LockConstaint、位移关节PrismaticConstraint、旋转关节Revilute Constraint。
1)距离关节DistanceConstraint:
按照指定的距离distance将两个刚体约束在一起,其中任何一个刚体的位置发生变化,会牵着另一个刚体运动,以保证两者的间距为distance。但是两个刚体的角度不受约束,可以绕着节点旋转。DistanceConstraint构造函数为:
function DistanceConstraint(bodyA:Body, bodyB:Body, options:object)
其中,bodyA和bodyB为受约束的刚体,options为关节设置选项,可以缺省,P2以默认值设置,其中选项为:
·distance:两个刚体受到约束时保持的间距,默认为添加关节时两个刚体之间的间距
·localAnchorA:关节点相对于刚体bodyA本地坐标系统的坐标系,默认[0,0]
·localAnchorB:关节点相对于刚体bodyB本地坐标系统的坐标系,默认[0,0]
·maxForce:刚体运动中,如果距离不等于distance,为保持距离而对刚体施加的最大作用力,默认为Number.MAX_VALUE
除了上面的构造函数中的参数,距离关节还包含一些属性:
·lowerLimit:设置距离关节约束范围下限,即bodyA到bodyB的距离最小值,默认为0,该属性必须大于0。只有当lowerLimitEnabled为true时才起作用。
·lowerLimitEnabled:是否设置距离关节约束范围下限,默认false。
·upperLimit:设置距离关节约束范围上限,即bodyA到bodyB的距离最大值,默认为0,该属性必须大于0。只有当upperLimitEnabled为true时才起作用。
·upperLimitEnabled:是否设置距离关节约束范围上限,默认false
·position:bodyA和bodyB的当前间距
可以通过joint.collideConnected属性为true,避免平台和车轮之间的碰撞。创建完成后需要使用world的addConstraint(joint)方法将关节加入世界。
2)齿轮关节GearConstraint:
按照指定的比例ratio,将两个刚体的角度angleA和angleB约束为angle=angleB*ratio。其中任何一个刚体的角度变换,都会牵着另一个刚体的角度变化,以确保两个刚体角度的比例为ratio。刚体的坐标位置不受约束,可以自由向任意方向移动。构造函数为:
function GearConstraint(bodyA:body, bodyB:Body, options:Object)
其中,bodyA和bodyB为受关节约束的两个刚体,options为关节设置选项,可以缺省,P2会按默认值进行设置。选项为:
·angle:两个刚体的相对角度差,齿轮关节会将一个刚体的角度减去该角度差后,再保证角度变化量的比例为ratio
·ratio:两个刚体的角度变化量的比例,当ratio=2时,bodyB旋转180°,bodyA只转90°
·maxForce:当两个刚体的角度比例不是ratio时,为将其约束为ratio而对刚体施加的最大扭力
齿轮关节还有两种方法:
·setMaxForce(force):当bodyB的角度偏离angle,齿轮关节对bodyB施加的最大扭力
·getMaxForce():number:获取setMaxForce()中设置的最大作用力
3)锁定关节LockConstraint:
将两个刚体绑定在一起,使其相对坐标位置、角度差保存不变,仿佛被钉在一起。此关节中的任何刚体坐标或角度发生变化,都会牵着另一个刚体的坐标和角度变化,以确保两个刚体相对坐标和角度分别为localOffsetB和localAngleB。构造函数:
function LockConstraint(bodyA:Body, bodyB:body, options:Object)
其中,bodyA和bodyB为受关节约束的两个刚体,options为关节设置选项,可以缺省,P2会按默认值进行设置。选项为:
·localOffsetB:刚体bodyB在关节约束下,相对于bodyA本地坐标系的偏移量,默认为添加关节时两个刚体的相对位置
·localAngleB:刚体bodyB在关节约束下,相对于bodyA本地坐标系统的角度,默认时为添加关节时两个刚体的相对角度
·maxForce:当两个刚体未达到关节约束的localOffsetB和localAngleB,为使其达到约束指定状态,而可以施加的最大作用力,默认Number.MAX_VALUE
LockConstraint还包含几个方法:
·setMaxForce(force):当bodyB的位置偏离localOffsetB,或角度差不等于localAngleB时,锁定关节对bodyB施加的最大作用力。
·getMaxForce():number:获取setMaxForce()中设置的最大作用力
4)位移关节PrismaticConstraint:
将刚体bodyB的运动方向,限定为在刚体bodyA本地坐标系统中的一个指定向量。构造函数为:
function PrismaticContraint(bodyA:Body, bodyB:Body, options:Object)
其中,bodyA和bodyB为受约束的刚体,options为关节设置选项,可以缺省,P2以默认值设置,其中选项为:
·maxForce:当bodyB相对于bodyA的位置偏离localAxisA时,为使其恢复到约束位置,可以施加的最大作用力,默认为Number.MAX_VALUE
·localAnchorA:控制点anchorA在bodyA本地坐标系下的坐标,默认[0,0]
·localAnchorB:控制点anchorB在bodyB本地坐标系下的坐标,默认[1,0]
·localAxisA:刚体受到约束时只可以在该坐标轴方向上移动,这是刚体bodyA坐标系下的一个向量,默认[1,0]
·disableRotationalLock:是否禁止bodyB绕节点旋转,默认false,即bodyB不能自由旋转,此值只有在构造函数中设置才起作用。
·upperLimitEnabled:是否开启bodyB移动方向上限,默认false,此时可以沿localAxisA正方向无限移动
·upperLimit:设置bodyB沿localAxisA正方向可以移动的最大距离,默认为1
·lowerLimitEnabled:是否开启bodyB移动方向下限,默认false,此时可以沿localAxisA负方向无限移动
·lowerLimit:设置bodyB沿localAxisA负方向可以移动的最大距离,默认为0,该属性值要小于upperLimit
除了上述在构造函数中的参数,PrismaticConstraint还有其他一些属性:
·motorEnabled:是否开启马达属性,与motorSpeed配合使用。开启后,关节会对bodyB施加作用力,使其线速度达到motorSpeed,并在约束范围内一直保持该速度。开启或关闭马达属性,要用enableMotor()和disableMotor()方法。
·motorSpeed:开启马达属性后,bodyB的目标速度值
·position:在localAxisA上,bodyB相对于bodyA的当前位置
PrismaticConstraint还有一些方法,用于调整关节的相关属性:
·setLimits(lower, upper):设置位移关节的上下限,其中lower一定要小于upper
·disableMotor():关闭马达属性
·enableMotor():开启马达属性
可以创建一个空刚体来固定关节。所谓空刚体,就是没有包含任何形状对象的刚体,所以不会与任何刚体发生碰撞模拟。
5)旋转关节RevoluteConstraint:
限制两个刚体只能绕指定的控制点旋转,该控制点是刚体bodyA本地坐标系下的坐标。其中一个刚体的位置或角度发生变化时,为了确保控制点和刚体的相对位置不变,另一个刚体也会被牵制发生位置和角度的变化。构造函数为:
function RevoluteConstraint(bodyA:Body, bodyB:Body, options:Object)
其中,bodyA和bodyB为受关节约束的两个刚体,options为关节设置选项,可以缺省,P2会按默认值进行设置。选项为:
·worldPivot:全局坐标系下的关节节点,bodyA和bodyB均受约束,只能绕该节点旋转。设置该节点后,旋转关节会自动计算localPivotA和localPivotB本地节点。
·localPivotA:节点worldPivot在bodyA刚体本地坐标系统下的坐标,默认[0,0]
·localPivotB:节点worldPivot在bodyB刚体本地坐标系统下的坐标,默认[0,0]
·maxForce:当刚体坐标偏离节点时,为使其恢复到节点位置,可以施加的最大作用力,默认为Number.MAX_VALUE
RevoluteConstraint还包含几个方法:
·setLimits(lower:number, upper:number):设置bodyB绕节点旋转角度的上下限,值为弧度
·enableMotor():开启马达属性,与setMotorSpeed()配合使用,关节会对bodyB施加扭力,使其达到setMotorSpeed()
·disableMotor():关闭马达属性
·setMotorSpeed(speed):设置bodyB的目标角速度,只有开启马达属性后才其作用。
·getMotorSpeed():number:读取马达的当前速度
旋转关节常用于模拟小车运动。
以上是关于p2之关节的主要内容,如果未能解决你的问题,请参考以下文章