OpenGL之建立三维坐标网格

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Cracent/article/details/51049416

OpenGL之建立三维坐标网格

By Cracent

之前的一件作品,在此与大家分享一下:

这件作品里面涉及到了三维坐标网格的建立,本文将进行代码解析。

1、网格建立函数

void CMyStatic::GLGrid(coordpoint& pt1, coordpoint& pt2,int num)

{

const float _xLen = (pt2.x -pt1.x) / num;

    const float _yLen = (pt2.y - pt1.y) / num;

    const float _zLen = (pt2.z - pt1.z) / num;

 

   glLineWidth(1.0f);

   glLineStipple(1, 0x0303);//线条样式

 

    glBegin(GL_LINES);

    glEnable(GL_LINE_SMOOTH);

    //glColor3f(0.0f,0.0f, 1.0f); //白色线条

 

    int xi = 0;

    int yi = 0;

    int zi = 0;

 

    //绘制平行于X的直线

    for (zi = 0; zi <= num; zi++)

    {

        float z = _zLen * zi + pt1.z;

 

        for (yi = 0; yi <= num; yi++)

        {

            float y = _yLen * yi +pt1.y;

 

           glVertex3f(pt1.x, y, z);

           glVertex3f(pt2.x, y, z);

        }

    }

    //绘制平行于Y的直线

    for (zi = 0; zi <= num; zi++)

    {

        float z = _zLen * zi + pt1.z;

 

        for (xi = 0; xi <= num; xi++)

        {

            float x = _xLen * xi +pt1.x;

 

           glVertex3f(x, pt1.y, z);

           glVertex3f(x, pt2.y, z);

        }

    }

    //绘制平行于Z的直线

    for (yi = 0; yi <= num; yi++)

    {

        float y = _yLen * yi + pt1.y;

        

        for (xi = 0; xi <= num; xi++)

        {

            float x = _xLen * xi +pt1.x;

            

           glVertex3f(x, y, pt1.z);

           glVertex3f(x, y, pt2.z);

        }

    }

   

 

    glEnd();

}

2、坐标轴建立函数

void CMyStatic::GLDrawSpaceAxes(void)

{

GLUquadricObj *objCylinder =gluNewQuadric();

glPushMatrix();

glColor3f(1.0f,1.0f, 1.0f);

glutSolidSphere(0.25,6,6); 

glColor3f(0.0f,0.0f, 1.0f);

gluCylinder(objCylinder,0.1, 0.1, AXES_LEN, 10, 5);         //Z

glTranslatef(0,0,AXES_LEN);

gluCylinder(objCylinder,0.3, 0.0, 0.6, 10, 5);                 //Z

glPopMatrix();

 

glPushMatrix();

glTranslatef(0,0.5,AXES_LEN);

glRotatef(90,0.0,1.0,0.0);

GLPrint("Z");                                               // Print GL Text ToThe Screen

glPopMatrix();

 

 

glPushMatrix();

glColor3f(0.0f,1.0f, 0.0f);

glRotatef(-90,1.0,0.0,0.0);

gluCylinder(objCylinder,0.1, 0.1, AXES_LEN, 10, 5);         //Y

glTranslatef(0,0,AXES_LEN);

gluCylinder(objCylinder,0.3, 0.0, 0.6, 10, 5);                 //Y

glPopMatrix();

 

glPushMatrix();

glTranslatef(0.5,AXES_LEN,0);

GLPrint("Y");                                               // Print GL Text ToThe Screen

glPopMatrix();

 

 

glPushMatrix();

glColor3f(1.0f,0.0f, 0.0f);

glRotatef(90,0.0,1.0,0.0);

gluCylinder(objCylinder,0.1, 0.1, AXES_LEN, 10, 5);         //X

glTranslatef(0,0,AXES_LEN);

gluCylinder(objCylinder,0.3, 0.0, 0.6, 10, 5);                 //X

glPopMatrix();

 

glPushMatrix();

glTranslatef(AXES_LEN,0.5,0);

GLPrint("X");                                               // Print GL Text ToThe Screen

glPopMatrix();

 

}

 

3、三维坐标网格实现

#define AXES_LEN 10 //坐标轴长

void CMyStatic::GLDrawCubeCoordinates(void)

 {

/*****网格绘制*****/

/*****使用颜色混合来消除一些锯齿, 主要针对点和线

以及不相互重叠的多边形的反锯齿。*****/

glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);

glEnable(GL_BLEND);

glEnable(GL_POINT_SMOOTH);                   //设置反走样

glHint(GL_POINT_SMOOTH_HINT,GL_NICEST);       //设置反走样

glEnable(GL_LINE_SMOOTH);

glHint(GL_LINE_SMOOTH_HINT,GL_NICEST);

glEnable(GL_POLYGON_SMOOTH);

glHint(GL_POLYGON_SMOOTH_HINT,GL_NICEST);

//绘制立体坐标系

GLUquadricObj *objCylinder =gluNewQuadric();

glRotatef(-45,0.0,1.0,0.0);

//确定坐标系原点

glPushMatrix();

glColor3f(1.0f,1.0f, 1.0f);

glTranslatef(-5,0,-5);

glutSolidSphere(0.2,20,20);

//glutSolidTorus(0.2,1,10,10);圆环

glPopMatrix();

//画网格线

coordpoint cpoint1 = {-5,0,-5};

coordpoint cpoint2 = {5,0,5};

glColor3f(0.9f,0.9f,0.9f);

GLGrid(cpoint1,cpoint2,10);

//画网格线

 

 

glPushMatrix();

{

    glRotatef(90,1.0,0.0,0.0);

    glTranslatef(0.0f,-5,-5);

    coordpoint cpoint3 ={-5,00,-5};

    coordpoint cpoint4 = {5,00,5};

    glColor3f(0.9f,0.9f,0.0f);

    GLGrid(cpoint3,cpoint4,10);

 

    //半透明绘制

    //glDepthMask(GL_FALSE);

    //glColor3f(0.3,0.3,0.0);

    //glTranslatef(0.0,5,0.0);

    //glutSolidSphere(2,20,20);

    //glDepthMask(GL_TRUE);

}

glPopMatrix();

//画网格线

 

glPushMatrix();

glRotatef(90,0.0,0.0,1.0);

glTranslatef(5,5,-0);

coordpoint cpoint5 ={-5,0,-5};

coordpoint cpoint6 = {5,0,5};

glColor3f(0.0f,0.9f,0.0f);

GLGrid(cpoint5,cpoint6,10);

glPopMatrix();

 

//画坐标轴

glPushMatrix();

glColor3f(0.0f, 1,0.0f);

glTranslatef(-5,0,-5);

gluCylinder(objCylinder,0.05, 0.05, AXES_LEN, 10, 5);           //X

glTranslatef(0,0,AXES_LEN);

gluCylinder(objCylinder,0.2, 0.0, 0.5, 10, 5);                 //X

glPopMatrix();

 

glPushMatrix();

glTranslatef(-5,0,-5);

glTranslatef(0,0.2,AXES_LEN);

glRotatef(90,0.0,1.0,0.0);

GLPrint("X");                                               // Print GL Text ToThe Screen

glPopMatrix();

 

//画坐标轴

glPushMatrix();

glColor3f(1, 0,0.0f);

glTranslatef(-5,0,-5);

glRotatef(90,0.0,1.0,0.0);

gluCylinder(objCylinder,0.05, 0.05, AXES_LEN, 10, 5);           //Y

glTranslatef(0,0,AXES_LEN);

gluCylinder(objCylinder,0.2, 0.0, 0.5, 10, 5);                 //Y

glPopMatrix();

 

glPushMatrix();

glTranslatef(-5,0,-5);

glRotatef(90,0.0,1.0,0.0);

glTranslatef(0,0.2,AXES_LEN);

glRotatef(90,0.0,1.0,0.0);

GLPrint("Y");                                               // Print GL Text ToThe Screen

glPopMatrix();

 

//画坐标轴

glPushMatrix();

glColor3f(1, 1,0.0f);

glTranslatef(-5,0,-5);

glRotatef(-90,1.0,0.0,0.0);

gluCylinder(objCylinder,0.05, 0.05, AXES_LEN, 10, 5);           //Z

glTranslatef(0,0,AXES_LEN);

gluCylinder(objCylinder,0.2, 0.0, 0.5, 10, 5);                 //Z

glPopMatrix();

 

glPushMatrix();

glTranslatef(-5,0,-5);

glRotatef(-90,1.0,0.0,0.0);

glTranslatef(0.0,0.6,AXES_LEN);

glRotatef(90,0.0,1.0,0.0);

glRotatef(90,0.0,0.0,1.0);

GLPrint("Z");                                               // Print GL Text ToThe Screen

glPopMatrix();

 

 

/*****取消反锯齿*****/

glDisable(GL_BLEND);

glDisable(GL_LINE_SMOOTH);

glDisable(GL_POINT_SMOOTH);

glDisable(GL_POLYGON_SMOOTH);

 }

 

4、效果图


猜你喜欢

转载自blog.csdn.net/Cracent/article/details/51049416
今日推荐