问题描述
当我偶然发现节点“Look At function”时,我一直在虚幻引擎中进行测试。文档在这里:https://docs.unrealengine.com/en-US/BlueprintAPI/Utilities/Animation/LookAtFunction/index.html。
最初我认为节点会做我想做的事:获得一个变换,该变换在以最大角度夹紧的同时朝着目标向量旋转。通过多次测试,我发现它从原始旋转中夹紧,例如。如果您开始面向 1,0,您将不会旋转超过以 1,0 为度数的钳位值锥体。 我的意思是,为什么不呢,它来自一个动画库,所以这个函数可能用于限制骨骼旋转。但是我不明白它是如何工作的,因为在每一帧都会替换变换,所以它应该没有基本旋转的信息。
代码恰好是 UKisMetanimationLibrary::K2_LookAt(在 KisMetanimationLibrary.cpp 中),它执行一些先决条件检查,然后调用 AnimationCore::Solveaim(在 AnimationCoreLibrary.cpp 中)。在这里完成了一些检查,但也使用这个来限制目标
if (DiffAngle > aimClampInradians)
{
check(DiffAngle > 0.f);
FVector DeltaTarget = ToTarget - aimVector;
// clamp delta target to within the ratio
DeltaTarget *= (aimClampInradians / DiffAngle);
// set new target
ToTarget = aimVector + DeltaTarget;
ToTarget.normalize();
}
aimVector 是参数,ToTarget 只是目标位置 - 位置(在作为参数传递的变换中)
计算 ToTarget 向量后,它调用 FindBetweennorms,它是 FindBetween_Helper 的包装器(均在 UnrealMath.cpp 中),这是我没有遵循 quat 数学的地方:
FORCEINLINE_DEBUGGABLE FQuat FindBetween_Helper(const FVector& A,const FVector& B,float normAB)
{
float W = normAB + FVector::DotProduct(A,B);
FQuat Result;
if (W >= 1e-6f * normAB)
{
//Axis = FVector::Crossproduct(A,B);
Result = FQuat(A.Y * B.Z - A.Z * B.Y,A.Z * B.X - A.X * B.Z,A.X * B.Y - A.Y * B.X,W);
}
else
{
// A and B point in opposite directions
W = 0.f;
Result = FMath::Abs(A.X) > FMath::Abs(A.Y)
? FQuat(-A.Z,0.f,A.X,W)
: FQuat(0.f,-A.Z,A.Y,W);
}
Result.normalize();
return Result;
}
据我所知,它只是用点积计算两个向量之间的角度,用叉积计算旋转轴(带边缘情况)。
然后将结果传递给转换时的 SetRotation,然后返回转换。有什么我遗漏的可以解释这种行为吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)