0%

FMath相关函数

FMath

最常用的数学计算函数

基类FGenericPlatformMath

半精度浮点数转换

名称 作用 补充
LoadHalf 半精度浮点数转浮点数
StoreHalf 浮点数转半精度浮点数
VectorLoadHalf 连续4个半精度浮点数转浮点数
VectorStoreHalf 连续8个浮点数转半精度浮点数
WideVectorLoadHalf 连续4个半精度浮点数转浮点数
WideVectorStoreHalf 连续8个浮点数转半精度浮点数

浮点数取整与舍入

名称 作用 补充
TruncToInt 向零取整
TruncToFloat 向零取整
TruncToDouble 向零取整
FloorToInt 向下取整
FloorToFloat 向下取整
FloorToDouble 向下取整
RoundToInt 四舍五入
RoundToFloat 四舍五入
RoundToDouble 四舍五入
CeilToInt 向上取整
CeilToFloat 向上取整
CeilToDouble 向上取整
Fractional 返回向零取整后剩下的小数部分
Frac 返回向下取整后剩下的小数部分
Modf 将浮点数拆分为小数与整数部分
Fmod 对浮点数取余数

指数对数

名称 作用 补充
Exp e的n次方
Exp2 2的n次方
Loge 以e为底的对数
LogX 以x为底的对数
Log2 以2为底的对数
Sqrt 平方根
Pow a的b次方
InvSqrt 平方根倒数
FloorLog2 对整数计算以2为底的对数,并向下取整,输入0时返回0 等价于二进制位数-1
FloorLog2_64 对整数计算以2为底的对数,并向下取整,输入0时返回0 等价于二进制位数-1

三角函数

名称 作用 补充
Sin 正弦(弧度)
Asin 反正弦(弧度)
Sinh 双曲正弦(弧度) 常见于线性微分方程
Cos 余弦(弧度)
Acos 反余弦(弧度)
Tan 正切(弧度)
Atan 反正切(弧度) 根据正切值求弧度,输出(-π/2,π/2)
Atan2 反正切(弧度) 根据XY坐标求弧度,输出(-π,π)

浮点数有效性检查

名称 作用 补充
IsNaN 结果未定义的浮点数 例如$\frac{1}{0}$或$ \sqrt{-1} $
IsFinite 既不是未定义也不是无穷大
IsNegativeFloat 结果无穷大
IsNegativeDouble 结果无穷大

随机数

名称 作用 补充
Rand 获取随机整数
RandInit 为标准库的rand随机数添加种子
FRand 获取[0,1]的随机浮点数
SRandInit 为UE自定义的SRand随机数添加种子 SRand不只是在程序初始化时执行了Init函数,它的随机性可能不如Rand。但是如果希望只对局部进行设置随机种子时,应该优先使用SRand
GetRandSeed 获取SRand上一次的随机值
SRand 获取基于SRand的[0,1]的随机浮点数

整数位状态统计与计算

名称 作用 补充
CountLeadingZeros8 前导0的数量
CountLeadingZeros 前导0的数量
CountLeadingZeros64 前导0的数量
CountTrailingZeros 尾随0的数量
CountTrailingZeros64 尾随0的数量
CeilLogTwo 返回使输入2的N次方取整后的N值
CeilLogTwo64 返回使输入2的N次方取整后的N值
RoundUpToPowerOfTwo 使输入2的N次方向上取整后的值
RoundUpToPowerOfTwo64 使输入2的N次方向上取整后的值
MortonCode2 将形如0111的数值改为00010101。舍弃前16位 可以理解为由两个位表示原本的一位。
MortonCode2_64 将形如0111的数值改为00010101。舍弃前32位 可以理解为由两个位表示原本的一位。
ReverseMortonCode2 MortonCode2的逆操作。舍弃奇数位。
ReverseMortonCode2_64 MortonCode2的逆操作。舍弃奇数位。
MortonCode3 类似MortonCode2,但是3位表示1位。仅使用后十位
ReverseMortonCode3 MortonCode3的逆操作。
CountBits 统计1的数量 按位计算,非常秀

比较与选择

名称 作用 补充
FloatSelect 选择大于0的值
Abs 绝对值
Sign 取值的符号(-1,0,1)
Max 最大值
Min 最小值
Min 数组中的最小值
Max 数组中的最大值

平台层FPlatformMath

基类中的函数,在不同平台中存在更优化的实现。

UE通过函数名称覆盖的方式,优先调用平台优化后的实现方法。基类存在的意义主要就是为了被平台层不同的函数实现覆盖。

平台层中的函数实现不再通用,大量依赖系统或硬件特性,但是并没有提供特殊的,专用的函数。

对外暴露的类FMath

随机数

名称 作用 补充
RandHelper [0,A)的随机值 以下本质上均是使用FRand
RandHelper64 [0,A)的随机值
RandRange [A,B]的随机值
FRandRange 浮点数[A,B]的随机值
RandBool 随机bool
VRand 随机单位向量
VRandCone 锥形球面分布的随机单位向量 注意不是圆锥
RandPointInCircle 圆形分布的2维向量
RandPointInBox 立方体分布的3维点

检查

名称 作用 补充
IsWithin 判断变量是否在属于[a,b)
IsWithinInclusive 判断变量是否在属于[a,b]
IsNearlyEqual 判断两个浮点数误差是否小于给定值
IsNearlyZero 判断浮点数到0的误差是否小于给定值
IsNearlyEqualByULP 判断两个浮点数有效数字(忽略小数点)之间的差是否小于给定值 本质上是将浮点数转换为int进行比较
IsPowerOfTwo 判断整数是否为2的n次方

数学运算

名称 作用 补充
Max3 3个数取最大值
Square 求平方
Clamp 输入值限制到[a,b]范围
Wrap 将输入值循环加或减(b-a),直到输入值落入[a,b]范围
GridSnap 网格对齐,类似浮点数的四舍五入,但是支持多个维度,任意精度
DivideAndRoundUp 除法并向上取整 不应该传入浮点数
DivideAndRoundDown 常规除法(向下取整) 不应该传入浮点数
DivideAndRoundNearest 除法并四舍五入 不应该传入浮点数
Log2 以2为底的对数
SinCos 同时计算Sin与Cos UE实现的一套算法
FastAsin 计算反正弦
RadiansToDegrees 弧度转角度
DegreesToRadians 角度转弧度
ClampAngle 输入值限制到给定角度范围内 支持任意角度
FindDeltaAngleDegrees 返回两个角度之间的差值
FindDeltaAngleRadians 返回两个弧度之间的差值
UnwindRadians 将输入值循环加或减2π,直到输入值落入[-π,π]范围
UnwindDegrees 同上,但为[-180,180]
WindRelativeAnglesDegrees 对第二个角度加或减2π,使第二个角度落入[a-π,a+π]范围
FixedTurn 从a角度向b角度移动,移动最大距离为c。
CartesianToPolar 笛卡尔坐标系转化为极坐标系
PolarToCartesian 极坐标系转化为笛卡尔坐标系
GetDotDistance 未看懂,无应用
GetAzimuthAndElevation 返回方向向量在另一个坐标系中的方位角与高度 未看懂实现

插值

名称 作用 补充
GetRangePct 返回值在的输入范围的百分比 范围外的值也是正常按照百分比计算
GetRangeValue 根据给定百分比在输入范围内插值
GetMappedRangeValueClamped 将AB区间的输入值,映射为CD区间对应的值,限制输出为CD区间内
GetMappedRangeValueUnclamped 同上,不限制输入区间 非常常用的范围映射函数
Lerp 化简的线性插值函数 存在减法,小心溢出
LerpStable 标准的线性插值函数
BiLerp 二维线程插值,对四个点进行插值
CubicInterp 3次多项式插值 例如3次贝塞尔曲线
CubicInterpDerivative 3次多项式插值衍生的插值策略 没有看懂曲线计算思路,生成的点相比原始的三次插值更加均匀一点,但是形状差异较大
InterpEaseIn 幂曲线插值 指数大于1时缓入快出
InterpEaseOut 幂曲线插值 指数大于1时快入缓出
InterpEaseInOut 幂曲线组合插值 由缓入与缓出曲线拼接而成
InterpStep 阶梯函数插值
InterpSinIn Cos曲线插值1-cos[0,π/2] 缓入平出
InterpSinOut Sin曲线插值[0,π/2] 平入缓出
InterpSinInOut 正弦曲线组合插值 由上方曲线拼接而成
InterpExpoIn 以2为底的指数曲线插值缓入 比幂曲线更极端的缓入快出
InterpExpoOut 以2为底的指数曲线插值缓出 比幂曲线更极端的快入缓出
InterpExpoInOut 以2为底的指数曲线插值缓入缓出 由指数缓入与缓出曲线拼接而成
InterpCircularIn 1/4圆形曲线插值缓入
InterpCircularOut 1/4圆形曲线插值缓出
InterpCircularInOut 1/4圆形曲线插值缓入缓出 由1/4圆形缓入与缓出曲线拼接而成
FRotator Lerp 针对FRotator特化的插值函数 化简的插值算法,两个向量相差大于360度时计算错误
FRotator LerpRange 标准的FRotator特化的插值函数 注意输出值被标准化了
FQuat Lerp
FQuat BiLerp
FQuat CubicInterp
CubicCRSplineInterp 三次Catmull-Rom样条曲线插值
CubicCRSplineInterpSafe 三次Catmull-Rom样条曲线插值,安全版

特殊情况插值

名称 作用 补充
VInterpNormalRotationTo 向量插值,按照角度插值,而不是直线
VInterpConstantTo 向量起点向目标移动,移动距离由时间与速度决定
VInterpTo 添加时间与速度权重的向量插值
Vector2DInterpConstantTo 2维向量起点向目标移动,移动距离由时间与速度决定
Vector2DInterpTo 添加时间与速度权重的2维向量插值
RInterpConstantTo FRotator起点向目标旋转,旋转角度由时间与速度决定
RInterpTo 添加时间与速度权重的FRotator插值
FInterpConstantTo float起点向目标移动,移动距离由时间与速度决定
FInterpTo 添加时间与速度权重的float插值
CInterpTo 添加时间与速度权重的FLinearColor插值
QInterpConstantTo
QInterpTo

几何交点

名称 作用 补充
RayPlaneIntersection 计算射线与平面交点
LinePlaneIntersection 计算直线与平面交点
ComputeProjectedSphereScissorRect
ComputeBoundingSphereForCone
PlaneAABBIntersection 判断Box与平面是否相交
PlaneAABBRelativePosition 计算Box与平面的相对位置,上方下方或相交
SphereAABBIntersection 判断Box与球体是否相交
PointBoxIntersection 判断点是否在Box内
LineBoxIntersection
LineExtentBoxIntersection
LineSphereIntersection
SphereConeIntersection
ClosestPointOnLine
ClosestPointOnInfiniteLine
IntersectPlanes3
IntersectPlanes2
PointDistToLine
ClosestPointOnSegment
ClosestPointOnSegment2D
PointDistToSegment
PointDistToSegmentSquared
SegmentDistToSegment
SegmentDistToSegmentSafe
GetTForSegmentPlaneIntersect
SegmentPlaneIntersection
SegmentTriangleIntersection
SegmentIntersection2D
ClosestPointOnTriangleToPoint
SphereDistToLine
GetDistanceWithinConeSegment
PointsAreCoplanar

浮点运算

名称 作用 补充
TruncateToHalfIfClose 如果浮点数接近n.5,那么直接返回n.5
RoundHalfToEven 四舍五入,解接近0.5的小数也认为是0.5 相比普通的Round额外考虑了浮点数误差。-0.5舍入为-1
RoundHalfFromZero 四舍五入
RoundHalfToZero 四舍五入,但是0.5舍入为0
RoundFromZero 向远离0的方向取整
RoundToZero 向0取整
RoundToNegativeInfinity 向下取整
RoundToPositiveInfinity 向上取整

其它

名称 作用 补充
GetReflectionVector 3维向量相对某一法线反射后的向量 注意向量方向不是对称,而是一进一出
Floor 向下取整
MakePulsatingValue 返回0-1之间的Sin波动函数
FormatIntToHumanReadable 整数转为易读的字符串
MemoryTest 检查一块内存区域是否可读写,且每一位是否读写准确
Eval 计算字符串表示的数值方程,形如:”1+2x3^4”。支持加、减、乘、除、模、幂、开方、小括号运算,支持整数小数。 这里代码注释与实际功能由差异,实际不支持&|运算
GetBaryCentric2D 计算点相对三角形的重心坐标,假设输入数据为正确的三角形、输入点在三角形内、所有点投影在xy平面上依然是合理输入
ComputeBaryCentric2D 上一个函数的优化版,采用了不同的计算方法,兼容任意输入,但是开销更大
ComputeBaryCentric3D 计算四面体的重心坐标
SmoothStep x在AB之间进行慢入慢出插值(一种3次平滑曲线),形成平滑效果
ExtractBoolFromBitfield 获取字节流中,第n位的状态 注意没有安全检查
SetBoolInBitField 设置字节流中,第n位的状态 注意没有安全检查
ApplyScaleToFloat 根据向量长度计算缩放倍数
Quantize8UnsignedByte 浮点数[0,1]映射到0-255
Quantize8SignedByte 浮点数[-1,1]映射到0-255
GreatestCommonDivisor 最大公约数 辗转相除法
LeastCommonMultiplier 最小公倍数
PerlinNoise1D 柏林噪声,一种平滑后的噪声图像计算方法。实现细节远不止这里一种。不只是噪音 - 知乎 注意这个函数提供的噪声参数已经固定,只暴露了采样坐标
PerlinNoise2D 上一个函数的二维版本,采用双线性插值得到
PerlinNoise3D 上一个函数的三维版本,采用三维线性插值得到
WeightedMovingAverage 加权移动平均 一种数据平滑方法
DynamicWeightedMovingAverage 动态加权移动平均,当采样点距离前一个点过远时,使用更高权重来应用新值 对小幅信号可以做到更好的平滑,同时大幅信号真实体现