如何在 Unreal 蓝图中创建 Unity LookAt 的等价物?
How can I create the equivalent of Unity LookAt in Unreal blueprint?
在虚幻中,我想要
- 旋转前向矢量指向目标当前位置的角色,
- 确保我的演员的向上矢量与我的目标的向上矢量相同
在Unity3D中,超级简单。这是一行代码 (source):
transform.LookAt(target, Vector3.up);
在蓝图中,有一个名为"Find Look at Rotation"的节点。问题是没有向上矢量参数,所以当你靠近目标时,你可能会有一个不需要的滚动旋转。
那么,如何在 Unreal 蓝图中创建 Unity LookAt 的等效项?
我对虚幻不熟悉
但
看看基本上是这样的:
yourLocation-目标位置
这是指向目标的向量
那你应该做这件事
cosInvert((a*b)/|a|*|b|)
这会给你应该看的角度
- a会到目标角度
- 和 b 将是 (0,0,1),(0,1,0),(1,0,0)
现在您有 3 个角度可以设置为对象的旋转。
您可以使用 Make Rot From XZ
轻松完成此操作:
对于 worldUp
的默认单位值,您可以使用 (0,0,1)
。
用立方体(显示向前和向上方向)在刻度上调用它作为 LookingActor
,玩家角色(人体模型)的位置作为 TargetPosition
,(0,0,1)
作为 WorldUp
产生这样的结果:
如果您想隐藏 C++ 中的函数定义:
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);
}
我修改了在这里找到的解决方案:
源演员正在用他的 z 向量(虚幻中的向上向量)看目标。我把它改成了 x 向量,因为在 Unreal 中,前向向量是 x 轴。
lookAt 参数是您要查看的演员(目标)的位置。 UpDirection 是要与源的向上向量匹配的目标的向上向量。
只需使用以下函数返回的 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);
}
inline FQuat MyLookAt(const FVector& lookAt, const FVector& upDirection)
{
return FRotationMatrix::MakeFromXZ(lookAt, upDirection).ToQuat();
}
在虚幻中,我想要
- 旋转前向矢量指向目标当前位置的角色,
- 确保我的演员的向上矢量与我的目标的向上矢量相同
在Unity3D中,超级简单。这是一行代码 (source):
transform.LookAt(target, Vector3.up);
在蓝图中,有一个名为"Find Look at Rotation"的节点。问题是没有向上矢量参数,所以当你靠近目标时,你可能会有一个不需要的滚动旋转。
那么,如何在 Unreal 蓝图中创建 Unity LookAt 的等效项?
我对虚幻不熟悉 但 看看基本上是这样的:
yourLocation-目标位置 这是指向目标的向量 那你应该做这件事
cosInvert((a*b)/|a|*|b|)
这会给你应该看的角度
- a会到目标角度
- 和 b 将是 (0,0,1),(0,1,0),(1,0,0)
现在您有 3 个角度可以设置为对象的旋转。
您可以使用 Make Rot From XZ
轻松完成此操作:
对于 worldUp
的默认单位值,您可以使用 (0,0,1)
。
用立方体(显示向前和向上方向)在刻度上调用它作为 LookingActor
,玩家角色(人体模型)的位置作为 TargetPosition
,(0,0,1)
作为 WorldUp
产生这样的结果:
如果您想隐藏 C++ 中的函数定义:
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);
}
我修改了在这里找到的解决方案:
源演员正在用他的 z 向量(虚幻中的向上向量)看目标。我把它改成了 x 向量,因为在 Unreal 中,前向向量是 x 轴。
lookAt 参数是您要查看的演员(目标)的位置。 UpDirection 是要与源的向上向量匹配的目标的向上向量。
只需使用以下函数返回的 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);
}
inline FQuat MyLookAt(const FVector& lookAt, const FVector& upDirection)
{
return FRotationMatrix::MakeFromXZ(lookAt, upDirection).ToQuat();
}