FMath
最常用的数学计算函数
半精度浮点数转换
名称 |
作用 |
补充 |
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 |
数组中的最大值 |
|
基类中的函数,在不同平台中存在更优化的实现。
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 |
动态加权移动平均,当采样点距离前一个点过远时,使用更高权重来应用新值 |
对小幅信号可以做到更好的平滑,同时大幅信号真实体现 |