示例#1
0
// 重置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();
}
示例#2
0
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;
}
示例#3
0
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;
}