// 重置OpenGL窗口大小 void CglWnd::ReSizeGLScene( GLsizei width, GLsizei height ) { if (height==0) // 防止被零除 { height=1; // 将Height设为1 } float mat_p[16]; float mat_t[16]; float mvp[16]; float aspect = (float)width/height; glViewport(0,0,width,height); // 重置当前的视口 matIdentity(mvp); matIdentity(mat_p); matIdentity(mat_t); viewHeight = 720/2; viewWidth = viewHeight*aspect; // 设置视口的大小 matPerspective((float*)mat_p, 90, aspect, 200.0f, 500.0f); //设置镜头 matLookAt((float*)mat_t, 0,0,viewHeight, 0,0,0, 0,1,0); matMult((float*)mvp, (float*)mat_p, (float*)mat_t); //z=0 平面的投影大小 // set the transformation glUniformMatrix4fv(viewprojLoc, 1, GL_FALSE, (float*)mvp); resetMainTexVertex(); }
void matRotate(float* a,float* axis,float angle) { float mag,s,c; float xx,yy,zz,xy,yz,zx,xs,ys,zs,one_c; float x,y,z; float m[16]; double rads; x=axis[0]; y=axis[1]; z=axis[2]; rads=(double)angle*PI/180.0F; s=(float)sin(rads); c=(float)cos(rads); mag=(float)sqrt(x*x+y*y+z*z); if(mag == 0.0) { matIdentity(m); return; } x/=mag; y/=mag; z/=mag; #define M(row,col) m[(col<<2)+row] xx=x*x; yy=y*y; zz=z*z; xy=x*y; yz=y*z; zx=z*x; xs=x*s; ys=y*s; zs=z*s; one_c=1.0F-c; M(0,0)=(one_c*xx)+c; M(0,1)=(one_c*xy)-zs; M(0,2)=(one_c*zx)+ys; M(0,3)=0.0F; M(1,0)=(one_c*xy)+zs; M(1,1)=(one_c*yy)+c; M(1,2)=(one_c*yz)-xs; M(1,3)=0.0F; M(2,0)=(one_c*zx)-ys; M(2,1)=(one_c*yz)+xs; M(2,2)=(one_c*zz)+c; M(2,3)=0.0F; M(3,0)=0.0F; M(3,1)=0.0F; M(3,2)=0.0F; M(3,3)=1.0F; #undef M matProduct(NULL,a,m); return; }
void matInvert(float *c,float* m) { float det; float tmp[16]; // allow out = in float d12,d13,d23,d24,d34,d41; float im11,im12,im13,im14; #define MAT(m,r,c) (m)[((c)<<2)+(r)] #define m11 MAT(m,0,0) #define m12 MAT(m,0,1) #define m13 MAT(m,0,2) #define m14 MAT(m,0,3) #define m21 MAT(m,1,0) #define m22 MAT(m,1,1) #define m23 MAT(m,1,2) #define m24 MAT(m,1,3) #define m31 MAT(m,2,0) #define m32 MAT(m,2,1) #define m33 MAT(m,2,2) #define m34 MAT(m,2,3) #define m41 MAT(m,3,0) #define m42 MAT(m,3,1) #define m43 MAT(m,3,2) #define m44 MAT(m,3,3) if((m41 != 0.0F) || (m42 != 0.0F) || (m43 != 0.0F) || (m44 != 1.0F)) { matInvertEx(c,m); return; } // Inverse=adjoint/det tmp[0]=m22*m33-m23*m32; tmp[1]=m23*m31-m21*m33; tmp[2]=m21*m32-m22*m31; // Compute determinant using cofactors det=m11*tmp[0]+m12*tmp[1]+m13*tmp[2]; // Singularity test if(det == 0.0F) matIdentity(c); else { det=1.0F/det; // Compute rest of inverse tmp[0]*=det; tmp[1]*=det; tmp[2]*=det; tmp[3]=0.0F; im11=m11*det; im12=m12*det; im13=m13*det; im14=m14*det; tmp[4]=im13*m32-im12*m33; tmp[5]=im11*m33-im13*m31; tmp[6]=im12*m31-im11*m32; tmp[7]=0.0F; // Pre-compute 2x2 dets for first two rows when computing cofactors of last two rows. d12=im11*m22-m21*im12; d13=im11*m23-m21*im13; d23=im12*m23-m22*im13; d24=im12*m24-m22*im14; d34=im13*m24-m23*im14; d41=im14*m21-m24*im11; tmp[8]=d23; tmp[9]=-d13; tmp[10]=d12; tmp[11]=0.0F; tmp[12]=-(m32*d34-m33*d24+m34*d23); tmp[13]=(m31*d34+m33*d41+m34*d13); tmp[14]=-(m31*d24+m32*d41+m34*d12); tmp[15]=1.0F; memcpy(c,tmp,sizeof(float)*16); } #undef m11 #undef m12 #undef m13 #undef m14 #undef m21 #undef m22 #undef m23 #undef m24 #undef m31 #undef m32 #undef m33 #undef m34 #undef m41 #undef m42 #undef m43 #undef m44 #undef MAT return; }