UE4 中的 LookAtFunction 无法按预期工作

问题描述

当我偶然发现节点“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 (将#修改为@)