我平常自己写点小东西都是用的 GLM(OpenGL Mathematics)数学库。GLM 功能很强大,也很方便用,直接包含在项目中编译即可。但是文件太多,有时候想写个小例子只用到其中个别函数,而不得不把整个库的代码都拉过来,而且最重要的是我个人更喜欢 c ,很多时候因为用 GLM 不得不采用 cpp 语法。所以就从网上搜索了一下,找了三个 c 代码的数学库。
linmath
功能相对很多,我当时搜索时是在 stackoverflow 上找到的,作者在回答时推荐了自己的这个库,还说有奇怪的 bug ,所以我没有用,不过我蛮喜欢这个库中对于 c macro 的使用。
kazmath
功能很全面,作者也是大名鼎鼎。看介绍说 Cocos2d 也参考了这个库。
math3d_h
STB style 。单个头文件即可使用。我用的就是这个库。这个库代码超级简洁。而且包含了完整的单元测试。下面是简单的代码片段。这个文件中只包含了两个类型 vec3_t
和 mat4_t
。矩阵与 vector 相乘时有函数 m4_mul_pos
和 m4_mul_dir
,分别对应点坐标和矢量坐标,矢量坐标会忽略 w
分量而点坐标不会,具体可以查看实现。
mat4_t viewmat = m4_look_at(vec3((float)sin(t) * radius, 25.0f, (float)cos(t) * radius), vec3(0, -50.0f, 0), vec3(0, 1.0f, 0));mat4_t persmat = m4_perspective(45.0f, (float)w / (float)h, 0.1f, 1000.0f);