重明鸟软件知识平台
@Blade Math Lib
一、安装方法。
BMath安装是非常方便的。在cmnsoft.com下载bmath.zip压缩包后,把他解压到你的项目文件夹中就可以了。解压后的文件有三个,包括bmath.h和bmath.lib(libbmath.a为LINUX版本的静态库)。
二、函数介绍。
1.数据类型
BMath库一共有五种数据类型。分别是BVector2、BVector3、BVector4、BMatrix、BQuaternion。
BVector2:二元向量。
BVector3:三元向量。
BVector3:四元向量。
BMatrix:4X4矩阵。
BQuaternion:四元数。
2.基本函数。
const char* GetVerID();//获取当前版本号。返回字符串指针。
float GetRandom();//获取一个随机数,随机数范围0.0f-1.0f。
long GetTime();//获取当前时间,毫秒级。
float BSin(float val);//计算一个正弦值。
float BCos(float val);//计算一个余弦值。
B_FLOAT BSqrt(B_FLOAT a);//计算值平方根
B_FLOAT BPower(B_FLOAT a,int n);//计算值N次方
B_FLOAT BRound(B_FLOAT val);//四舍五入
B_FLOAT* BAdd4(B_FLOAT* d,B_FLOAT* a,B_FLOAT* b);//四向量相加
B_FLOAT* BSub4(B_FLOAT* d,B_FLOAT* a,B_FLOAT* b);//四向量相减
B_FLOAT* BMul4(B_FLOAT* d,B_FLOAT* a,B_FLOAT b);//四向量相乘
B_FLOAT* BDiv4(B_FLOAT* d,B_FLOAT* a,B_FLOAT b);//四向量相除
B_FLOAT* BSqrt4(B_FLOAT* d,B_FLOAT* a);//四向量平方根
3.向量运算函数主要分为二元、三元、四元向量函数。

//向量插值函数
BVector2* BVec2Lerp(BVector2* dest,BVector2* src1,BVector2* src2,B_FLOAT s);
BVector3* BVec3Lerp(BVector3* dest,BVector3* src1,BVector3* src2,B_FLOAT s);
BVector4* BVec4Lerp(BVector4* dest,BVector4* src1,BVector4* src2,B_FLOAT s);

//向量长度平方
B_FLOAT BVec2LengthSq(BVector2* src);
B_FLOAT BVec3LengthSq(BVector3* src);
B_FLOAT BVec4LengthSq(BVector4* src);

//向量距离平方
B_FLOAT BVec2DistanceSq(BVector3* src,BVector2* det);
B_FLOAT BVec3DistanceSq(BVector3* src,BVector3* det);
B_FLOAT BVec4DistanceSq(BVector4* src,BVector4* det);

//向量最大值
BVector2* BVec2Maximize(BVector2* dest,BVector2* src1,BVector2* src2);
BVector3* BVec3Maximize(BVector3* dest,BVector3* src1,BVector3* src2);
BVector4* BVec4Maximize(BVector4* dest,BVector4* src1,BVector4* src2);

//向量最小值
BVector2* BVec2Minimize(BVector2* dest,BVector2* src1,BVector2* src2);
BVector3* BVec3Minimize(BVector3* dest,BVector3* src1,BVector3* src2);
BBVector4* BVec4Minimize(BVector4* dest,BVector4* src1,BVector4* src2);

//向量归一化
BVector2* BVec2Normalize(BVector2* dest,BVector2* src);
BVector3* BVec3Normalize(BVector3* dest,BVector3* src);
BVector4* BVec4Normalize(BVector4* dest,BVector4* src);

//向量叉值
B_FLOAT BVec2Cross(BVector2* src1,BVector2* src2);
BVector3* BVec3Cross(BVector3* dest,BVector3*src1,BVector3* src2);
BVector4* BVec4Cross(BVector4* dest,BVector4*src1,BVector4* src2,BVector4* src3);
//向量点乘
B_FLOAT BVec2Dot(BVector2* src1,BVector2* src2);
B_FLOAT BVec3Dot(BVector3* src1,BVector3* src2);
B_FLOAT BVec4Dot(BVector4* src1,BVector4* src2);

//向量空间位置转换
BVec2Transform(BVector4* dest,BVector2* src,BMatrix* m);
BVector4* BVec3Transform(BVector4* dest,BVector3* src,BMatrix* m);
BVector4* BVec4Transform(BVector4* dest,BVector4* src,BMatrix* m);

//四元数长度平方
B_FLOAT BQuatLengthSq(BQuaternion* src);

//四元数归一化
BQuaternion* BQuatNormalize(BQuaternion* dest,BQuaternion* src);

//四元数插值
BQuaternion* BQuatSlerp(BQuaternion* dest,BQuaternion* src1, BQuaternion* src2, B_FLOAT s,bool line=true);

//四元数旋转
BQuaternion* BQuatRotationAxis(BQuaternion* dest,BVector3* pv,B_FLOAT angle);

//矩阵转四元数
void MatToQuat(BQuaternion* dest,BMatrix* src);

//四元数转矩阵
void QuatToMat(BMatrix* dest,BQuaternion* src);
//BaryCentric质心坐标函数
BVector2* BVec2BaryCentric(BVector2* dest,BVector2* point1,BVector2* point2,BVector2* point3,B_FLOAT f,B_FLOAT g);
BVector3* BVec3BaryCentric(BVector3* dest,BVector3* point1,BVector3* point2,BVector3* point3,B_FLOAT f,B_FLOAT g);

//向量夹角弧度
B_FLOAT BVec2ComputAngle(BVector2* v1,BVector2* v2,BVector2* v3)
B_FLOAT BVec3ComputAngle(BVector3* v1,BVector3* v2,BVector3* v3)

4.BMath库的矩阵运算函数有15个。分别如下:

//模型视图矩阵计算(左手坐标)
BMatrix* BMatrixLookAtRH(BMatrix* dest,BVector3* pEye,BVector3* pAt,BVector3* pUp);
//模型视图矩阵计算(右手坐标)
BMatrix* BMatrixLookAtLH(BMatrix* dest,BVector3* pEye,BVector3* pAt,BVector3* pUp);
//工程矩阵正交投影计算(左手坐标)
BMatrix* BMatrixOrthoLH(BMatrix* dest,float w,float h,float zn,float zf);
//工程矩阵正交投影计算(右手坐标)
BMatrix* BMatrixOrthoRH(BMatrix* dest,float w,float h,float zn,float zf);
//工程矩阵视角锥投影计算(左手坐标)
BMatrix* BMatrixPerspectiveLH(BMatrix* dest,float w,float h,float zn,float zf);
//工程矩阵视角锥投影计算(右手坐标)
BMatrix* BMatrixPerspectiveRH(BMatrix* dest,float w,float h,float zn,float zf);
//位移矩阵
BMatrix* BMatrixTranslation(BMatrix* dest,float x,float y,float z);
//缩放矩阵
BMatrix* BMatrixScaling(BMatrix* dest,float x,float y,float z);
//旋转矩阵
BMatrix* BMatrixRotate(BMatrix* dest,float xangle,float yangle,float zangle);
//X轴旋转矩阵
BMatrix* BMatrixRotateX(BMatrix* dest,float angle);
//Y轴旋转矩阵
BMatrix* BMatrixRotateY(BMatrix* dest,float angle);
//Z轴旋转矩阵
BMatrix* BMatrixRotateZ(BMatrix* dest,float angle);
//矩阵相乘
BMatrix* BMMatrixMultiply(BMatrix* dest,BMatrix* src1,BMatrix* src2);
//矩阵转置
BMatrix* BMatrixTranspose(BMatrix* dest,BMatrix* src);
//矩阵求逆
BMatrix* BMatrixInverse(BMatrix* dest,BMatrix* src);
//UnProject函数
BMatrix* BMatrixUnProj(BVector3 pt,BMatrix* matView,BMatrix* matProj,int* viewport,BVector3* dest);

5.BMath库插值函数包括两类插值函数:

//CatmullRom插值函数
BVector2* BVec2CatmullRom(BVector2* dest,BVector2* src1,BVector2* src2,BVector2* src3,BVector2* src4,float s);
BVector3* BVec3CatmullRom(BVector3* dest,BVector3* src1,BVector3* src2,BVector3* src3,BVector3* src4,float s);
BVector4* BVec4CatmullRom(BVector4* dest,BVector4* src1,BVector4* src2,BVector4* src3,BVector4* src4,float s);

//Hermite插值函数
BVector2* BVec2Hermite(BVector2* dest,BVector2* src1,BVector2* tan1,BVector2* src2,BVector2* tan2,float s);
BVector3* BVec3Hermite(BVector3* desc,BVector3* src1,BVector3* tan1,BVector3* src2,BVector3* tan2,float s);
BVector4* BVec4Hermite(BVector4* dest,BVector4* src1,BVector4* tan1,BVector4* src2,BVector4* tan2,float s);

6.碰撞检测函数有7个

//射线与三角形碰撞检测
bool BRay2Triangle(BVector3 pStart,BVector3 pEnd,BVector3 p1,BVector3 p2,BVector3 p3,float* len);
//射线与四边形碰撞检测
bool BRay2Quad(BVector3 pStart,BVector3 pEnd,BVector3 p1,BVector3 p2,BVector3 p3,BVector3 p4,float* len);
//射线与包围盒碰撞检测
bool BRay2Box(BVector3 pStart,BVector3 pEnd,BVector3 MinVector,BVector3 MaxVector,float* len,int* style);
//四边形与四边形碰撞检测
int CrashQuad2Quad(BVector2 v1,BVector2 v2,BVector2 m1,BVector2 m2);
//包围盒与包围盒碰撞检测
int CrashBox2Box(BVector3 Min1,BVector3 Max1,BVector3 Min2,BVector3 Max2);
//三角形与三角形碰撞检测
bool CrashTriangle(BVector3 a1,BVector3 a2,BVector3 a3,BVector3 b1,BVector3 b2,BVector3 b3);
//射线插值点
BVector3 GetRayPos(BVector3 pStart,BVector3 pEnd,float v);

三、使用示例。
1、一个计算两个向量点乘的例子
    #include<stdio.h>
    #include "BMath.h"
    #pragma comment( lib, "BMath.lib" )
    int main()
    {
         BVector3 p1(0.4f,0.7f,0.03f);
         BVector3 p2(0.2f,0.22f,0.5f);
         float v = BVec3Dot(&p1,&p2);
         return 0;
    }   
    

2、检测两个包围盒位置状态的例子
    #include<stdio.h>
    #include "BMath.h"
    #pragma comment( lib, "BMath.lib" )
    int main()
    {
	    //box1
	    BVector3 pMin1(-0.1f,0.0f,-0.2f);
	    BVector3 pMax1(0.3f,0.2f,0.5f);
	    //box2
	    BVector3 pMin2(0.3f,0.0f,0.1f);
	    BVector3 pMax2(0.5f,0.2f,0.6f);
	    int status = CrashBox2Box(pMin1,pMax1,pMin2,pMax2);
	    if(status == CRASH_OUT)
	    {
		    printf("两个包围盒处于分开状态");
	    }
	    else if(status == CRASH_TOUCH)
	    {
		    printf("两个包围盒处于相邻状态");
	    }
	    else if(status == CRASH_IN)
	    {
		    printf("两个包围盒处于重合状态");
	    }
	    return 0;
    }
    

四、下载。
最新版本:1.05 [2015-12-10]
Copyright @ 2011-2018 by szc  桂ICP备11003301号-1  桂公网安备45040302000027号  Email:szcsoft@qq.com