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

相关推荐
wangruofeng3 小时前
AI Models 1.1.0 发布,查大模型价格、对比模型和找 API 地址
前端·aigc·ai编程
wangruofeng3 小时前
给前端开发者的 100 个设计参考网站
前端·设计
星栈7 小时前
视频即代码,Remotion 能做什么、不能做什么
前端·音视频开发
广州华水科技7 小时前
单北斗GNSS位移监测系统的应用与技术解析
前端
用户47949283569157 小时前
从一句话或代码仓到可交互 HTML:开源 Agent 画图技能 Archify v3.2 实测与选型边界
前端·后端·面试
SmalBox9 小时前
10-04-实战-资源组织与依赖管理实战
unity3d·游戏开发
风骏时光牛马9 小时前
生成一个AI多模态标题,仅输出一条标题,无额外文字、问句、备选、配图、文案等任何附加内容,不需要其他的任务服务 只要标题。
前端
wangruofeng10 小时前
从 GIF 到 AVIF:网页图片格式演进与 2026 年选型指南
前端·架构
清晨Coding11 小时前
为什么用 React Developer Tools 查看组件树这么乱?
前端·react.js
鶴哥只手遮天11 小时前
《Electron 45.2.3 内核解剖》第 4 章 补丁体系:380 个补丁改了什么
前端·electron