帮酷LOGO
  • 显示原文与译文双语对照的内容
文章标签:Opengl 3  Opengl  glrotate  GLU  Glulookat  glr  


OpenGL3DNavigationDemo

介绍

我认为初学者最重要的一个步骤是学习如何创建 3D 空间并在这个空间中导航。 如何在 3D 空间中导航尤其重要。 对初学者来说可能会很混乱。 这里程序演示如何在 3D 空间中导航。

使用代码

基本代码来自 redbook"opengl编程指南( 第三版)"。 这是一个初学者级程序,展示如何在 3D 空间中导航。 它使用 glRotatef()glTranslatef()gluLookAt() 函数。 我把 3D 个空格划了。 x,y,z的交集是( 0,0,0 )的位置。 直线的doted部分是 axises.The z 轴的负面,因为我们看到了( 0,0,15 ) 坐标的空间。 我旋转 above 图片,以便能看到z 轴。

  • x 轴的绿色
  • y 轴的红色
  • 蓝色为z 轴
  • X,X - 在X 轴//上旋转使用 glRotatef() 函数
  • Y,Y - 在Y 轴旋转"
  • Z,Z - 在Z 轴旋转"
  • left_key - 转换为左( x 轴)//使用 glTranslatef()
  • right_key - 转换为右( x 轴)"
  • up_key - 转换( y 轴)"
  • down_key - 转换( y 轴)"
  • page_up - 平移z 轴( 放大)"
  • page_down - 平移z 轴( 缩小)"
  • J,J 表示x 轴//使用 glLookAt()
  • K,K 表示y 轴"
  • L,L 轴的平移"
  • B,B 在x 轴上旋转( +/- ) 90度
  • N,N 在y 轴上旋转( +/- ) 90度
  • M,M 轴旋转( +/- ) 90度
  • O,O 使一切变为默认( 起始坐标)

注意,glTranslatefgluLookAt()的行为相同。 但是,它并不是完全一样的。 你可以用这个程序算出。

#include"stdafx.h"#include<GL/glut.h>//Once you include glut.h (you don't need gl.h or glu.h) GLfloat X = 0.0f; // Translate screen to x direction (left or right)GLfloat Y = 0.0f; // Translate screen to y direction (up or down)GLfloat Z = 0.0f; // Translate screen to z direction (zoom in or out)GLfloat rotX = 0.0f; // Rotate screen on x axis GLfloat rotY = 0.0f; // Rotate screen on y axisGLfloat rotZ = 0.0f; // Rotate screen on z axisGLfloat rotLx = 0.0f; // Translate screen by using the glulookAt function (left or right)GLfloat rotLy = 0.0f; // Translate screen by using the glulookAt function (up or down)GLfloat rotLz = 0.0f; // Translate screen by using the glulookAt function (zoom in or out)void glDisplayLines(void); // Did declare the function // so I did not have to check for order of the functions// Initialize the OpenGL windowvoid init(void)
{
 glClearColor (0.0, 0.0, 0.0, 0.0); // Clear the color  glShadeModel (GL_FLAT); // Set the shading model to GL_FLAT glEnable (GL_LINE_SMOOTH);
 glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); // Set Line Antialiasing}// Draw the lines (x,y,z)void display(void)
{ 
 glClear (GL_COLOR_BUFFER_BIT); // Clear the Color Buffer  glPushMatrix(); // It is important to push the Matrix before calling // glRotatef and glTranslatef glRotatef(rotX,1.0,0.0,0.0); // Rotate on x glRotatef(rotY,0.0,1.0,0.0); // Rotate on y glRotatef(rotZ,0.0,0.0,1.0); // Rotate on z glTranslatef(X, Y, Z); // Translates the screen left or right, // up or down or zoom in zoom out// Draw the positive side of the lines x,y,z glBegin(GL_LINES);
 glColor3f (0.0, 1.0, 0.0); // Green for x axis glVertex3f(0,0,0);
 glVertex3f(10,0,0);
 glColor3f(1.0,0.0,0.0); // Red for y axis glVertex3f(0,0,0);
 glVertex3f(0,10,0);
 glColor3f(0.0,0.0,1.0); // Blue for z axis glVertex3f(0,0,0); 
 glVertex3f(0,0,10);
 glEnd();
 // Dotted lines for the negative sides of x,y,z glEnable(GL_LINE_STIPPLE); // Enable line stipple to use a // dotted pattern for the lines glLineStipple(1, 0x0101); // Dotted stipple pattern for the lines glBegin(GL_LINES); 
 glColor3f (0.0, 1.0, 0.0); // Green for x axis glVertex3f(-10,0,0);
 glVertex3f(0,0,0);
 glColor3f(1.0,0.0,0.0); // Red for y axis glVertex3f(0,0,0);
 glVertex3f(0,-10,0);
 glColor3f(0.0,0.0,1.0); // Blue for z axis glVertex3f(0,0,0);
 glVertex3f(0,0,-10);
 glEnd();
 glDisable(GL_LINE_STIPPLE); // Disable the line stipple glPopMatrix(); // Don't forget to pop the Matrix glutSwapBuffers();
}// This function is called whenever the window size is changedvoid reshape (int w, int h)
{
 glViewport (0, 0, (GLsizei) w, (GLsizei) h); // Set the viewport glMatrixMode (GL_PROJECTION); // Set the Matrix mode glLoadIdentity (); 
 gluPerspective(75, (GLfloat) w/(GLfloat) h, 0.10, 100.0);
 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity();
 gluLookAt (rotLx, rotLy, 15.0 + rotLz, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); 
}// This function is used for the navigation keysvoid keyboard (unsignedchar key, int x, int y)
{switch (key) { // x,X,y,Y,z,Z uses the glRotatef() functioncase'x': // Rotates screen on x axis  rotX -= 0.5f;
 break;
 case'X': // Opposite way  rotX += 0.5f;
 break;
 case'y': // Rotates screen on y axis rotY -= 0.5f;
 break;
 case'Y': // Opposite way rotY += 0.5f; 
 break; 
 case'z': // Rotates screen on z axis rotZ -= 0.5f;
 break;
 case'Z': // Opposite way rotZ += 0.5f;
 break;
 // j,J,k,K,l,L uses the gluLookAt function for navigationcase'j':
 rotLx -= 0.2f; 
 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity();
 gluLookAt (rotLx, rotLy, 15.0 + rotLz, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
 break;
 case'J':
 rotLx += 0.2f;
 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity();
 gluLookAt (rotLx, rotLy, 15.0 + rotLz, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
 break; 
 case'k':
 rotLy -= 0.2f;
 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity();
 gluLookAt (rotLx, rotLy, 15.0 + rotLz, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
 break;
 case'K':
 rotLy += 0.2f;
 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity();
 gluLookAt (rotLx, rotLy, 15.0 + rotLz, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
 break;
 case'l': // It has a special case when the rotLZ becomes // less than -15 the screen is viewed from the opposite side// therefore this if statement below does not allow rotLz be less than -15if(rotLz + 14> = 0)
 rotLz -= 0.2f; 
 glMatrixMode(GL_MODELVIEW); 
 glLoadIdentity(); 
 gluLookAt (rotLx, rotLy, 15.0 + rotLz, 0.0, 0.0, 0.0, 0.
 break;
 case'L':
 rotLz += 0.2f;
 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity();
 gluLookAt (rotLx, rotLy, 15.0 + rotLz, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
 break;
 case'b': // Rotates on x axis by -90 degree rotX -= 90.0f;
 break;
 case'B': // Rotates on y axis by 90 degree rotX += 90.0f; 
 break;
 case'n': // Rotates on y axis by -90 degree rotY -= 90.0f;
 break;
 case'N': // Rotates on y axis by 90 degree rotY += 90.0f;
 break;
 case'm': // Rotates on z axis by -90 degree rotZ -= 90.0f; 
 break;
 case'M': // Rotates on z axis by 90 degree rotZ += 90.0f;
 break;
 case'o': // Default, resets the translations vies from starting viewcase'O': 
 X = Y = 0.0f;
 Z = 0.0f;
 rotX = 0.0f;
 rotY = 0.0f;
 rotZ = 0.0f;
 rotLx = 0.0f;
 rotLy = 0.0f;
 rotLz = 0.0f;
 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity();
 gluLookAt(rotLx, rotLy, 15.0f + rotLz, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f); 
 break;
}
 glutPostRedisplay(); // Redraw the scene}// called on special key pressedvoid specialKey(int key, int x, int y) { // The keys below are using the gluLookAt() function for navigation// Check which key is pressedswitch(key) {
 case GLUT_KEY_LEFT : // Rotate on x axis X -= 0.1f;
 break;
 case GLUT_KEY_RIGHT : // Rotate on x axis (opposite) X += 0.1f;
 break;
 case GLUT_KEY_UP : // Rotate on y axis  Y += 0.1f;
 break;
 case GLUT_KEY_DOWN : // Rotate on y axis (opposite) Y -= 0.1f;
 break; 
 case GLUT_KEY_PAGE_UP: // Rotate on z axis Z -= 0.1f;
 break;
 case GLUT_KEY_PAGE_DOWN:// Rotate on z axis (opposite) Z += 0.1f;
 break;
}
 glutPostRedisplay(); // Redraw the scene}// Main entry point of the programint main(int argc, char** argv)
{
 glutInit(&argc, argv);
 glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); // Setup display mode to // double buffer and RGB color glutInitWindowSize (600,600); // Set the screen size glutCreateWindow("OpenGL 3D Navigation Program"); 
 init ();
 glutReshapeFunc(reshape); 
 glutDisplayFunc(display); 
 glutKeyboardFunc(keyboard); // set window's key callback  glutSpecialFunc(specialKey); // set window's to specialKey callback glutMainLoop();
 return0;
} 


文章标签:Opengl  GLU  Opengl 3  glrotate  Glulookat  glr  

Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备05059198号-3  |  如果智培  |  酷兔英语