当前位置: 首页 > news >正文

UE5 脚部贴地不穿过地板方案

UE自带的IK RIG和ControlRig技术

【UE5】角色脚部IK——如何让脚贴在不同斜度的地面(设置脚的旋转)_哔哩哔哩_bilibili

实验后这个还是有一部分问题,首先只能保证高度不能穿过,但是脚步旋转还是会导致穿模

IK前,整个模型在斜坡上会浮空

参考制作:https://www.youtube.com/watch?v=YDTxXM-ss5w

没有动画的时候是正常的,有动画后就又回到原来的样子

PowerIK

Ground Settings - Power IK

虚幻引擎插件:使用Power IK轻松愉快地实现脚底板位置矫正-CSDN博客

Foot Placement

Skeletal Controls - Foot Placement Node - #2 by High500 - Character & Animation - Epic Developer Community Forums

https://www.youtube.com/watch?v=ENmX4YupJY8

这个方法成功了

参考视频 https://www.youtube.com/watch?v=BuHhKj71DU0

首先给骨骼建立虚拟骨骼vb_foot_root,vb_foot_l和vb_foot_r

在FootPlacement这里,把VB_foot_root作为IKFoot的Root骨骼,把自己的Foot_r和Foot_L作为FK骨

LegIK这里把VB的IK骨骼加上,FK骨骼和前面一样

使用了节点之后脚部不会穿过地面了

左边是没有使用Foot,右边是使用Foot

这个方案有一定局限性,需要是根骨骼运动动画,动画本身Root位置不能低于地面,不能控制除了Foot骨骼以外的旋转(例如Ball骨骼穿过地面)

脚底部浮空的问题需要使用IKRIG解决

制作脚底IK检测地面

在Ball朝下检测与地面的距离,当和地面的距离在一定范围就判断为浮空,把脚IK向下移动

思路是制作IKRig,利用IK带动骨骼向下移动,同时有逆向运动学,带动身体其他位置防止腿部拉长

参考IK: https://www.youtube.com/watch?v=-1zBeREIQYc&ab_channel=MullerDigital

这个是中文机翻

【UE5】角色脚部IK——如何让脚贴在不同斜度的地面(设置脚的旋转)_哔哩哔哩_bilibili

锁定Pelvis,让角色不会飘飞

设置大腿被Foot带动的的弯曲方向

FootIK需要暴露出变量,在动画蓝图里面使用

//计算脚浮空与踩住地板
void UBlendAnimInstance::HeelFootTrace(FName SocketName,FVector& OutLocation,float& OutHeelDistance)
{ACharacter* Character = Cast<ACharacter>(TryGetPawnOwner());if (!Character){return;}USkeletalMeshComponent* Mesh = Character->GetMesh();if (!Mesh){return;}// 获取脚部位置(从脚尖往下发射)FVector SocketLocation = Mesh->GetSocketLocation(SocketName);// 设置射线检测的起始和结束位置FVector Start = SocketLocation; // 脚底位置FVector End = Start - FVector(0, 0, FootOffset); // 向下发射射线(通过偏移量设置长度)UE_LOG(LogTemp, Log, TEXT("%s 足底的射线位置: Start: %s, End: %s"),*SocketName.ToString(), *Start.ToString(), *End.ToString());// 射线检测FHitResult HitResult;FCollisionQueryParams QueryParams;QueryParams.AddIgnoredActor(Character); // 忽略自己if (GetWorld()->LineTraceSingleByChannel(HitResult, Start, End, ECC_Visibility, QueryParams)){// 射线命中地面FVector ImpactPoint = HitResult.ImpactPoint;// 计算脚部调整距离FVector Correction = SocketLocation - ImpactPoint;UE_LOG(LogTemp, Log, TEXT("%s 足底距离地面的长度 %s"),*SocketName.ToString(), *Correction.ToString());if (Correction.Z >= 0 && Correction.Z <= 8){// 在插值前记录当前 OutLocation 和 CorrectionUE_LOG(LogTemp, Log, TEXT("[%s] Correction.Z 在 [0, 8] 范围内: %f"), *SocketName.ToString(), Correction.Z);UE_LOG(LogTemp, Log, TEXT("[%s] 插值前 OutLocation: %s, Correction: %s"), *SocketName.ToString(), *OutLocation.ToString(), *Correction.ToString());// 执行插值OutLocation = FMath::VInterpTo(OutLocation, Correction, GetWorld()->DeltaTimeSeconds, 10.0f);// 记录插值后的 OutLocationUE_LOG(LogTemp, Log, TEXT("[%s] 插值后 OutLocation: %s"), *SocketName.ToString(), *OutLocation.ToString());// 限制 Z 分量OutLocation.Z = FMath::Clamp(OutLocation.Z, -0.8f, -0.5f);// 记录限制后的 OutLocation.ZUE_LOG(LogTemp, Log, TEXT("[%s] 限制后 OutLocation.Z: %f"), *SocketName.ToString(), OutLocation.Z);// 也可在此打印最终的脚底高度UE_LOG(LogTemp, Log, TEXT("[%s] 现在的高度 %f"), *SocketName.ToString(), OutLocation.Z);}else{// 如果 Correction.Z 不在 [0, 8] 范围内,可以在此打印日志帮助定位问题UE_LOG(LogTemp, Warning, TEXT("[%s] Correction.Z = %f 不在 [0, 8] 范围内,未进行脚部调整"), *SocketName.ToString(), Correction.Z);}}
}

在动画蓝图内使用这个节点,输入脚的位置(foot或者ball)作为脚底检测,然后发射一个向下检测的射线

把输出的值再设置到IK上

http://www.xdnf.cn/news/308593.html

相关文章:

  • 含锡废水回收率提升技术方案
  • 37-算法打卡-栈与队列-滑动窗口最大值-leetcode(239)-第三十七天
  • ==和equals的区别 hashCode和equals的联系
  • 文章记单词 | 第65篇(六级)
  • 【JavaScript】将字符串转为base64
  • C/C++ 扩展智能提示太慢或无法解析项目
  • 使用VMware Workstation pro 17.5.1在Windows上安装Ubuntu 24.04.2的 详细步骤
  • 第一章-语言基础\3.STL
  • RHCSA Linux系统 网络管理
  • Grafana-新增用户
  • 104二叉树的最大深度
  • 标签语句分析
  • 第11次:用户注册(简要版)
  • 【大模型面试】大模型(LLMs)高频面题全面整理(★2025年5月最新版★)
  • 13前端项目----购物车修改
  • 结合Hutool 突增突降检测的算法
  • Linuxweb服务的部署及优化
  • 网站主机控制面板深度解析:cPanel、Plesk 及其他主流选择
  • AIDC智算中心建设:存储核心技术解析
  • suna直接从agent启动时,死循环问题
  • “FATAL ERROR: Reached heap limit Allocation failed” NodeJS 错误解决方案
  • URP - 深度图
  • 多模态大语言模型arxiv论文略读(六十一)
  • 码蹄集——直线切平面、圆切平面
  • postgresql 创建、移出数据保留策略
  • WiFi那些事儿(八)——802.11n
  • 基于Anaconda的Pycharm环境配置
  • 【IP101】图像处理进阶:从直方图均衡化到伽马变换,全面掌握图像增强技术
  • 游戏的TypeScript(6)TypeScript的元编程
  • 高级java每日一道面试题-2025年5月03日-基础篇[反射篇-编码]-使用反射创建`java.util.Date`对象,并调用其无参构造方法。