
Физика отдельных костей скелета (UDK)
Опишу, что нужно было сделать: необходимо было заблендить анимацию с физикой(при чем анимация должна была доминировать внешнем виде) при нахождении 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 комментария
увас HUD через канвас или flash?