我的游戏库开发-数学库的设计与实现(TMath模块)

这几天一边在重构一些TLibrary的代码, 一边在写TLib的数学库,也许很多人觉得数学库没必要写,因为像类似directx的图形库都带有基本的向量,矩阵的运算API,不过,我觉得自己实现一下可以重新复习一下数学的知识,现在越来越感觉数学的重要了,可以说游戏引擎中充满了数学。

数学库不难写,基本可以分为几个部分

1.基本的数学函数,如平方根,sin,cos等等
2.2D,3D,4D向量,点乘,叉乘等等
3.矩阵运算
4.四元数运算

数学库比较难的是效率,你可以用最基本,最简单的方法实现,不过速度就不敢恭维了,还有一些经典的优化算法,比如,快速矩阵求逆,快速平方根,快速三角函数等等,网上有很多相关的文章

还有一个比较麻烦的是验证结果,这里推荐大家用matlab,很方便的工具哦,其实matlab是功能很强大的数学软件,而且有一套自己的编程脚本语言,非常容易学习的。

下面说一下,我的数学库TMath(也是TLibrary的一部分),数学库的设计可以是基于API的,也可以是完全面向对象的,TMath采用的是完全面向对象的实现

基本的数学函数在类Math中

class  Math
{
public:
    
static inline f32 Sqrt(f32 val){...}
    
static inline f32 Sin(f32 val){...}
    ....
}

Math用的是static类方法的结构,可以用Math::Sqrt方便的调用,随便说一下,我这里用的是float32的基本数值类型,其实有时候,数学库有可能需要更高的精度,如double,或者为了速度采用低精度,如float16,所以可以预先定义数值类型,如下面的代码的样子

#if  defined(HIGH_PRECISION)
typedef 
double  MathValue
#elif  defined(LOW_PRECISION)
typedef float16 MathValue
#else
typedef float32 MathValue
#endif

这样就可以用MathValue作为你数学库的基本数值类型了

数学库其他的部分,直观的用类来进行如下定义,并且重载运算符,我想这也是很多人都能想到的方法

class  Vec2
{
}

class  Vec3
{
}

...
class  Mat3
{
}

...
class  Quat
{
}

经过一系列艰苦的编码(其实还是比较枯燥的,呵呵),一个数学库大体完成了,其实数学库也是一个不断完善的过程,需要根据以后的一些需求,进一步扩充。好啦,就写到这里了

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值