UE4 FVector 转四元数 FQuat
版权声明:本文为CSDN博主「东门吹白雪」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
正文
参考文章 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版权协议,转载请附上原文出处链接及本声明。
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());