这几天一边在重构一些TLibrary的代码, 一边在写TLib的数学库,也许很多人觉得数学库没必要写,因为像类似directx的图形库都带有基本的向量,矩阵的运算API,不过,我觉得自己实现一下可以重新复习一下数学的知识,现在越来越感觉数学的重要了,可以说游戏引擎中充满了数学。
数学库不难写,基本可以分为几个部分
1.基本的数学函数,如平方根,sin,cos等等
2.2D,3D,4D向量,点乘,叉乘等等
3.矩阵运算
4.四元数运算
数学库比较难的是效率,你可以用最基本,最简单的方法实现,不过速度就不敢恭维了,还有一些经典的优化算法,比如,快速矩阵求逆,快速平方根,快速三角函数等等,网上有很多相关的文章
还有一个比较麻烦的是验证结果,这里推荐大家用matlab,很方便的工具哦,其实matlab是功能很强大的数学软件,而且有一套自己的编程脚本语言,非常容易学习的。
下面说一下,我的数学库TMath(也是TLibrary的一部分),数学库的设计可以是基于API的,也可以是完全面向对象的,TMath采用的是完全面向对象的实现
基本的数学函数在类Math中
... {
public:
static inline f32 Sqrt(f32 val)...{...}
static inline f32 Sin(f32 val)...{...}
....
}
Math用的是static类方法的结构,可以用Math::Sqrt方便的调用,随便说一下,我这里用的是float32的基本数值类型,其实有时候,数学库有可能需要更高的精度,如double,或者为了速度采用低精度,如float16,所以可以预先定义数值类型,如下面的代码的样子
typedef double MathValue
#elif defined(LOW_PRECISION)
typedef float16 MathValue
#else
typedef float32 MathValue
#endif
这样就可以用MathValue作为你数学库的基本数值类型了
数学库其他的部分,直观的用类来进行如下定义,并且重载运算符,我想这也是很多人都能想到的方法
... {
}
class Vec3
... {
}
...
class Mat3
... {
}
...
class Quat
... {
}
经过一系列艰苦的编码(其实还是比较枯燥的,呵呵),一个数学库大体完成了,其实数学库也是一个不断完善的过程,需要根据以后的一些需求,进一步扩充。好啦,就写到这里了