2012年4月1日 星期日

取得socket或bone的位置

UE提供socket功能方便開發者指定一個相對於bone的位置。例如像手上拿著武器的時候,就可以將武器模型附著在人物模型的某個socket上。

而撰寫特效程式時,時常會需要取得骨架上的某個位置。其實可以只用一個name欄位來指定socket或bone,只要骨架上socket和bone的名稱不重覆就不會有問題。

不過UE沒有提供方便的函式直接取得socket或bone的位置,需要自行撰寫一個:
function bool GetSocketOrBoneLocationAndRotation(SkeletalMeshComponent Mesh, name SoBName, out Vector Loc, out Rotator Rot)
{
    local SkeletalMeshSocket Socket;
    Socket = Mesh.GetSocketByName( SoBName );

    if( Socket == none )
    {
        BoneIndex = Mesh.MatchRefBone( SoBName );

        if( BoneIndex == INDEX_NONE )
        {
             return false;
        }
        else
        {
            TM = Mesh.GetBoneMatrix( BoneIndex );
            Pos = MatrixGetOrigin( TM );
            Rot = MatrixGetRotator( TM );
            return true;
        }
    }
    else
    {
        return Mesh.GetSocketWorldLocationAndRotation( SoBName, Loc, Rot );
    }
}

沒有留言:

張貼留言