avatar

Физика отдельных костей скелета (UDK)

опубликовал в UDK / Программирование
Добрый день, хочу вам рассказать о применении ragdoll, для натурального поведения объекта который может ползать по вертикальным и отвесным поверхностям. В основе алгоритма лежала идея включения ragdoll у избранных костей скелета при получении урона изложенная вот тут PhysicalAnimation.

Опишу, что нужно было сделать: необходимо было заблендить анимацию с физикой(при чем анимация должна была доминировать внешнем виде) при нахождении Pawn на стенке. Для начала был задано некоторое количество костей, которым в дальнейшем будут следовать анимации. В скелете по умолчанию все кости стояли зафиксироваными(fixed).


         var array<name> BonesToActivate;
         var bool  PhysicOnWall;
         var float WallPhys;
         var float BlendTime;
defaultproperties
{
         BonesToActivate(0) = L_M_leg_Jnt3_R
         BonesToActivate(1) = L_M_leg_Jnt3_L
         BonesToActivate(2) = L_rear_leg_Jnt3_R
         BonesToActivate(3) =L_rear_leg_Jnt3_L
}

Так же тут присутствуют две переменные(BlendTime) регулирующие время Включения/Выключения Физики, переменная(WallPhys) указывающая степень влияния физики на тело, и переменная(PhysicOnWall) препятствующая повторному обращению к скелету.

После чего в функции Tick была сделана проверка на угол поверхности к которой прилип Pawn.


simulated function Tick (float delta)
{
     
        if((vect(0,0,1) dot Floor) <0.5){
                  TurnOnPhysic(delta);
        }else{
                  TurnOffPhysic(delta);
        }

}


Затем были реализованы две функции включающие и выключающие физику.


simulated function TurnOnPhysic(float delta){
        if(!PhysicOnWall){
                PhysicOnWall= true;
                Mesh.ForceSkelUpdate();
                if(BonesToActivate.length!=0){
                           Mesh.PhysicsAssetInstance.SetNamedBodiesFixed(true,  BonesToActivate, Mesh,true, true);
                }else{
                           Mesh.PhysicsAssetInstance.SetAllBodiesFixed(false);
                }

                 Mesh.WakeRigidBody();
        }
        if(Mesh.PhysicsWeight<WallPhys){
                Mesh.PhysicsWeight +=  Delta/BlendTime;
        }

}
simulated function TurnOffPhysic(float delta){
        if(PhysicOnWall){
                PhysicOnWall= false;
                Mesh.ForceSkelUpdate();
                if(TailBodyNames.length!=0){
                         Mesh.PhysicsAssetInstance.SetNamedBodiesFixed(false, TailBodyNames, Mesh,true, true);
                }else{
                         Mesh.PhysicsAssetInstance.SetAllBodiesFixed(true);
                }
                Mesh.PutRigidBodyToSleep();
        }
        if(Mesh.PhysicsWeight>DefaultPhysWeight){
                Mesh.PhysicsWeight  -=  Delta/BlendTime;
        }
}



После этого получился вот такой результат:

3 комментария

avatar
вопрос:
увас HUD через канвас или flash?
avatar
Тут его нет вообще, а в принципе Flash через ScaleForm.
avatar
а как через scale Form напиши тутор ПЛЗ)) ну просто я ставлю, а картинку менять не умею) а скрипты то есть)) я написал а самого скейл форма нету((
Чтобы оставить комментарий необходимо .