首页 > 编程语言 >UE4 C++ 攀爬功能

UE4 C++ 攀爬功能

时间:2024-05-19 13:51:22浏览次数:27  
标签:HipOffset 骨骼 TEXT 位置 攀爬 C++ UE4 节点 JB

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

标签:HipOffset,骨骼,TEXT,位置,攀爬,C++,UE4,节点,JB
From: https://www.cnblogs.com/XTG111/p/18199078

相关文章

  • 百度 Apollo 使用 bazel 编译 C++ Boost 依赖出现 undefined reference to `boost::pyth
    CSDN搬家失败,手动导出markdown后再导入博客园因为一些原因,楼主想在Apollo自动驾驶框架里使用Boost.python工具来用C++调用Python,从网上找了个例子想编译下试试。C++代码如下(boost.python/EmbeddingPython-PythonWiki):#include<boost/python.hpp>usingnamesp......
  • C/C++技巧
    1.三目运算符语法:表达式1?表达式2:表达式3。表达式1为真则执行表达式2,否则执行表达式3。相比if语句,三目运算符短小简洁,适当使用可以提高代码可读性。另外,如果三目运算符返回左值,可以继续赋值。举例#include<iostream>usingnamespacestd;intmain(){system("......
  • C++学习----make
    基本规则:touchmain.cadd.csub.cadd.hsub.h#新建以上文件main函数:intmain(void){return0;}Makefile文件:main:main.oadd.osub.ogcc-Wall-gmain.oadd.osub.o-omainmain.o:main.cgcc-Wall-g-cmain.c-omain.oadd.o:add.cadd.h......
  • C++学习----gcc
    gcc编译步骤 静态库使用步骤hello_fn.h#ifndef_HELLO_FN_H#define_HELLO_FN_Hvoidhello(constchar*name);#endifhello_fn.c#include<stdio.h>#include"hello_fn.h"voidhello(constchar*name){printf("hello%S!!!\n",name);......
  • Qt/C++音视频开发74-合并标签图形/生成yolo运算结果图形/文字和图形合并成一个/水印滤
    一、前言在使用yolo做人工智能运算后,运算结果除了一个方框,还可能需要增加文字显示在对应方框上,以便标记是何种物体,比如显示是人还是动物,或者还有可能追踪人员,显示该人员的姓名。这种应用场景非常普遍,而且非常有必要,可以非常直观的直接看到对应移动的物体是什么。当然也有个缺点,就......
  • algo c++ 常用接口
    接口网站cppreferencesetunorder_set//unorder_setunorder_set<T>u_set;//insertu_set.insert(Tt);//findandjudgeiteratorit=u_set.find(Tt);if(u_set.find(t)!=it.end()){}//删除u_set.erase(t);技巧如果想要通过一种数据类型种的值构建另一种......
  • C++读取配置文件
    1、读取=号的配置文件(或者:)的配置。#include<iostream>#include<fstream>#include<sstream>#include<map>#include<string>std::map<std::string,std::string>read_config(conststd::string&filename){std::map<std::st......
  • C++ 初始化列表(Initialization List)
    请注意以下继承体系中各class的constructors写法:1classCPoint2{3public:4CPoint(floatx=0.0)5:_x(x){}67floatx(){return_x;}8voidx(floatxval){_x=xval;}9protected:10float_x;11};1213classCPoint2d:......
  • 关于“error: Microsoft Visual C++ 14.0 is required. Get it with "Build Tools for
    安装库之前一定要注意python版本,今天鬼迷日眼的装一堆堆库,一个回车冒出来这个鬼问题。百度无果后灵光乍现,只安装报错时对应的库:condainstallnumpy==1.20.1结果在输出里找出这一段:Specifications:-numpy==1.20.1->python[version='>=3.7,<3.8.0a0|>=3.8,<3.9.0a0|>=......
  • P2 C++ 编程范式
    章节链接代码链接目录2.1.1C++工程的一般组织结构2.1.2C++工程在机器人中的组织结构2.2C++代码的编译2.2.1g++编译2.2.2make编译✅2.2.3CMake编译2.1.1C++工程的一般组织结构一般情况下,C++工程的组织结构是将不同的功能封装在不同的类中,每个类用配套的头文件......