UE4 C++ 攀爬功能

news/2024/11/17 11:48:49/文章来源:https://www.cnblogs.com/XTG111/p/18199078

UE中的TEXT()

UE中使用TEXT()包含字符串后,将字符串转换为宽字符,其将被处理为支持Unicode和跨平台兼容性,而普通类型的字符串为一个窄字符类型,可能在跨平台出现问题。
最主要的问题是在FString的构造函数中是接受TCHAR的


所以对于FString FName FTEXT的构造需要传入TEXT("xxxx")。

TEXT()是一个宏定义

通过比较平台的TCHAR类型,来决定将字符串x转换为u或者L类型

eg

主要是当我在使用UKismetSystemLibrary::K2_SetTimer(this, TEXT("AutoClimb"), 0.01f, true, 0.0f, 0.0f)时,该函数是蓝图中的该节点

最开始没有使用TEXT来包含函数名,其会报错
LogBlueprintUserMessages: Warning: SetTimer passed a bad function (AutoClimb) or object (None)
K2_SetTimer中函数名字是FName的类型参数,如果只传入"AutoClimb",应该是"AutoClimb"由于编码问题无法被正确处理为反射系统中存储的函数名,所以导致在使用SetTimer被调用时,导致UE的反射系统没有办法找到函数而报错
这里只是猜测,待补充
当然K2_SetTimer可以利用GetWorldTimerManager().SetTimer代替

IK

使用UE中的FABRIK和Two Bone IK 匹配脚的位置
IK:逆向运动学
FK:正向运动学
是两种用来确定骨骼位置的方式,如果将整个骨骼简化为RootBone-->JointBone-->EndBone。
那么FK就是通过调整RB,JB,EB的位置来最终实现EB在正确位置
而IK就是直接操作EB,通过EB的位置和其与RB,JB的几何约束反向求解RB,JB的位置

Two Bone IK

在UE中TBIK发生在ComponentSpace所以当在动画蓝图中使用TBIK时,UE会自动将骨骼从LocalSpace转换为ComponentSpace。
而为了能够通过EndBone求解出RB和JB,需要一个平面来放置JB,即JB的移动会在这个平面内。所以在TwoBoneIK的节点上要求我们传入一个JointTarget,一般来说该Target可以是一个经验定值即可

  1. 通过射线检测求得脚部位置的偏移
    可以通过添加骨骼插槽来求解骨骼位置,然后从脚部位置EndBone发出射线来求解与地面的接触点。
	FVector SocketLocation = CharacterRef->GetMesh()->GetSocketLocation(SocketName);FVector ActorLocation = CharacterRef->GetActorLocation();float FootTraceOffset;FVector Start = { SocketLocation.X,SocketLocation.Y,ActorLocation.Z };FVector End = { SocketLocation.X,SocketLocation.Y,SocketLocation.Z - CapsuleComponent->GetUnscaledCapsuleHalfHeight() };FHitResult Hit;ETraceTypeQuery Visible = UEngineTypes::ConvertToTraceType(ECC_Visibility);bool IsHit = UKismetSystemLibrary::LineTraceSingle(GetWorld(),Start,End,Visible,false,TArray<AActor*>{},EDrawDebugTrace::None,Hit,true);

当返回为true,说明检测到了地面,现在就需要求解脚部位置的偏移量。这是为了对应在TwoBoneIK中选择Effector的LocationSpace选择Bone Space。
image
注意到Mesh的节点即计算其高度的节点实际上是在两脚之间
image
所以当计算脚部偏移时,应当使用当前检测到位置减去Mesh节点的位置才是正确的偏移量
image
而由于胶囊体的存在导致整体的骨骼由于碰撞无法下沉,所以还需要使用到
image
该节点将设置从pelvis骨骼下沉一段距离HipOffset,而由于下沉了HipOffset所以需要在脚部偏移量的位置进行补偿

float Z = (HitLocation - CharacterRef->GetMesh()->GetComponentLocation()).Z;
//5.0f为测试参数,需根据实际情况进行调整
FootTraceOffset = Z - IKHipOffset + 5.0f;

到这里,脚部的偏移已经求解完成,使用它至于在将其赋值给TwoBoneIK节点中的Effector参数的X值即可,因为在插槽的坐标系X轴是竖直方向的。并且右脚的X还是反向的

//Animation Blueprint
LeftFootLocationIK.X = XClimbComp->GetIKLeftFootOffset();
RightFootLocationIK.X = XClimbComp->GetIKRightFootOffset() * (-1.0f);
  1. HipOffset
    前面说到为了使得骨骼下层,需要求解HipOffset,HipOffset其实就是左右脚的差值,这是由于如果补偿HipOffset,由于胶囊体碰撞,骨骼将被限制在高处的台阶
    image
    其次为了避免出现左右脚Hit位置高度差过大,而导致的骨骼拉扯问题,还需要对HipOffset的大小进行限制
    当过大就不再进行HipOffset,说明再走一步可能就掉下去了
float target = abs((RightFootLocation - LeftFootLocation).Z);
if (target != 0.0f)target = UKismetMathLibrary::SelectFloat((-1.0f * target), 0.0f, (target < CapsuleComponent->GetUnscaledCapsuleHalfHeight() / 2.0f));
IKHipOffset = UKismetMathLibrary::FInterpTo(IKHipOffset,target,UGameplayStatics::GetWorldDeltaSeconds(this),20.0f
);

那么整个在动画蓝图中的节点使用情况就如下所示
image
image
image

FABRIK

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/708734.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

消防二总线 PowerBus 通信原理简介

典型应用图 首先需要设计一种可编码寻址通用联动控制接口件。一方面它作为二总线上的挂接设备——能被区域控制器寻址,同时返回自身的状态信息; 另一方面当区域控制器需要联动它所控制的消防设备时能提供控制触点。如图①,通用联动接口通过桥式输入电路与总线相联,桥式输入…

实验4

task1_1.c点击查看代码 #include <stdio.h> #define N 4void test1() {int a[N] = {1, 9, 8, 4}; int i;printf("sizeof(a) = %d\n", sizeof(a));for (i = 0; i < N; ++i)printf("%p: %d\n", &a[i], a[i]);printf("a = %p\n&qu…

消防二总线通信原理简介

典型应用图 首先需要设计一种可编码寻址通用联动控制接口件。一方面它作为二总线上的挂接设备——能被区域控制器寻址,同时返回自身的状态信息; 另一方面当区域控制器需要联动它所控制的消防设备时能提供控制触点。如图①,通用联动接口通过桥式输入电路与总线相联,桥式输入…

家庭路由/网关 网络配置折腾日记

2024年5月19日 近期在家里 每天用着用着网络就开始断开, 明明连着网的,但是wifi会出现无网络原因我大概也知道 因为光猫的网段是192.168.1.1 我的主路由也是 前一段时间我尝试把主路由ip改为1.254 短暂的解决问题了几天 这几天又疯了 我直接不能忍 家里十几个终端全部改了…

关于PCB导线与焊盘夹角的讨论

很多PCB工程师都知道Layout走线时忌走直角,那么锐角能走吗? 回答当然是否定的!为什么呢? 这里先不说锐角对高速信号走线会不会造成负面影响,单从PCB DFM(可制造性设计)来看。 PCB信号线形成锐角,会造成“酸角(acid traps)”的问题。在PCB线路刻蚀环节,在“酸角”处会出…

0519 基础特征数列

1.质数数列 2 3 5 7 11 13 17 19 23 29 31 +1变形 3 4 6 8 12 14 倒序变形 29 23 19 17 13 11 7 5 加和变形 3(2+1) 5(3+2) 8(5+3) 11(7+4) 16(11+5) 19(13+6) 24(17+7) 2.合数数列 4 6 8 9 10 12 14 15 (偶数里夹了1个…

Iptables使用

netfiler(linux内核) 管理防火墙工具: iptables firewalld nft ufw三种报文流向 流入本机:PREROUTING --> INPUT-->用户空间进程 流出本机:用户空间进程 -->OUTPUT--> POSTROUTING 转发:PREROUTING --> FORWARD --> POSTROUTING iptables 五个表 (Tables…

cs01 CSS Syntax

A CSS comprises of style rules that are interpreted by the browser and then applied to the corresponding elements in your document. A style rule is made of three parts −Selector − A selector is an HTML tag at which a style will be applied. This could be …

手写Word2vec算法实现

1. 语料下载:https://dumps.wikimedia.org/zhwiki/latest/zhwiki-latest-pages-articles.xml.bz2 【中文维基百科语料】 2. 语料处理 (1)提取数据集的文本 下载的数据集无法直接使用,需要提取出文本信息。 安装python库:pip install numpy pip install scipy pip install …

IP地址与子网掩码的关系

IP地址与子网掩码的关系IP地址与子网掩码的关系网站:http://shibowl.topgithub:https://github.com/hanbinjxnc博客园:https://www.cnblogs.com/hool 博客:https://blog.shibowl.top 作者:世博 2019年4月28日