游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1875|回复: 0

发几个gles下的矩阵封装和矩阵操作函数

[复制链接]

33

主题

159

帖子

272

积分

中级会员

Rank: 3Rank: 3

积分
272
QQ
发表于 2013-4-4 09:21:32 | 显示全部楼层 |阅读模式
GLES支撑.zip (12.93 KB, 下载次数: 97)
从2012年下半年开始做C++的GLES。之前一直做D3D,d3dvector d3dmatrix用习惯了,到了GLES下,喵的,全没了,ADT-JAVA下面好说还有几个矩阵运算函数,到了C++下的GLES,真的悲吹了。
虽然估计很少有人在C++下做GLES20,如果有人在做或学的话,大家可以交流下
发几个自己做的封装类 (附件里三组 g9debug g9type g9surport)


typedef struct G9Vec3 {
float x;
float y;
float z;
G9Vec3();
G9Vec3(float _x,float _y, float _z);
float* cast2fArray();
void copy(float* pfVec3);//慎用,可能会越界
G9Vec3 operator =(G9Vec4 v4SRC)  ;
G9Vec3 operator +(G9Vec3 v3SRC) const ;
G9Vec3 operator -(G9Vec4 v4SRC) const;//v3 = v4-v3
G9Vec3 operator -(G9Vec3 v3SRC) const ;
G9Vec3 operator -()const;//负号
G9Vec3 operator +=(G9Vec3 v3SRC) ;
G9Vec3 operator -=(G9Vec3 v3SRC) ;
G9Vec3 operator *(float fOP) const ;
G9Vec3 operator /(float fOP) const ;
bool operator == (G9Vec3 v3SRC) const;
bool operator != (G9Vec3 v3SRC) const;

//parasitic 函数是有风险的,可能会出界 控制范围bufHandel+3*iCurrNum后的三个float
static G9Vec3* parasitic(const float* bufHandle,int iV3Offset);//寄生到一个FLOAT BUFFER下,bufHandel是一个float buffer的头指针,iV3Offset是这个BUFFER的第几个
static G9Vec3* parasitic(const G9Matrix* pmxIN,int iRow);//取矩阵第iRow行 下标0-3
}*LPG9VEC3;

typedef struct G9Vec4{
float x;
float y;
float z;
float w;
G9Vec4();
G9Vec4(float _x,float _y,float _z,float _w);
G9Vec4(G9Vec3 v3,float _w);
float* cast2fArray();
void copy(float* pfVec4);//慎用,可能会越界
G9Vec4 operator =(G9Vec3 v3SRC);
G9Vec4 operator +(G9Vec4 v4SRC)const;
G9Vec4 operator +(G9Vec3 v3SRC)const;
G9Vec4 operator -(G9Vec4 v4SRC)const;
G9Vec4 operator -(G9Vec3 v3SRC)const;
static G9Vec4* parasitic(const float* bufHandle,int iV4Offset);//寄生到一个float数组
}*LPG9Vec4;

typedef struct G9Matrix{
float _11,_12,_13,_14;
float _21,_22,_23,_24;
float _31,_32,_33,_34;
float _41,_42,_43,_44;
G9Matrix();
G9Matrix(float _11,float _12,float _13,float _14,
  float _21,float _22,float _23,float _24,
  float _31,float _32,float _33,float _34,
  float _41,float _42,float _43,float _44);
float* cast2fArray() const;
const float* cast2fArray_const()const;
void copy(float* pfMatrix);
}_G9Matrix;

以及用于向量及矩阵运算的几个方法 在g9surport.cpp 里

//////////////////////////////////////////////////////////////
class G9Math{
//3元4元向量加减 最后还是决定做OPERATOR
//4元的normalize没意义 ,所以没做 喵喵,如果到时候发现是必须的,再做一次-+
public:
static float GetRandomFloat(float lowBound, float highBound);
static void GetRandomVec3(G9Vec3* v3OUT,G9Vec3* v3Min,G9Vec3* v3Max);
static G9Result v3Cross(G9Vec3* pv3Out,const G9Vec3* pv3A,const G9Vec3* pv3B);//参数传入时应已经规格化

static float v3Dot(const G9Vec3* pv3A,const G9Vec3* pv3B);
static G9Result v3Normalize(G9Vec3* pv3Out,const G9Vec3* pv3SRC);
static G9Result v3Transform(G9Vec3* pv3Out,const G9Vec3* pv3In,const G9Matrix* pmxXform);
static G9Result v4Transform(G9Vec4* pv4Out,const G9Vec4* pv4In,const G9Matrix* pmxXform);

static G9Result mxRotateAxis(G9Matrix* pmxOUT,float fRadian,const G9Vec3* pv3Axis);//喵的,弧度!还是弧度
static G9Result mxRotateX(G9Matrix* pmxINOUT,float fRadian);
static G9Result mxRotateY(G9Matrix* pmxINOUT,float fRadian);
static G9Result mxRotateZ(G9Matrix* pmxINOUT,float fRadian);
static G9Result mxMultiply(G9Matrix* pmxOUT,const G9Matrix* pmxB,const G9Matrix* pmxA);//mxout = A*B 即A为位置矩阵,B为变换矩阵
static G9Result mxScaling(G9Matrix* pmxOUT,float scl_x,float scl_y,float scl_z);// scl_x y z 应大于0
static G9Result mxIdentity(G9Matrix* pmxOUT);
static G9Result mxInverse(G9Matrix* pmxOUT,const G9Matrix* pmxSRC);
//static G9Result GenerateTS(float* pTangent,float* pBinormal,const float* )

static G9Result mxPerspective(G9Matrix* mxOUT,float fovY,float fAspect,float zn,float zf);//fovY 是视角pi/4即90度, aspect是W/H//按照GL标准(两种标准下做的透矩是不同的)
static G9Result v3PickTo01(G9Vec3 *pv3OUT,const G9Vec3 *pv3IN);//喵喵的 专门用在 GL11 BUMP MAPPING里的函数 pv3IN的一半加上0.5,0.5,0.5
/*IntersectTriangle 检测射线与三角是否相交,v3Org,v3Dir为射线,ABC为三角三点,tuv 为输出*/
static bool IntersectTriangle(const G9Vec3& v3Org,const G9Vec3& v3Dir,
        G9Vec3& v3A,G9Vec3&v3B,G9Vec3&v3C,
        float* t,float* u,float* v);
static unsigned long GetCurrTime();
static int GenerateTBN_EX2( float** pBufTangent, //tangent队列   传出 内存分配在函数内
  float** pBufBinormal, //binormal队列 传出 内存分配在函数内
  float** pBufNormal, //normal队列 传出 内存分配在函数内
  int numPoints,  //模型顶点数量
  const float* bufPos,//传入 pos队列
  const float* bufUV //传入 UV队列
  );//自己写的不怎么行,抄个网上的
static int GenerateTBN_EX( float** pBufTangent, //tangent队列   传出 内存分配在函数内
  float** pBufBinormal, //binormal队列 传出 内存分配在函数内
  float** pBufNormal, //normal队列 传出 内存分配在函数内
  int numPoints,  //模型顶点数量
  const float* bufPos,//传入 pos队列
  const float* bufUV //传入 UV队列
  );//自己写的不怎么行,抄个网上的

static std::string PrintFloatArray(const float* pF,int num) ;//打印一组FLOAT到标准字串
static void LerpVec3(bool canNormalize,const G9Vec3* pv3A,const G9Vec3* pv3B,float fLerp,G9Vec3* pv3OUT);//fLerp 为0-1之间 pv3OUT是A与B在 flerp时的插值 (已规格化)
static int Factorial(int m);//乘阶
static void v2Normalize(float* pfX,float* pfY);//进出都是参数
static float v2Dot(float fXA,float fYA,float fXB,float fYB);

/**********************************************************************私用函数**/
protected:

static void ComputeTBN_EX( G9Vec3* pv3Tangent,
        G9Vec3* pv3Binormal,
        G9Vec3* pv3Normal,
        const G9Vec3* pv3PosA,
        const G9Vec3* pv3PosB,
        const G9Vec3* pv3PosC,
        const G9Vec3* pv3UVA,
        const G9Vec3* pv3UVB,
        const G9Vec3* pv3UVC);
static void ComputeNormal( G9Vec3* pv3Normal,  //pv3PosA对应点的法线,喵,OUT
        const G9Vec3* pv3PosCurrent, //当前顶点位置
        const G9Vec3* pv3PosA, //三角形中另一点
        const G9Vec3* pv3PosB //三角形中另一点
        );

  
};//EC G9Math
//////////////////////////////////////////////////////////////

封装当然没有D3D那么完善,但如果刚开始在做C++的GLES项目,估计还是有些个用的,至于JAVA里做GLES的请忽视
dana9919
QQ:61092517
2013-4-4

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-2-26 23:09

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表