zoukankan      html  css  js  c++  java
  • 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)。

  • 相关阅读:
    转载:从git仓库中删除不必要的文件
    问题:Swiper父容器隐藏时实例化组件,组件滑动失效
    图片预加载
    移动端苹果手机:图片没有加载完成前,白色边框线是怎么来的
    bower 安装依赖提示 EINVRES Request to https://bower.herokuapp.com/packages/xxx failed with 502
    H5序列帧播放
    盟军敢死队
    二维游戏开发的点滴
    用c语言开发游戏 快乐的痛 笑着哭
    ibatis
  • 原文地址:https://www.cnblogs.com/corgi/p/6679306.html
Copyright © 2011-2022 走看看