[英]Unreal Engine: How can I create UStaticMeshComponent in a loop?
[英]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 的内容呢?
您可以使用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);
}
我修改了在这里找到的解决方案:
源 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|)
这会给你你应该看的角度
现在您可以设置 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.