繁体   English   中英

如何在 Unreal 蓝图中创建等效的 Unity LookAt?

[英]How can I create the equivalent of Unity LookAt in Unreal blueprint?

在虚幻中,我想要

  1. 旋转前向矢量指向目标当前 position 的演员,
  2. 确保我的演员的向上向量与我的目标的向上向量相同

在 Unity3D 中,它超级简单。 这是一行代码( source ):

transform.LookAt(target, Vector3.up);

在蓝图中,有一个名为“Find Look at Rotation”的节点。 问题是没有向上矢量参数,因此当您靠近目标时,您可能会出现不必要的滚动旋转。

那么,如何在 Unreal 蓝图中创建相当于 Unity LookAt 的内容呢?

您可以使用Make Rot From XZ很容易地做到这一点:

蓝图实施

对于worldUp的默认统一值,您将使用(0,0,1)

用立方体(显示正向和向上方向)作为LookingActor在刻度上调用它,玩家角色(人体模型) position 的 position 作为TargetPosition(0,0,1)作为WorldUp产生如下结果:

显示面向人体模型的块的动画


如果您宁愿隐藏 C++ 中的 function 定义:

void UMyBlueprintFunctionLibrary::MyLookAt(AActor LookingActor, FVector TargetPosition, 
        FVector WorldUp = FVector::UpVector)
{
    FVector Forward = TargetPosition - LookingActor.GetActorLocation();
    FRotator Rot = UKismetMathLibrary::MakeRotFromXZ(Forward, WorldUp);
    LookingActor.SetActorRotation(Rot, true);
}

我修改了在这里找到的解决方案:

https://forums.unrealengine.com/development-discussion/c-gameplay-programming/1482788-posting-the-source-code-for-lookrotation-for-those-who-need-it

源 actor 用他的 z 向量(虚幻中的向上向量)查看目标。 我将其更改为 x 向量,因为在 Unreal 中,前向向量是 x 轴。

lookAt 参数是您要查看的演员(目标)的 position。 UpDirection 是要与源的上向量匹配的目标的上向量。

只需用下面的function返回的FRotator值设置源的旋转,在源的C++代码中调用:

FRotator MyLookRotation(FVector lookAt, FVector upDirection)
{
    FVector forward = lookAt - GetActorLocation();
    FVector up = upDirection;


   forward = forward.GetSafeNormal();
   up = up - (forward * FVector::DotProduct(up, forward));
   up = up.GetSafeNormal();

   ///////////////////////


   FVector vector = forward.GetSafeNormal();
   FVector vector2 = FVector::CrossProduct(up, vector);
   FVector vector3 = FVector::CrossProduct(vector, vector2);
   float m00 = vector.X;
   float m01 = vector.Y;
   float m02 = vector.Z;
   float m10 = vector2.X;
   float m11 = vector2.Y;
   float m12 = vector2.Z;
   float m20 = vector3.X;
   float m21 = vector3.Y;
   float m22 = vector3.Z;

   float num8 = (m00 + m11) + m22;
   FQuat quaternion = FQuat();

   if (num8 > 0.0f)
   {
     float num = (float)FMath::Sqrt(num8 + 1.0f);
     quaternion.W = num * 0.5f;
     num = 0.5f / num;
     quaternion.X = (m12 - m21) * num;
     quaternion.Y = (m20 - m02) * num;
     quaternion.Z = (m01 - m10) * num;
     return FRotator(quaternion);
   }

   if ((m00 >= m11) && (m00 >= m22))
   {
     float num7 = (float)FMath::Sqrt(((1.0f + m00) - m11) - m22);
     float num4 = 0.5f / num7;
     quaternion.X = 0.5f * num7;
     quaternion.Y = (m01 + m10) * num4;
     quaternion.Z = (m02 + m20) * num4;
     quaternion.W = (m12 - m21) * num4;
     return FRotator(quaternion);
   }

   if (m11 > m22)
   {
     float num6 = (float)FMath::Sqrt(((1.0f + m11) - m00) - m22);
     float num3 = 0.5f / num6;
     quaternion.X = (m10 + m01) * num3;
     quaternion.Y = 0.5f * num6;
     quaternion.Z = (m21 + m12) * num3;
     quaternion.W = (m20 - m02) * num3;
     return FRotator(quaternion);
   }

   float num5 = (float)FMath::Sqrt(((1.0f + m22) - m00) - m11);
   float num2 = 0.5f / num5;
   quaternion.X = (m20 + m02) * num2;
   quaternion.Y = (m21 + m12) * num2;
   quaternion.Z = 0.5f * num5;
   quaternion.W = (m01 - m10) * num2;


   return FRotator(quaternion);
}

在此处输入图像描述

我对虚幻不熟悉,但看看基本上是这样的:

yourLocation-target location 这是一个指向目标的向量,那么你应该做这件事

cosInvert((a*b)/|a|*|b|)

这会给你你应该看的角度

  • a将是目标角度
  • b将是 (0,0,1),(0,1,0),(1,0,0)

现在您可以设置 3 个角度来设置 object 的旋转。

inline FQuat MyLookAt(const FVector& lookAt, const FVector& upDirection)
{
    return FRotationMatrix::MakeFromXZ(lookAt, upDirection).ToQuat();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM