UE4物理動畫使用


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)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM