FMath是 Unreal Engine 提供的数学工具类,里面集中放置了大量常用数学函数,例如:
- 取最大值、最小值
- 限制数值范围
- 绝对值
- 随机数
- 插值
- 三角函数
- 开方、乘方
- 浮点数比较
基本写法:
int32 Result = FMath::Max(10, 20);
1.最值Max,Min
int32 Result = FMath::Max(10, 20);
int32 Result = FMath::Min(10, 20);
2.Clamp 限制数值范围
FMath::Clamp(当前值, 最小值, 最大值);
float Health = 120.0f; Health = FMath::Clamp(Health, 0.0f, 100.0f);最后Health返回100.0f。
3.Abs 绝对值
float Result = FMath::Abs(-15.0f);
4.RandRange、FRand随机数
生成指定范围的随机数
int32 RandomNumber = FMath::RandRange(1, 10);
float RandomNumber = FMath::RandRange(0.0f, 100.0f);
整数版本通常包含最大值
FRand生成0.0f到1.0f之间的随机浮点数
float RandomValue = FMath::FRand();
5.Lerp 线性插值
FMath::Lerp(起始值, 目标值, 比例);
例:
FMath::Lerp(0.0f, 100.0f, 0.0f); // 0 FMath::Lerp(0.0f, 100.0f, 0.25f); // 25 FMath::Lerp(0.0f, 100.0f, 0.5f); // 50 FMath::Lerp(0.0f, 100.0f, 1.0f); // 100向量插值:
FVector StartLocation(0.0f, 0.0f, 0.0f); FVector EndLocation(1000.0f, 0.0f, 0.0f); FVector NewLocation = FMath::Lerp( StartLocation, EndLocation, 0.5f );6.FInterpTo 插值移动函数
让浮点数平滑地接近目标值地插值函数,距离目标越远变化越快,距离目标越近,变化越慢。
float NewValue = FMath::FInterpTo(
Current,
Target,
DeltaTime,
InterpSpeed
);
7.IsNearlyEqual 浮点数比较
由于计算机底层原理:
float A = 0.1f + 0.2f;
float B = 0.3f;
A和B在底层不一定完全相等,UE提供:
FMath::IsNearlyEqual()
也可以指定误差:
if (FMath::IsNearlyEqual(A, B, 0.001f))
{
}
IsNearlyZero 判断一个浮点数是否接近0:
float Speed = 0.00001f; if (FMath::IsNearlyZero(Speed)) { UE_LOG(LogTemp, Warning, TEXT("速度接近0")); }8.平方、开方、乘方
float Result = FMath::Square(5.0f);//平方
float Result = FMath::Sqrt(25.0f);//平方根
float Result = FMath::Pow(2.0f, 3.0f);//乘方
9.三角函数
float SinValue = FMath::Sin(Angle);
float CosValue = FMath::Cos(Angle);
float TanValue = FMath::Tan(Angle);
注意:传入值是弧度,不是角度
转换:
float Radians = FMath::DegreesToRadians(90.0f);
float Result = FMath::Sin(Radians);
10.Round、Floor、Ceil浮点数处理
四舍五入:
int32 Result = FMath::RoundToInt(3.6f);
向下取整:
int32 Result = FMath::FloorToInt(3.9f);
向上取整:
int32 Result = FMath::CeilToInt(3.1f);
去掉小数部分:
int32 Result = FMath::TruncToInt(3.9f);
11.Sign 获取正负号
float Result = FMath::Sign(-20.0f);
正数返回1.0f,负数返回-1.0f
12.Wrap 循环限制数值
float Angle = FMath::Wrap(450.0f, 0.0f, 360.0f);
返回90
13.MapRangeClamped 映射数值范围
将一个范围中的数值转换到另一个范围:
float Health = 50.0f; float Percent = FMath::GetMappedRangeValueClamped( FVector2D(0.0f, 100.0f), FVector2D(0.0f, 1.0f), Health );映射函数适用于更复杂的范围,例如将传感器数值0~1023映射为物体缩放1~3