【转载】UE4 四元数 FQuat 随记

1,727 阅读2分钟

UE4 FVector 转四元数 FQuat

版权声明:本文为CSDN博主「东门吹白雪」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:blog.csdn.net/baidu_28938…

正文

参考文章 Unity3D 中的 Quaternion(四元数)

UE4 中找了好久终于发现相关函数:翻译来自有道 哈哈

FQuatMakeFromEuler

/*
 * Convert a vector of floating-point Euler angles (in degrees) into a Quaternion. 
 * 将浮点欧拉角的一个矢量转换成四元数。
 * @param Euler the Euler angles 
 * 对欧拉角进行分析
 * @return constructed FQuat 
 * 返回构造 FQuat
 */

static CORE_API FQuatMakeFromEuler(const FVector&Euler);

使用:

FVector vec = FVector(0, 0, 45);
FQuat quat = FQuat::MakeFromEuler(vec);

ToOrientationQuat

/**
 * Return the Quaternion orientation corresponding to the direction in which the vector points.
 *返回与矢量点方向对应的四元数方向。
 *
 * Similar to the FRotator version, returns a result without roll such that it preserves the up vector.
 * 类似于 FRotator 版本,返回一个没有滚动的结果,这样它就保留了向上的向量。
 *   
 * @note If you don't care about preserving the up vector and just want the most direct rotation, you can use the faster
 * 'FQuat::FindBetweenVectors(FVector::ForwardVector, YourVector)' or 'FQuat::FindBetweenNormals(...)' if you know the vector is of unit length.
 * 注意,如果你不关心保持向上的向量,只需要最直接的旋转,你就可以用更快的
 * “FQuat::FindBetweenVectors(FVector::ForwardVector YourVector)”【生成任意长度的两个向量之间的 “最小” (测地线)旋转。】 或者
 * 如果你知道向量是单位长度的前提下 “FQuat:FindBetweenNormals(…)”【生成两个法线(假设为单位长度)之间的 “最小” (测地线)旋转。 】 方法。
 *
 * @return Quaternion from the Vector's direction, without any roll.
 * @return Quaternion 从矢量方向,没有任何滚动。
 * 
 * @see ToOrientationRotator(), FQuat::FindBetweenVectors()
 */
CORE_API FQuat ToOrientationQuat() const;

使用:

FVector v(0, 0, 40);
auto q = v.ToOrientationQuat();

FRotatot 和 FQuat 互相转换

版权声明:本文为CSDN博主「invgihfsvf」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:blog.csdn.net/invgihfsvf/…

FRotator 转 FQuat:

FRotator MyRotator;
FQuat MyQuat = MyRotator.Quaternion();

FQuat 转 FRotator:

FQuat MyQuat;
FRotator MyRotator(MyQuat); // 用 FRotator 的构造函数

应用举例

修改一个 Transform 中的 Rotator :

// 一个从样条曲线上获取的 Transform
FTransform NewTransform = Spline->GetTransformAtDistanceAlongSpline(Distance, CoordinateSpace); 
FRotator Rotator = NewTransform.Rotator();
Rotator.Yaw += 180;
NewTransform.SetRotation(Rotator.Quaternion());