当前位置: 代码迷 >> VC/MFC >> ,opengl编程,建立三维坐标系,总是出错
  详细解决方案

,opengl编程,建立三维坐标系,总是出错

热度:132   发布时间:2016-05-02 03:46:53.0
求助,opengl编程,建立三维坐标系,总是出错
想用opengl编程,建立一个三维坐标系,但总是创建出错,不知为什么,我是新手,哪位帮帮忙。我的代码如下:
GLvoid ReSizeGLScene(GLsizei width, GLsizei height) // Resize And Initialize The GL Window
{
if (height==0) // Prevent A Divide By Zero By
{
height=1; // Making Height Equal One
}

glViewport(0,0,width,height); // Reset The Current Viewport

glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
glLoadIdentity(); // Reset The Projection Matrix

// Calculate The Aspect Ratio Of The Window
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);

glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
glLoadIdentity(); // Reset The Modelview Matrix
}

int InitGL(GLvoid) // All Setup For OpenGL Goes Here
{
glShadeModel(GL_SMOOTH); // Enable Smooth Shading
glClearColor(1.0f, 1.0f, 1.0f, 1.0f); // Black Background
glClearDepth(1.0f); // Depth Buffer Setup
glEnable(GL_DEPTH_TEST); // Enables Depth Testing
glDepthFunc(GL_LEQUAL); // The Type Of Depth Testing To Do
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective Calculations
return TRUE; // Initialization Went OK
}

int DrawGLScene(GLvoid) // Here's Where We Do All The Drawing
{   GLfloat w;
    w = 3.0;
     glLineWidth(w);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer
glLoadIdentity(); // Reset The Current Modelview Matrix
glTranslatef(-0.5f,0.0f,-6.0f);
//--------------------------------------
   glBegin(GL_LINES);  //坐标系x轴
      glColor3f(1.0, 0.0, 0.0);
      glVertex3f(0.0, 0.0, 0.0);
      glVertex3f(2.0, 0.0, 0.0);
     glEnd();
     glBegin(GL_LINES);  //坐标系Y轴
 glColor3f(0.0, 1.0, 0.0);
 glVertex3f(0.0, 0.0, 0.0);
 glVertex3f(0.0, 2.0, 0.0);
     glEnd();
     glBegin(GL_LINES);  //坐标系Z轴
 glColor3f(0.0, 0.0, 1.0);
glVertex3f(0.0, 0.0, 0.0);
glVertex3f(0.0, 0.0, 5.0);
// glVertex3f(0.0, 0.0, 5.0);
    glEnd();

//-----------------------------------------
return TRUE; // Everything Went OK
}
结果是坐标系如下:
                    | Y
                    |
                    |
  Z -----------|-----------------X

------解决思路----------------------

void DrawKoordSystem (GLfloat xmin, GLfloat xmax, GLfloat ymin, GLfloat ymax,
GLfloat zmin, GLfloat zmax)
{
    GLfloat i;
GLfloat akt_color[4];
GLint akt_mode;
// spitze // arrow
GLUquadricObj *spitze = gluNewQuadric();
if (!spitze) return; 

glPushAttrib(GL_ALL_ATTRIB_BITS);
glGetFloatv(GL_CURRENT_COLOR, akt_color);
glDisable (GL_LIGHTING);
// X segemnts
glBegin(GL_LINES);

glColor3f ( 1.0, 0.0, 0.0 );
glVertex3f (xmin,0,0);
glVertex3f (xmax,0,0);
for (i = xmin; i <= xmax; i++)
{
glVertex3f(i, -0.15, 0.0);
glVertex3f(i, 0.15, 0.0);
}
// Y segments
glColor3f ( 0.0, 1.0, 0.0 );
glVertex3f (0,ymin,0);
glVertex3f (0,ymax,0);

for (i = ymin; i <= ymax; i++)
{
glVertex3f (-0.15, i, 0.0);
glVertex3f (0.15, i, 0.0);
}
// Z segments
glColor3f ( 0.0, 0.0, 1.0 );
glVertex3f (0,0,zmin);
glVertex3f (0,0,zmax);

for (i = zmin; i <= zmax; i++)
{
glVertex3f(-0.15, 0.0, i);
glVertex3f(0.15, 0.0, i);
}

glEnd();
// Ende Linienpaare // end scale segments
glGetIntegerv(GL_MATRIX_MODE, &akt_mode);
glMatrixMode(GL_MODELVIEW);
// zuerst die X-Achse // arrow first X-axis
glPushMatrix();
glTranslatef(xmax, 0., 0.);
glRotatef(90., 0., 1., 0.);
glColor3f( 1.0, 0.0, 0.0 );// red
gluCylinder(spitze, 0.12, 0., 1., 10, 10);
glPopMatrix();

// dann die Y-Achse // then Y-axis
glPushMatrix();
glTranslatef(0., ymax, 0.);
glRotatef(-90., 1., 0., 0.);
glColor3f( 0.0, 1.0, 0.0 );// green
gluCylinder(spitze, 0.12, 0., 1., 10, 10);
glPopMatrix();

// zum Schluss die Z-Achse // at last Z-axis
glPushMatrix();
glTranslatef(0., 0., zmax);
glColor3f( 0.0, 0.0, 1.0 );// blue
gluCylinder(spitze, 0.12, 0., 1., 10, 10);
glPopMatrix();
//
glMatrixMode(akt_mode);
glColor4fv(akt_color);
glPopAttrib();

gluDeleteQuadric(spitze);
}


DrawKoordSystem (-5, 5, -5, 5, -5, 5);