Rigid Body
Body的創建。
對重要骨骼創建Body,保證Body控制的是表現和變化比較大的骨骼。
需要對Root創建Body並綁定,設置為Kinematic且不啟用物理。原因是UPrimitiveComponent::SyncComponentToRBPhysics會取RootBody的位置來同步Component的位置。
Body的設置。
主要影響Ragdoll的效果。
Mass:影響慣性大小。
LinearDamping:線性阻尼。控制Body的線性速度減緩強度。值越大,速度減小越快。
AngularDamping:角速度阻尼。控制Body的角速度減緩強度。值越大,速度減小越快。
(以上兩個數值,若啟用PhysicalAnimationProfile,一般不再設置這兩個數值,Profile的值也影響該效果)
Enable Gravity:是否啟用重力。關閉后不受重力影響,只受Body的慣性影響。
Physics Type:Default跟隨OwnerComponent。Kinematic為不受物理影響。Simulated為受物理影響。一般情況下設為Default,需要保證隨動畫運動的Body設為Kinematic。
需要開啟物理的Body建議設為Default而不是Simulated。原因是在編輯器調試時,關閉權重后DefaultBody可以正確顯示到無物理情況。如圖。
CollisionReponse:是否和外部物體碰撞。需要和外部物體碰撞時打開,如在人群中穿行和碰牆壁。
Body之間的Collision:
相鄰的Body之間CollisionOff,避免運動時碰撞出現怪異現象。
CollisionOff的Body顯示白色。CollisionOn的Body顯示黃色。如圖。
想使Body之間的碰撞效果生效需要設置Component的CollisionType。設為PhysicsBody,需要和自己(PhysicsBody)碰撞。注意不要和CapsuleComponent的類型Pawn碰撞。
如圖。
其余設置暫時使用默認,碰撞物理材質待研究。
Limit的設置。
原則上是根據人體骨骼活動范圍設置limit,並且所有動作都應在limit中運動。為了方便,可把所有limit設為free,通過Physical Animation Profile來約束,Profile無法滿足的,再去設置個別骨骼的limit,如Spine。
對於Root的約束。盆骨需要設為free。
Physical Animation Profile
功能:全局控制。負責穩定Body的位置,向動畫位置靠近。
原理:對每個Body(Dynamic),創建對應的KinematicBody進行輔助約束,兩個Body之間加上關節約束,每幀設置Kinematic位置為當前動畫位置,通過關節約束真實Body的運動。設置的值實際影響關節的Stiffness和Damping。
IsLocalSimulation:是否局部模擬。移動Kinematic時是全局還是相對父Body的。
全局的:取骨骼的位置。
局部的:取父Body對應的骨骼的相對Transform*父Body的物理位置。
一般使用全局的。局部的使用情況待研究。
相關代碼:ComputeTargetTM
Orientation Strength:角度的變化強度。值越大,越靠近動畫的角度。
Angular Velocity Strength: 角速度的變化強度。值越大,速度穩定(向動畫靠近)的越快。
Position Strength:位置的變化強度。值越大,越靠近動畫的位置。
Velocity Strength:線性速度的變化強度。值越大,速度穩定(向動畫靠近)的越快。
一般Orientation和Position一致。1000/100的值基本和動畫一致。100/10的值作用極弱。
MaxLinearForce/Angular Force:暫時不設置。
實際影響的是關節的Stiffness和Damping值。
相關代碼:
ConstraintInstance.SetAngularDriveParams(PhysAnimData.OrientationStrength * StrengthMultiplyer, PhysAnimData.AngularVelocityStrength * StrengthMultiplyer, PhysAnimData.MaxAngularForce * StrengthMultiplyer);
Constraint Profile
功能:局部控制。關節驅動身體靠近動畫,靠近動畫的姿勢,而不影響Body的屬性。如果靠PhysicalAnimationProfile驅動,會導致Body過於僵硬無法移動,ConstraintProfile解決了這一個問題,但運動時需要PhysicalAnimationProfile去穩定Body的位置(全局的)。
原理:設置Constraint的Motor,setDrive驅動關聯的兩個Body到達動畫的相對Rotation。
SkeletalMeshComponent需要設置Update Joints From Animation為true.
Angular Drive Mode需要設置為Twist and Swing,Motor才會生效。
相關代碼:
void USkeletalMeshComponent::UpdateRBJointMotors()
// If we found this bone, and a visible bone that is not the root, and its joint is motorised in some way..
if( (BoneIndex != INDEX_NONE) && (BoneIndex != 0) && (BoneVisibilityStates[BoneIndex] == BVS_Visible) && (CI->IsAngularOrientationDriveEnabled()) )
bool IsOrientationDriveEnabled() const
{
return TwistDrive.bEnablePositionDrive || SwingDrive.bEnablePositionDrive;
}
Target Orientation: 不必設置,Update Joints From Animation會取動畫來設置該Orientation。
Strength:向動畫靠近的強度。值越大越靠近,10000的值基本和動畫一致。
Target Velocity: 設為0即可。可理解為停下的快慢。 待做:添加Update Velocity From Animation,從動畫中取得目標速度。
Strength: 值越大,當前速度越靠近目標速度。若Target Velocity為0,值越大,則移動速度越慢(靠近0)。