1. 程式人生 > >p2之關節

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:讀取馬達的當前速度 
旋轉關節常用於模擬小車運動。