程序1.4
voidMatrix3D::ZRotate(floatangle){m[0][0]=cos(GL_PI/180*angle);m[0][1]=sin(GL_PI/180*angle);m[1][0]=-sin(GL_PI/180*angle);m[1][1]=cos(GL_PI/180*angle);}
矩阵平移:直接往矩阵的设置三个空间信息就可以,这个没难度。
程序1.5
voidMatrix3D::Translate(floatx,floaty,floatz){m[3][0]=x;m[3][1]=y;m[3][2]=z;}
矩阵缩放:直接往矩阵的设置三个空间信息就可以,这个没难度。
程序1.6
voidMatrix3D::Scale(floatx,floaty,floatz){m[0][0]*=x;m[1][1]*=y;m[2][2]*=z;}
矩阵绕XYZ翻转:我们使用的方法是让x,y,z的旋转角度直接*-1空间就翻转过来了。
程序1.7
voidMatrix3D::FlipX{m[1][1]*=-1;}voidMatrix3D::FlipY{m[0][0]*=-1;}voidMatrix3D::FlipZ{m[3][3]*=-1;}
代码太多了,还有一些复杂的运算,到时候有时间了再把矩阵求逆和矩阵转置讲一下,还有把摄像机的俯仰角算成矩阵的讲一下。剩下的都是些简单的运算就自己研究下把。先把代码贴出来。
GLMath.h
#pragmaonce#definePI3.141596classVector2{private:public:intPointNum=0;floatx,y;Vector2(floatx,floaty){this->x=x;this->y=y;}voidsetXy(floatx,floaty){this->x=x;this->y=y;}Vector2&operator/=(floatn){this->x/=n;this->y/=n;return*this;}Vector2&operator*=(floatn){this->x*=n;this->y*=n;return*this;}Vector2&operator+=(Vector2&vec){this->x+=vec.x;this->y+=vec.y;return*this;}Vector2&operator-=(Vector2&vec){this->x-=vec.x;this->y-=vec.y;return*this;}Vector2operator*(floatn){Vector2temp=*this;temp.x*=n;temp.y*=n;returntemp;}Vector2operator/(floatn){Vector2temp=*this;temp.x/=n;temp.y/=n;returntemp;}Vector2operator+(Vector2vec){Vector2temp=*this;temp.x+=vec.x;temp.y+=vec.y;returntemp;}Vector2operator-(Vector2vec){Vector2temp=*this;temp.x-=vec.x;temp.y-=vec.y;returntemp;}voidnormalize{floatlen=sqrt(x*x+y*y);x/=len;y/=len;}Vector2Normalize{Vector2temp=*this;floatlen=sqrt(temp.x*temp.x+temp.y*temp.y);//单位化temp.x/=len;temp.y/=len;returntemp;}floatlength{returnsqrt(x*x+y*y);}floatlength2q{returnx*x+y*y;}floatdot(Vector2&vec)//点乘{returnx*vec.x+y*vec.y;}Vector2projection(Vector2&vec)//投影{Vector2temp;temp=vec.Normalize;Vector2temp1;temp1=temp*dot(temp);returntemp1;}Vector2ortho//正交{Vector2temp=*this;temp.x=y;temp.y=-x;returntemp;}floatCross(Vector2&vec)//叉乘{Vector2a=*this;returna.x*vec.x-a.y*vec.y;}Vector2::Vector2{x=0,y=0;}Vector2::~Vector2{}};classVector3D{public:floatx,y,z;Vector3D(floatx,floaty,floatz){this->x=x;this->y=y;this->z=z;}voidsetXYZ(floatx,floaty,floatz){this->x=x;this->y=y;this->z=z;}voidnormalize{floatlen=sqrt(x*x+y*y+z*z);x/=len;y/=len;z/=len;}Vector3DNormalize{Vector3Dtemp=*this;floatlen=sqrt(x*x+y*y+z*z);temp.x/=len;temp.y/=len;temp.z/=len;returntemp;}floatlength{returnsqrt(x*x+y*y+z*z);}floatlength2q{returnx*x+y*y+z*z;}floatdot(Vector3D&vec)//点乘{returnx*vec.x+y*vec.y+z*vec.z;}Vector3D&operator/=(floatn){this->x/=n;this->y/=n;this->z/=n;return*this;}Vector3D&operator*=(floatn){this->x*=n;this->y*=n;this->z*=n;return*this;}Vector3D&operator+=(Vector3D&vec){this->x+=vec.x;this->y+=vec.y;this->z+=vec.z;return*this;}Vector3D&operator-=(Vector3D&vec){this->x-=vec.x;this->y-=vec.y;this->z-=vec.z;return*this;}Vector3Doperator*(floatn){Vector3Dtemp=*this;temp.x*=n;temp.y*=n;temp.z*=n;returntemp;}Vector3Doperator/(floatn){Vector3Dtemp=*this;temp.x/=n;temp.y/=n;temp.z/=n;returntemp;}Vector3Doperator+(Vector3Dvec){Vector3Dtemp=*this;temp.x+=vec.x;temp.y+=vec.y;temp.z+=vec.z;returntemp;}Vector3Doperator+(floatn){Vector3Dtemp=*this;temp.x+=n;temp.y+=n;temp.z+=n;returntemp;}Vector3Doperator-{Vector3Dvec;Vector3Dtemp=*this;vec.x=-temp.x;vec.y=-temp.y;vec.z=-temp.z;returnvec;}Vector3Doperator-(Vector3Dvec){Vector3Dtemp=*this;temp.x-=vec.x;temp.y-=vec.y;temp.z-=vec.z;returntemp;}booloperator==(Vector3D&vec){if(this->x==vec.x&&this->y==vec.y&&this->z==vec.z)returntrue;elsereturnfalse;}booloperator>=(Vector3D&vec){if(this->x>=vec.x&&this->y>=vec.y&&this->z>=vec.z)returntrue;elsereturnfalse;}booloperator<=(Vector3D&vec){if(this->x<=vec.x&&this->y<=vec.y&&this->z<=vec.z)returntrue;elsereturnfalse;}booloperator%=(Vector3D&vec){if(this->x<=vec.x&&this->y<=vec.y&&this->z>=vec.z)returntrue;elsereturnfalse;}intoperator||(Vector3D&vec)//判断距离差的是正还是负{if(vec.x>0&&vec.z>0)return1;elseif(vec.x<0&&vec.z<0)return-1;elsereturn0;}Vector3Dprojection(Vector3D&vec)//投影{Vector3Dtemp;temp=vec.Normalize;Vector3Dtemp1;temp1=temp*dot(temp);returntemp1;}Vector3Dcross(Vector3D&v){Vector3Dtemp;temp.x=y*v.z-z*v.y;temp.y=z*v.x-x*v.z;temp.z=x*v.y-y*v.x;returntemp;}Vector3D::Vector3D{}Vector3D::~Vector3D{}};Vector3Doperator*(Vector3Dvc1,Vector3Dvc2);structVector4D{public:floatx,y,z,w;Vector4D(floatx,floaty,floatz,floatw){this->x=x;this->y=y;this->z=z;this->w=w;}voidsetXYZW(floatx,floaty,floatz,floatw){this->x=x;this->y=y;this->z=z;this->w=w;}Vector4D{}~Vector4D{}};classMatrix3{public:union{struct{float_11,_21,_31,_41;//_11,_12,_13,_14|float_12,_22,_32,_42;//_21,_22,_23,_24|转置后的矩阵float_13,_23,_33,_43;//_31,_32,_33,_34|float_14,_24,_34,_44;//_41,_42,_43,_44|};//openGL用的是行矩阵,但是是列的算法floatmat[16];floatm[4][4];};Matrix3{for(inti=0;i<4;++i)for(intj=0;j<4;++j)if(i==j)m[i][j]=1;elsem[i][j]=0;}Matrix3operator*(Matrix3&mat);//矩阵*矩阵Matrix3&operator*=(constMatrix3&mat);//矩阵与矩阵Vector2operator*(constVector2&v);//矩阵与向量Matrix3&Rotate(floatangle);//绕Z轴旋转Matrix3&Translate(floatx,floaty,floatz);//平移Matrix3&Translate(floatx,floaty);Matrix3&Scale(floatx,floaty);//比例Matrix3&FlipX;//x轴翻转Matrix3&FlipY;//y轴翻转voidIdentity//矩阵单位化{m[0][0]=1;m[0][1]=0;m[0][2]=0;m[0][3]=0;m[1][0]=0;m[1][1]=1;m[1][2]=0;m[1][3]=0;m[2][0]=0;m[2][1]=0;m[2][2]=1;m[2][3]=0;m[3][0]=0;m[3][1]=0;m[3][2]=0;m[3][3]=1;}~Matrix3;};Matrix3operator*(constMatrix3&mat1,constMatrix3&mat2);//矩阵与矩阵Vector2operator*(constVector2&v,constMatrix3&mat);//矩阵与向量Matrix3&Rotate(Matrix3&mat,floatangle);//绕Z轴旋转Matrix3&Translate(Matrix3&mat,floatx,floaty,floatz);//平移Matrix3&Translate(Matrix3&mat,floatx,floaty);Matrix3&Scale(Matrix3&mat,floatx,floaty);//比例Matrix3&FlipX(Matrix3&mat);//x轴翻转Matrix3&FlipY(Matrix3&mat);//y轴翻转voidVec2TransformCoord(Vector2&newVec,Vector2&cornerPoint,Matrix3&world_matrix);//************3D*******************classMatrix3D{public:union{struct{float_11,_21,_31,_41;//_11,_12,_13,_14|float_12,_22,_32,_42;//_21,_22,_23,_24|转置后的矩阵float_13,_23,_33,_43;//_31,_32,_33,_34|float_14,_24,_34,_44;//_41,_42,_43,_44|};//openGL用的是行矩阵,但是是列的算法floatmat[16];floatm[4][4];};Matrix3D{m[0][0]=1;m[0][1]=0;m[0][2]=0;m[0][3]=0;m[1][0]=0;m[1][1]=1;m[1][2]=0;m[1][3]=0;m[2][0]=0;m[2][1]=0;m[2][2]=1;m[2][3]=0;m[3][0]=0;m[3][1]=0;m[3][2]=0;m[3][3]=1;}Matrix3Doperator*(Matrix3D&mat);//矩阵*矩阵Matrix3D&operator*=(Matrix3D&mat);//矩阵与矩阵Vector3Doperator*(Vector3D&v);//矩阵与向量Matrix3DMatrixInverse(Matrix3D&m);//逆矩阵voidXRotate(floatangle);//绕X轴旋转voidYRotate(floatangle);//绕Y轴旋转voidZRotate(floatangle);//绕Z轴旋转voidTranslate(floatx,floaty,floatz);//平移voidScale(floatx,floaty,floatz);//比例voidFlipX;//x轴翻转voidFlipY;//y轴翻转voidFlipZ;//z翻转voidIdentity//矩阵单位化{m[0][0]=1;m[0][1]=0;m[0][2]=0;m[0][3]=0;m[1][0]=0;m[1][1]=1;m[1][2]=0;m[1][3]=0;m[2][0]=0;m[2][1]=0;m[2][2]=1;m[2][3]=0;m[3][0]=0;m[3][1]=0;m[3][2]=0;m[3][3]=1;}~Matrix3D{};};Matrix3DMatrixRotationAxis(Vector3D&axis,floatangle);Matrix3DMatrixRotationAxisRad(Vector3D&axis,floatradian);Vector3DVec3TransformCoord(Matrix3D&m,Vector3D&v);Vector2Vec3TransformCoord(Matrix3D&m,Vector2&v);Vector3DVec3TransformNormal(Matrix3D&m,Vector3D&v);Matrix3DYRotate(floatangle);//绕Y轴旋转(全局函数)Matrix3DMatrixTranspose(Matrix3D&m);//转置矩阵Matrix3DMatrixInverse(Matrix3D&m);//逆矩阵Matrix3DFromToRotation(Vector3Dfrom,Vector3Dto);Matrix3D&MatrixRotationYawPitchRoll(floatYaw,floatPitch,floatRoll);Matrix3D&MatrixRotationY(floatangle);structsColor{public:union{struct{floatr,g,b,a;};floatcolor[4];//r,g,b,a的分量};sColor//默认颜色{color[0]=1.0f;color[1]=1.0f;color[2]=1.0f;color[3]=1.0f;}sColor(floatr,floatg,floatb,floata)//外部初始化颜色{color[0]=r;color[1]=g;color[2]=b;color[3]=a;}floatgetR{returncolor[0];}floatgetG{returncolor[1];}floatgetB{returncolor[2];}floatgetA{returncolor[3];}voidoperator=(DWORDcol){color[0]=(col>>16&0xff)*0.00392156862;color[1]=(col>>8&0xff)*0.00392156862;color[2]=(col&0xff)*0.00392156862;color[3]=(col>>24)*0.00392156862;}voidoperator+=(floatz){r+=z;g+=z;b+=z;}booloperator==(floatz){if(r==z&&g==z&&b==z)returntrue;returnfalse;}booloperator>=(floatz){if(r>=z&&g>=z&&b>=z)returntrue;returnfalse;}booloperator<=(floatz){if(r<=z&&g<=z&&b<=z)returntrue;returnfalse;}};
GLMath.cpp
#include"Engine.h"Vector2Matrix3::operator*(constVector2&v){returnVector2(v.x*m[0][0]+v.y*m[1][0]+m[3][0],v.x*m[0][1]+v.y*m[1][1]+m[3][1]);}Matrix3Matrix3::operator*(Matrix3&mat){Matrix3temp;for(inti=0;i<4;i++){for(intj=0;j<4;j++){temp.m[i][j]=m[i][0]*mat.m[0][j]+m[i][1]*mat.m[1][j]+m[i][2]*mat.m[2][j]+m[i][3]*mat.m[3][j];}}returntemp;}Matrix3&Matrix3::operator*=(constMatrix3&mat){Matrix3cal=*this;for(inti=0;i<4;i++)for(intj=0;j<4;j++)m[i][j]=cal.m[i][0]*mat.m[0][j]+cal.m[i][1]*mat.m[1][j]+cal.m[i][2]*mat.m[2][j]+cal.m[i][3]*mat.m[3][j];return*this;}Matrix3&Matrix3::Rotate(floatangle)//绕Z轴旋转{return::Rotate(*this,angle);}Matrix3&Matrix3::Translate(floatx,floaty,floatz)//平移{return::Translate(*this,x,y,z);}Matrix3&Matrix3::Translate(floatx,floaty){return::Translate(*this,x,y);}Matrix3&Matrix3::Scale(floatx,floaty)//比例{return::Scale(*this,x,y);}Matrix3&Matrix3::FlipX//x轴翻转{return::FlipX(*this);}Matrix3&Matrix3::FlipY//y轴翻转{return::FlipY(*this);}voidVec2TransformCoord(Vector2&newVec,Vector2&cornerPoint,Matrix3&world_matrix){Vector2temp;temp.x=cornerPoint.x*world_matrix.m[0][0]+cornerPoint.y*world_matrix.m[0][1]+world_matrix.m[3][0];temp.y=cornerPoint.x*world_matrix.m[1][0]+cornerPoint.y*world_matrix.m[1][1]+world_matrix.m[3][1];newVec=temp;}Matrix3::~Matrix3{}//以上为类成员函数//以下为全局函数Matrix3operator*(constMatrix3&mat1,constMatrix3&mat2){Matrix3temp;for(inti=0;i<4;i++){for(intj=0;j<4;j++){temp.m[i][j]=mat1.m[i][0]*mat2.m[0][j]+mat1.m[i][1]*mat2.m[1][j]+mat1.m[i][2]*mat2.m[2][j]+mat1.m[i][3]*mat2.m[3][j];}}returntemp;}Vector2operator*(constVector2&v,constMatrix3&mat){returnVector2(v.x*mat.m[0][0]+v.y*mat.m[1][0]+mat.m[3][0],v.x*mat.m[0][1]+v.y*mat.m[1][1]+mat.m[3][1]);}Matrix3&Rotate(Matrix3&mat,floatangle){mat.m[0][0]=cos(GL_PI/180*angle);mat.m[0][1]=sin(GL_PI/180*angle);mat.m[1][0]=-1*sin(GL_PI/180*angle);mat.m[1][1]=cos(GL_PI/180*angle);returnmat;}Matrix3&Translate(Matrix3&mat,floatx,floaty,floatz){mat.m[3][0]=x;mat.m[3][1]=y;mat.m[3][2]=z;returnmat;}Matrix3&Translate(Matrix3&mat,floatx,floaty){mat.m[3][0]=x;mat.m[3][1]=y;returnmat;}Matrix3&Scale(Matrix3&mat,floatx,floaty){mat.m[0][0]*=x;mat.m[1][1]*=y;returnmat;}Matrix3&FlipX(Matrix3&mat)//x轴翻转{mat.m[1][1]*=-1;returnmat;}Matrix3&FlipY(Matrix3&mat)//y轴翻转{mat.m[0][0]*=-1;returnmat;}//************3D******************Matrix3DMatrix3D::operator*(Matrix3D&mat){Matrix3Dtemp;for(inti=0;i<4;i++){for(intj=0;j<4;j++){temp.m[i][j]=m[i][0]*mat.m[0][j]+m[i][1]*mat.m[1][j]+m[i][2]*mat.m[2][j]+m[i][3]*mat.m[3][j];}}returntemp;}Matrix3D&Matrix3D::operator*=(Matrix3D&mat){Matrix3Dcal=*this;for(inti=0;i<4;i++)for(intj=0;j<4;j++)m[i][j]=cal.m[i][0]*mat.m[0][j]+cal.m[i][1]*mat.m[1][j]+cal.m[i][2]*mat.m[2][j]+cal.m[i][3]*mat.m[3][j];return*this;}Vector3DMatrix3D::operator*(Vector3D&v){Vector3Dres;res.x=m[0][0]*v.x+m[1][0]*v.y+m[2][0]*v.z;res.y=m[0][1]*v.x+m[1][1]*v.y+m[2][2]*v.z;res.z=m[0][2]*v.x+m[1][2]*v.y+m[2][3]*v.z;returnres;}Vector3Doperator*(Vector3Dv1,Vector3Dv2){Vector3Dtemp;temp.x=v1.x*=v2.x;temp.y=v1.y*=v2.y;temp.z=v1.z*=v2.z;returntemp;}voidMatrix3D::XRotate(floatangle){m[1][1]=cos(GL_PI/180*angle);m[1][2]=sin(GL_PI/180*angle);m[2][1]=-sin(GL_PI/180*angle);m[2][2]=cos(GL_PI/180*angle);}voidMatrix3D::YRotate(floatangle){m[0][0]=cos(GL_PI/180*angle);m[0][2]=-sin(GL_PI/180*angle);m[2][0]=sin(GL_PI/180*angle);m[2][2]=cos(GL_PI/180*angle);}voidMatrix3D::ZRotate(floatangle){m[0][0]=cos(GL_PI/180*angle);m[0][1]=sin(GL_PI/180*angle);m[1][0]=-sin(GL_PI/180*angle);m[1][1]=cos(GL_PI/180*angle);}voidMatrix3D::Translate(floatx,floaty,floatz){m[3][0]=x;m[3][1]=y;m[3][2]=z;}voidMatrix3D::Scale(floatx,floaty,floatz){m[0][0]*=x;m[1][1]*=y;m[2][2]*=z;}voidMatrix3D::FlipX{m[1][1]*=-1;}voidMatrix3D::FlipY{m[0][0]*=-1;}voidMatrix3D::FlipZ{m[3][3]*=-1;}Matrix3DMatrix3D::MatrixInverse(Matrix3D&m){floatfTemp[12],fDet;Matrix3DmTrans=MatrixTranspose(m);fTemp[0]=mTrans.mat[10]*mTrans.mat[15];fTemp[1]=mTrans.mat[11]*mTrans.mat[14];fTemp[2]=mTrans.mat[9]*mTrans.mat[15];fTemp[3]=mTrans.mat[11]*mTrans.mat[13];fTemp[4]=mTrans.mat[9]*mTrans.mat[14];fTemp[5]=mTrans.mat[10]*mTrans.mat[13];fTemp[6]=mTrans.mat[8]*mTrans.mat[15];fTemp[7]=mTrans.mat[11]*mTrans.mat[12];fTemp[8]=mTrans.mat[8]*mTrans.mat[14];fTemp[9]=mTrans.mat[10]*mTrans.mat[12];fTemp[10]=mTrans.mat[8]*mTrans.mat[13];fTemp[11]=mTrans.mat[9]*mTrans.mat[12];Matrix3Dres;res.mat[0]=fTemp[0]*mTrans.mat[5]+fTemp[3]*mTrans.mat[6]+fTemp[4]*mTrans.mat[7];res.mat[0]-=fTemp[1]*mTrans.mat[5]+fTemp[2]*mTrans.mat[6]+fTemp[5]*mTrans.mat[7];res.mat[1]=fTemp[1]*mTrans.mat[4]+fTemp[6]*mTrans.mat[6]+fTemp[9]*mTrans.mat[7];res.mat[1]-=fTemp[0]*mTrans.mat[4]+fTemp[7]*mTrans.mat[6]+fTemp[8]*mTrans.mat[7];res.mat[2]=fTemp[2]*mTrans.mat[4]+fTemp[7]*mTrans.mat[5]+fTemp[10]*mTrans.mat[7];res.mat[2]-=fTemp[3]*mTrans.mat[4]+fTemp[6]*mTrans.mat[5]+fTemp[11]*mTrans.mat[7];res.mat[3]=fTemp[5]*mTrans.mat[4]+fTemp[8]*mTrans.mat[5]+fTemp[11]*mTrans.mat[6];res.mat[3]-=fTemp[4]*mTrans.mat[4]+fTemp[9]*mTrans.mat[5]+fTemp[10]*mTrans.mat[6];res.mat[4]=fTemp[1]*mTrans.mat[1]+fTemp[2]*mTrans.mat[2]+fTemp[5]*mTrans.mat[3];res.mat[4]-=fTemp[0]*mTrans.mat[1]+fTemp[3]*mTrans.mat[2]+fTemp[4]*mTrans.mat[3];res.mat[5]=fTemp[0]*mTrans.mat[0]+fTemp[7]*mTrans.mat[2]+fTemp[8]*mTrans.mat[3];res.mat[5]-=fTemp[1]*mTrans.mat[0]+fTemp[6]*mTrans.mat[2]+fTemp[9]*mTrans.mat[3];res.mat[6]=fTemp[3]*mTrans.mat[0]+fTemp[6]*mTrans.mat[1]+fTemp[11]*mTrans.mat[3];res.mat[6]-=fTemp[2]*mTrans.mat[0]+fTemp[7]*mTrans.mat[1]+fTemp[10]*mTrans.mat[3];res.mat[7]=fTemp[4]*mTrans.mat[0]+fTemp[9]*mTrans.mat[1]+fTemp[10]*mTrans.mat[2];res.mat[7]-=fTemp[5]*mTrans.mat[0]+fTemp[8]*mTrans.mat[1]+fTemp[11]*mTrans.mat[2];fTemp[0]=mTrans.mat[2]*mTrans.mat[7];fTemp[1]=mTrans.mat[3]*mTrans.mat[6];fTemp[2]=mTrans.mat[1]*mTrans.mat[7];fTemp[3]=mTrans.mat[3]*mTrans.mat[5];fTemp[4]=mTrans.mat[1]*mTrans.mat[6];fTemp[5]=mTrans.mat[2]*mTrans.mat[5];fTemp[6]=mTrans.mat[0]*mTrans.mat[7];fTemp[7]=mTrans.mat[3]*mTrans.mat[4];fTemp[8]=mTrans.mat[0]*mTrans.mat[6];fTemp[9]=mTrans.mat[2]*mTrans.mat[4];fTemp[10]=mTrans.mat[0]*mTrans.mat[5];fTemp[11]=mTrans.mat[1]*mTrans.mat[4];res.mat[8]=fTemp[0]*mTrans.mat[13]+fTemp[3]*mTrans.mat[14]+fTemp[4]*mTrans.mat[15];res.mat[8]-=fTemp[1]*mTrans.mat[13]+fTemp[2]*mTrans.mat[14]+fTemp[5]*mTrans.mat[15];res.mat[9]=fTemp[1]*mTrans.mat[12]+fTemp[6]*mTrans.mat[14]+fTemp[9]*mTrans.mat[15];res.mat[9]-=fTemp[0]*mTrans.mat[12]+fTemp[7]*mTrans.mat[14]+fTemp[8]*mTrans.mat[15];res.mat[10]=fTemp[2]*mTrans.mat[12]+fTemp[7]*mTrans.mat[13]+fTemp[10]*mTrans.mat[15];res.mat[10]-=fTemp[3]*mTrans.mat[12]+fTemp[6]*mTrans.mat[13]+fTemp[11]*mTrans.mat[15];res.mat[11]=fTemp[5]*mTrans.mat[12]+fTemp[8]*mTrans.mat[13]+fTemp[11]*mTrans.mat[14];res.mat[11]-=fTemp[4]*mTrans.mat[12]+fTemp[9]*mTrans.mat[13]+fTemp[10]*mTrans.mat[14];res.mat[12]=fTemp[2]*mTrans.mat[10]+fTemp[5]*mTrans.mat[11]+fTemp[1]*mTrans.mat[9];res.mat[12]-=fTemp[4]*mTrans.mat[11]+fTemp[0]*mTrans.mat[9]+fTemp[3]*mTrans.mat[10];res.mat[13]=fTemp[8]*mTrans.mat[11]+fTemp[0]*mTrans.mat[8]+fTemp[7]*mTrans.mat[10];res.mat[13]-=fTemp[6]*mTrans.mat[10]+fTemp[9]*mTrans.mat[11]+fTemp[1]*mTrans.mat[8];res.mat[14]=fTemp[6]*mTrans.mat[9]+fTemp[11]*mTrans.mat[11]+fTemp[3]*mTrans.mat[8];res.mat[14]-=fTemp[10]*mTrans.mat[11]+fTemp[2]*mTrans.mat[8]+fTemp[7]*mTrans.mat[9];res.mat[15]=fTemp[10]*mTrans.mat[10]+fTemp[4]*mTrans.mat[8]+fTemp[9]*mTrans.mat[9];res.mat[15]-=fTemp[8]*mTrans.mat[9]+fTemp[11]*mTrans.mat[10]+fTemp[5]*mTrans.mat[8];fDet=mTrans.mat[0]*res.mat[0]+mTrans.mat[1]*res.mat[1]+mTrans.mat[2]*res.mat[2]+mTrans.mat[3]*res.mat[3];fDet=1/fDet;res.mat[0]*=fDet;res.mat[1]*=fDet;res.mat[2]*=fDet;res.mat[3]*=fDet;res.mat[4]*=fDet;res.mat[5]*=fDet;res.mat[6]*=fDet;res.mat[7]*=fDet;res.mat[8]*=fDet;res.mat[9]*=fDet;res.mat[10]*=fDet;res.mat[11]*=fDet;res.mat[12]*=fDet;res.mat[13]*=fDet;res.mat[14]*=fDet;res.mat[15]*=fDet;returnres;}Vector3DVec3TransformCoord(Matrix3D&m,Vector3D&v){Vector3Dres;res.x=m.m[0][0]*v.x+m.m[1][0]*v.y+m.m[2][0]*v.z+m.m[3][0];res.y=m.m[0][1]*v.x+m.m[1][1]*v.y+m.m[2][1]*v.z+m.m[3][1];res.z=m.m[0][2]*v.x+m.m[1][2]*v.y+m.m[2][2]*v.z+m.m[3][2];returnres;}Vector2Vec3TransformCoord(Matrix3D&worldMat,Vector2&v){Vector2temp;temp.x=v.x*worldMat.m[0][0]+v.y*worldMat.m[1][0]+worldMat.m[3][0];temp.y=v.x*worldMat.m[0][1]+v.y*worldMat.m[1][1]+worldMat.m[3][1];returntemp;}Vector3DVec3TransformNormal(Matrix3D&m,Vector3D&v){Vector3Dres;res.x=m.m[0][0]*v.x+m.m[1][0]*v.y+m.m[2][0]*v.z;res.y=m.m[0][1]*v.x+m.m[1][1]*v.y+m.m[2][1]*v.z;res.z=m.m[0][2]*v.x+m.m[1][2]*v.y+m.m[2][2]*v.z;returnres;}Matrix3DMatrixRotationAxis(Vector3D&axis,floatangle){floats=sin(angle*PI/180);floatc=cos(angle*PI/180);Vector3Dv=axis.Normalize;Vector3Da=v*(1.0f-c);Matrix3Dres;res.m[0][0]=a.x*v.x+c;res.m[0][1]=a.y*v.x-v.z*s;res.m[0][2]=a.z*v.x+v.y*s;res.m[0][3]=0;res.m[1][0]=a.x*v.y+v.z*s;res.m[1][1]=a.y*v.y+c;res.m[1][2]=a.z*v.y-v.x*s;res.m[1][3]=0.0f;res.m[2][0]=a.x*v.z-v.y*s;res.m[2][1]=a.y*v.z+v.x*s;res.m[2][2]=a.z*v.z+c;res.m[2][3]=0;res.m[3][0]=0;res.m[3][1]=0;res.m[3][2]=0;res.m[3][3]=1;returnres;}Matrix3DMatrixRotationAxisRad(Vector3D&axis,floatradian){floats=sin(radian);floatc=cos(radian);Vector3Dv=axis.Normalize;Vector3Da=v*(1.0f-c);Matrix3Dres;res.m[0][0]=a.x*v.x+c;res.m[0][1]=a.y*v.x-v.z*s;res.m[0][2]=a.z*v.x+v.y*s;res.m[0][3]=0;res.m[1][0]=a.x*v.y+v.z*s;res.m[1][1]=a.y*v.y+c;res.m[1][2]=a.z*v.y-v.x*s;res.m[1][3]=0.0f;res.m[2][0]=a.x*v.z-v.y*s;res.m[2][1]=a.y*v.z+v.x*s;res.m[2][2]=a.z*v.z+c;res.m[2][3]=0;res.m[3][0]=0;res.m[3][1]=0;res.m[3][2]=0;res.m[3][3]=1;returnres;}Matrix3DYRotate(floatangle){Matrix3Dmat;mat.m[0][0]=cos(GL_PI/180*angle);mat.m[0][2]=sin(GL_PI/180*angle);mat.m[2][0]=-sin(GL_PI/180*angle);mat.m[2][2]=cos(GL_PI/180*angle);returnmat;}Matrix3DMatrixTranspose(Matrix3D&m){Matrix3Dres;res.mat[0]=m.mat[0];res.mat[1]=m.mat[4];res.mat[2]=m.mat[8];res.mat[3]=m.mat[12];res.mat[4]=m.mat[1];res.mat[5]=m.mat[5];res.mat[6]=m.mat[9];res.mat[7]=m.mat[13];res.mat[8]=m.mat[2];res.mat[9]=m.mat[6];res.mat[10]=m.mat[10];res.mat[11]=m.mat[14];res.mat[12]=m.mat[3];res.mat[13]=m.mat[7];res.mat[14]=m.mat[11];res.mat[15]=m.mat[15];returnres;}Matrix3DMatrixInverse(Matrix3D&m){floatfTemp[12],fDet;Matrix3DmTrans=MatrixTranspose(m);fTemp[0]=mTrans.mat[10]*mTrans.mat[15];fTemp[1]=mTrans.mat[11]*mTrans.mat[14];fTemp[2]=mTrans.mat[9]*mTrans.mat[15];fTemp[3]=mTrans.mat[11]*mTrans.mat[13];fTemp[4]=mTrans.mat[9]*mTrans.mat[14];fTemp[5]=mTrans.mat[10]*mTrans.mat[13];fTemp[6]=mTrans.mat[8]*mTrans.mat[15];fTemp[7]=mTrans.mat[11]*mTrans.mat[12];fTemp[8]=mTrans.mat[8]*mTrans.mat[14];fTemp[9]=mTrans.mat[10]*mTrans.mat[12];fTemp[10]=mTrans.mat[8]*mTrans.mat[13];fTemp[11]=mTrans.mat[9]*mTrans.mat[12];Matrix3Dres;res.mat[0]=fTemp[0]*mTrans.mat[5]+fTemp[3]*mTrans.mat[6]+fTemp[4]*mTrans.mat[7];res.mat[0]-=fTemp[1]*mTrans.mat[5]+fTemp[2]*mTrans.mat[6]+fTemp[5]*mTrans.mat[7];res.mat[1]=fTemp[1]*mTrans.mat[4]+fTemp[6]*mTrans.mat[6]+fTemp[9]*mTrans.mat[7];res.mat[1]-=fTemp[0]*mTrans.mat[4]+fTemp[7]*mTrans.mat[6]+fTemp[8]*mTrans.mat[7];res.mat[2]=fTemp[2]*mTrans.mat[4]+fTemp[7]*mTrans.mat[5]+fTemp[10]*mTrans.mat[7];res.mat[2]-=fTemp[3]*mTrans.mat[4]+fTemp[6]*mTrans.mat[5]+fTemp[11]*mTrans.mat[7];res.mat[3]=fTemp[5]*mTrans.mat[4]+fTemp[8]*mTrans.mat[5]+fTemp[11]*mTrans.mat[6];res.mat[3]-=fTemp[4]*mTrans.mat[4]+fTemp[9]*mTrans.mat[5]+fTemp[10]*mTrans.mat[6];res.mat[4]=fTemp[1]*mTrans.mat[1]+fTemp[2]*mTrans.mat[2]+fTemp[5]*mTrans.mat[3];res.mat[4]-=fTemp[0]*mTrans.mat[1]+fTemp[3]*mTrans.mat[2]+fTemp[4]*mTrans.mat[3];res.mat[5]=fTemp[0]*mTrans.mat[0]+fTemp[7]*mTrans.mat[2]+fTemp[8]*mTrans.mat[3];res.mat[5]-=fTemp[1]*mTrans.mat[0]+fTemp[6]*mTrans.mat[2]+fTemp[9]*mTrans.mat[3];res.mat[6]=fTemp[3]*mTrans.mat[0]+fTemp[6]*mTrans.mat[1]+fTemp[11]*mTrans.mat[3];res.mat[6]-=fTemp[2]*mTrans.mat[0]+fTemp[7]*mTrans.mat[1]+fTemp[10]*mTrans.mat[3];res.mat[7]=fTemp[4]*mTrans.mat[0]+fTemp[9]*mTrans.mat[1]+fTemp[10]*mTrans.mat[2];res.mat[7]-=fTemp[5]*mTrans.mat[0]+fTemp[8]*mTrans.mat[1]+fTemp[11]*mTrans.mat[2];fTemp[0]=mTrans.mat[2]*mTrans.mat[7];fTemp[1]=mTrans.mat[3]*mTrans.mat[6];fTemp[2]=mTrans.mat[1]*mTrans.mat[7];fTemp[3]=mTrans.mat[3]*mTrans.mat[5];fTemp[4]=mTrans.mat[1]*mTrans.mat[6];fTemp[5]=mTrans.mat[2]*mTrans.mat[5];fTemp[6]=mTrans.mat[0]*mTrans.mat[7];fTemp[7]=mTrans.mat[3]*mTrans.mat[4];fTemp[8]=mTrans.mat[0]*mTrans.mat[6];fTemp[9]=mTrans.mat[2]*mTrans.mat[4];fTemp[10]=mTrans.mat[0]*mTrans.mat[5];fTemp[11]=mTrans.mat[1]*mTrans.mat[4];res.mat[8]=fTemp[0]*mTrans.mat[13]+fTemp[3]*mTrans.mat[14]+fTemp[4]*mTrans.mat[15];res.mat[8]-=fTemp[1]*mTrans.mat[13]+fTemp[2]*mTrans.mat[14]+fTemp[5]*mTrans.mat[15];res.mat[9]=fTemp[1]*mTrans.mat[12]+fTemp[6]*mTrans.mat[14]+fTemp[9]*mTrans.mat[15];res.mat[9]-=fTemp[0]*mTrans.mat[12]+fTemp[7]*mTrans.mat[14]+fTemp[8]*mTrans.mat[15];res.mat[10]=fTemp[2]*mTrans.mat[12]+fTemp[7]*mTrans.mat[13]+fTemp[10]*mTrans.mat[15];res.mat[10]-=fTemp[3]*mTrans.mat[12]+fTemp[6]*mTrans.mat[13]+fTemp[11]*mTrans.mat[15];res.mat[11]=fTemp[5]*mTrans.mat[12]+fTemp[8]*mTrans.mat[13]+fTemp[11]*mTrans.mat[14];res.mat[11]-=fTemp[4]*mTrans.mat[12]+fTemp[9]*mTrans.mat[13]+fTemp[10]*mTrans.mat[14];res.mat[12]=fTemp[2]*mTrans.mat[10]+fTemp[5]*mTrans.mat[11]+fTemp[1]*mTrans.mat[9];res.mat[12]-=fTemp[4]*mTrans.mat[11]+fTemp[0]*mTrans.mat[9]+fTemp[3]*mTrans.mat[10];res.mat[13]=fTemp[8]*mTrans.mat[11]+fTemp[0]*mTrans.mat[8]+fTemp[7]*mTrans.mat[10];res.mat[13]-=fTemp[6]*mTrans.mat[10]+fTemp[9]*mTrans.mat[11]+fTemp[1]*mTrans.mat[8];res.mat[14]=fTemp[6]*mTrans.mat[9]+fTemp[11]*mTrans.mat[11]+fTemp[3]*mTrans.mat[8];res.mat[14]-=fTemp[10]*mTrans.mat[11]+fTemp[2]*mTrans.mat[8]+fTemp[7]*mTrans.mat[9];res.mat[15]=fTemp[10]*mTrans.mat[10]+fTemp[4]*mTrans.mat[8]+fTemp[9]*mTrans.mat[9];res.mat[15]-=fTemp[8]*mTrans.mat[9]+fTemp[11]*mTrans.mat[10]+fTemp[5]*mTrans.mat[8];fDet=mTrans.mat[0]*res.mat[0]+mTrans.mat[1]*res.mat[1]+mTrans.mat[2]*res.mat[2]+mTrans.mat[3]*res.mat[3];fDet=1/fDet;res.mat[0]*=fDet;res.mat[1]*=fDet;res.mat[2]*=fDet;res.mat[3]*=fDet;res.mat[4]*=fDet;res.mat[5]*=fDet;res.mat[6]*=fDet;res.mat[7]*=fDet;res.mat[8]*=fDet;res.mat[9]*=fDet;res.mat[10]*=fDet;res.mat[11]*=fDet;res.mat[12]*=fDet;res.mat[13]*=fDet;res.mat[14]*=fDet;res.mat[15]*=fDet;returnres;}Matrix3DFromToRotation(Vector3Dfrom,Vector3Dto){from.Normalize;to.Normalize;floatangle=acos(from.dot(to));if(angle==0){returnMatrix3D;}Vector3Daxis=from.cross(to);axis.Normalize;returnMatrixRotationAxisRad(axis,angle);}Matrix3D&MatrixRotationYawPitchRoll(floatYaw,floatPitch,floatRoll){Matrix3Dres;floatsx=sin(Pitch);floatsy=sin(Yaw);floatsz=sin(Roll);floatcx=cos(Pitch);floatcy=cos(Yaw);floatcz=cos(Roll);res.mat[0]=cz*cy-sx*sy*sz;res.mat[1]=cy*sz+sx*sy*cz;res.mat[2]=-sy*cx;res.mat[3]=0.0f;res.mat[4]=-cx*sz;res.mat[5]=cx*cz;res.mat[6]=sx;res.mat[7]=0.0f;res.mat[8]=sy*cz+sx*cy*sz;res.mat[9]=sy*sz-sx*cy*cz;res.mat[10]=cx*cy;res.mat[11]=0.0f;res.mat[12]=0.0f;res.mat[13]=0.0f;res.mat[14]=0.0f;res.mat[15]=1.0f;returnres;}Matrix3D&MatrixRotationY(floatangle){floats=sin(angle);floatc=cos(angle);Matrix3Dres;res.mat[0]=c;res.mat[1]=0;res.mat[2]=-s;res.mat[3]=0.0f;res.mat[4]=0;res.mat[5]=1;res.mat[6]=0;res.mat[7]=0.0f;res.mat[8]=s;res.mat[9]=0;res.mat[10]=c;res.mat[11]=0.0f;res.mat[12]=0.0f;res.mat[13]=0.0f;res.mat[14]=0.0f;res.mat[15]=1.0f;returnres;}

哈哈哈 子弹越打越多了
哈哈哈 子弹越打越多了
《刺客信条: 黑旗 记忆重置》回应DLC比本体贵: DLC非必须
《刺客信条:黑旗 记忆重置》的首发表现可以说不错,Steam玩家峰值直逼10万。然而Steam的玩家评价却“褒贬不一”。除了游戏宣发问题外,还有一个原因就是总价超越本体的大量DLC,让玩家觉得育碧“吃相难看”。《刺客…当臭猫扶贫神秘嘉豪号主!
原神: 7.0奥黛塔定位反转! 并非木偶专属, 冰神设计成最大悬念
各位旅行者,今天咱们来聊聊原神7.0版本里一个让人意外的角色调整——奥黛塔的定位变化。千万没想到,原本大家都以为奥黛塔是木偶的专属队友,结果根据她的机制和定位来看,这是一位同时拥有星超导和星扩散的双机制…哪辆车能不被28吨钢卷压成废铁? 哪辆车能不被28吨钢卷压成废铁?
原神: 新超导木偶队顶配配装攻略! 告别刮痧与充能卡顿
很多玩家都有这样的困惑,同样是木偶新超导队伍,部分玩家用四星队友就能打出高额满配伤害,而自己配齐五星阵容,却始终面临伤害刮痧、充能卡顿的问题。其实核心差距并非角色配置,而是多数玩家没有掌握版本更新后,…