累计访问:81次
@Blade Math Lib
一、安装方法。
BMath安装是非常方便的。下载bmath.zip压缩包后,把他解压到你的项目文件夹中就可以了。解压后的文件有三个,包括bmath.h、bmath.lib和libbmath.a。其中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.矩阵运算函数有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.两类插值函数
   
        //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;
        }
        
Copyright @ 2011-2019 by szc     桂ICP备11003301号-1    桂公网安备45040302000027号    主站:重明鸟软件知识平台