FABRIK调节手臂位置

写在前面

在这篇我将简单介绍下FABRIK的使用, 这是一种逆向运动学(IK)的其中一个算法,主要用来比较自然地调节人物骨骼的移动,可以解决我们人物的左手在枪械上的摆放问题。

FABRIK

所谓IK,是一种和FK相对应的机器人运动算法。比如说用手去抓苹果这一动作,使用FK,可以先旋转你的手臂到一个位置,接着再旋转你的小臂,最后再旋转你的手腕,这样到了最后,你的手就抓到了苹果,是一种自顶向下的过程

从IK的思路走,那就将苹果设置为目标点,你的手掌作为Tip Bone直接去拿苹果,在这个过程中,你的手腕到手臂被带动着一起运动,是一种自底向上的过程。

在这个过程中,我们需要定义两个量,一个为Target(UE 中为Effector Target * Effector Transform, 上图中为t),就是你的p4的目标位置;其次定义你的Effector(在UE中为Tip Bone,上图为p4)还有最上层节点(UE中Rootbone)。

在我们实际的应用中,我们会在我们枪支骨骼上绑定一个LeftHandSocket, 然后计算出这个Socket相对于我们右手骨骼的Bone Space坐标,最后使用FABRIK节点对我们的左手骨骼做变换到相应的Socket位置。

设定LeftHandSocket,得到相应的Target

c++ 复制代码
// BlasterAnimation.h
UPROPERTY(BlueprintReadOnly, Category = Character, meta = (AllowPrivateAccess = "true"))
FTransform LeftHandTransfromation;


// BlasterAnimation.cpp
if (BlasterCharacter->GetEquipWeaponComponent() && BlasterCharacter->GetEquipWeaponComponent()->GetEquippedWeapon())
{
       auto EquippedWeapon = BlasterCharacter->GetEquipWeaponComponent()->GetEquippedWeapon();

       // 得到我们左手需要摆放位置的世界坐标 (World Space)
       LeftHandTransfromation = EquippedWeapon->GetMesh()->GetSocketTransform("LeftHandSocket");

       // 将这个World Space的坐标转化为相对于角色右手骨骼的 骨骼坐标 相当于同一个点 但是我从以右手骨骼为原点的坐标系去看
       FVector outPosition;
       FRotator outRotation;
       BlasterCharacter->GetMesh()->TransformToBoneSpace("J_Bip_R_Hand", LeftHandTransfromation.GetLocation(), FRotator::ZeroRotator, outPosition, outRotation);

       // 设置一下Bone Space坐标
       LeftHandTransfromation.SetLocation(outPosition);
       LeftHandTransfromation.SetRotation(FQuat(outRotation));
}

在蓝图中使用LeftHandTransformation

如图所示,我们是在已经应用了Aimoffset的动作基础上加的。

点击Play按钮,我们可以边看着PIE边进行LeftHandSocket在枪体位置上的调试

你会发现,现在无论你怎么晃动枪体,你的左手和右手都会紧紧地贴在枪体上了。

End

相关推荐
阿懂在掘金14 分钟前
早点下班(Vue2.7版):旧项目也能少写 40%+ 异步代码
前端·vue.js·开源
Mintopia15 分钟前
Web性能测试流程全解析:从概念到落地的完整指南
前端·性能优化·测试
fetasty36 分钟前
Godot游戏练习01-第7节-添加敌人
游戏开发
Qinana37 分钟前
第一次用向量数据库!手搓《天龙八部》RAG助手,让AI真正“懂”你
前端·数据库·后端
忆江南37 分钟前
# Flutter Engine、Dart VM、Runner、iOS 进程与线程 —— 深度解析
前端
龙国浪子42 分钟前
从「选中一段」到「整章润色」:编辑器里的 AI 润色是怎么做出来的
前端·人工智能
小码哥_常1 小时前
Android 开发秘籍:用Tint为Icon动态变色
前端
小码哥_常1 小时前
从0到1手把手封装Android基类Activity/Fragment,告别重复代码,开发效率直接拉满!
前端
ChoriaKiinweill1 小时前
不会有人现在还不了解BOM的知识吧? 关于它的一切都在这里!!!
前端
ChoriaKiinweill1 小时前
我们最爱操纵的DOM是个什么玩意? 关于DOM的知识快速一览!
前端