예제 #1
0
//-----------------------------------------------------------------------
void SkeletonHelper::ToGlobalPose(Skeleton const& skeleton,
    SkeletonPose const& skeletonPose, std::vector<Matrix3x2> & globalPose)
{
    POMDOG_ASSERT(skeleton.JointCount() > 1);
    POMDOG_ASSERT(skeleton.Root().Index);

    SkeletonHelper::Traverse(skeleton, skeleton.Root().Index, [&](Joint const& bone)
    {
        POMDOG_ASSERT(*bone.Index < skeletonPose.JointPoses.size());
        auto & pose = skeletonPose.JointPoses[*bone.Index];

        Matrix3x2 matrix = Matrix3x2::CreateScale(pose.Scale);
        matrix *= Matrix3x2::CreateRotation(pose.Rotation);
        matrix *= Matrix3x2::CreateTranslation(pose.Translate);

        if (bone.Parent)
        {
            POMDOG_ASSERT(*bone.Parent < globalPose.size());
            matrix *= globalPose[*bone.Parent];
        }

        POMDOG_ASSERT(*bone.Index < globalPose.size());
        globalPose[*bone.Index] = std::move(matrix);
    });
}
예제 #2
0
//-----------------------------------------------------------------------
std::vector<Matrix3x2> SkeletonHelper::ToGlobalPose(Skeleton const& skeleton,
    SkeletonPose const& skeletonPose)
{
    std::vector<Matrix3x2> globalPose(skeleton.JointCount());
    SkeletonHelper::ToGlobalPose(skeleton, skeletonPose, globalPose);
    return std::move(globalPose);
}
예제 #3
0
//-----------------------------------------------------------------------
void SkeletonHelper::Traverse(Skeleton const& skeleton,
    std::function<void(Joint const&)> const& traverser)
{
    POMDOG_ASSERT(skeleton.JointCount() > 0);
    POMDOG_ASSERT(skeleton.Root().Index);
    Traverse(skeleton, skeleton.Root().Index, traverser);
}