计算机图形学(OPENGLnbsp;的nbsp;NOTE)

编程入门 行业动态 更新时间:2024-10-09 12:28:21

<a href=https://www.elefans.com/category/jswz/34/1770118.html style=计算机图形学(OPENGLnbsp;的nbsp;NOTE)"/>

计算机图形学(OPENGLnbsp;的nbsp;NOTE)

 

计算机图形学学完了,做一个NOTE。图形学的书可是有三厘米厚,不过讲的还行,是美国人赫恩写的,有中文翻译,适合作为教材,只是内容有点多,并且对于本科生的要求,有点课时不够多。

计算机图形学  学习网站:xie_zi的博客;.html;

.html;.html

关于codebloks的配置:=183620

 

计算机图形学OPENGL程序框架:

 

 

#include <windows.h>

 #include <stdio.h>

 #include<gl/glut.h>

 #include <gl/gl.h>

 

float width =300, high=300;

float xmin=-100,xmax=100,ymin=-100,ymax=100,dnear=-100,dfar=100;

float x0=0, y0=0;

float red=1,green=0,blue=0;

float xpos=0,ypos=0,zpos=-100,lx=0,ly=0,lz=100;

float anglex=0,angley=0,anglez=0,movex=0,movey=0,movez=0;

 

void init(){

  glClearColor(1,1,1,0);

 

  glViewport(x0,y0,width,high);

 

  glMatrixMode(GL_PROJECTION);

  glLoadIdentity();

 

  glOrtho(xmin,xmax,ymin,ymax,dnear,dfar);

 

  glMatrixMode(GL_MODELVIEW);

  glLoadIdentity();

 

  glEnable(GL_DEPTH_TEST);

  glShadeModel(GL_SMOOTH);

 

}

 

void Render(){

    glutSolidCube(80);

}

void display(){

   glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

 

   gluLookAt(xpos,ypos,zpos,

             lx,ly,lz,

             0,1,0);

 

   glColor3f(red,green,blue);

 

   glRotatef(anglex,1,0,0);

   glRotatef(angley,0,1,0);

   glRotatef(anglez,0,0,1);

 

   glTranslatef(movex,movey,movez);

 

   glPushMatrix();

   Render();

   glPopMatrix();

 

   glutSwapBuffers();

}

void idle(){

 

  glutPostRedisplay();

}

void menuEvent(int option){

    switch(option){

    case 1:   break;

    case 2:  break;

    }

 

    glutPostRedisplay();

}

void menu(){

   int menu,submenu;

 

  submenu=glutCreateMenu(menuEvent);

  glutAddMenuEntry("选择2", 2);

 

   menu=glutCreateMenu(menuEvent);

   glutAddMenuEntry("选择1", 1);

   glutAddSubMenu("子菜单1", submenu);

 

   glutAttachMenu(GLUT_RIGHT_BUTTON);

   glutPostRedisplay();

}

void normalkey(unsigned char key,int x,int y){

     if(key==27)

     exit(0);

 

     glutPostRedisplay();

 

}

void SpecialKey(int key, int x, int y){

    //if(key==GLUT_KEY_LEFT|GLUT_KEY_DOWN|GLUT_KEY_F1|GLUT_KEY_INSERT|GLUT_KEY_PAGE_UP)

 

   glutPostRedisplay();

}

void mouse (int button,int state ,int x,int y){

    if(button==GLUT_RIGHT_BUTTON &&state==GLUT_DOWN)

 

    glutPostRedisplay();

}

void motion(int x,int y){

 

   glutPostRedisplay();

}

void timer(int value){

    glutPostRedisplay();

    glutTimerFunc(100,timer,0);

 

}

int main(int  argc, char **argv){

    glutInit(&argc, argv);

    glutInitDisplayMode(GLUT_RGB| GLUT_DOUBLE| GLUT_DEPTH);

    glutInitWindowPosition(100,100);

    glutInitWindowSize(width,high);

    glutCreateWindow("simple program!");

 

    init();

    glutDisplayFunc(display);

//    glutIdleFunc(idle);

//    glutKeyboardFunc(normalkey);   //键盘控制

//    glutSpecialFunc(specialkey);

//    glutMotionFunc(motion);    //鼠标控制

//    glutMouseFunc(mouse);

//    glutTimerFunc(100,timer,0); //时钟控制

//    menu();   //子菜单控制

//    printf("动画说明:");

    glutMainLoop();

}

=================================

加一个全能小车

 

 #include <windows.h>

 #include <gl/glut.h>

 #include <gl/gl.h>

 #include <math.h>

 #include <iostream>

 #include <stdlib.h>

 

 #ifdef __APPLE__

 #include <OpenGL/OpenGL.h>

 #include <GLUT/glut.h>

 #else

 #include <GL/glut.h>

 #endif

 

 #include "imageloader.h"

 

 using namespace std;

 float xRot = 0.0f;

 float yRot = 0.0f;

 

 float width=300, high=300;

 float xmin=-100,xmax=100, ymin=-100, ymax=100, dnear =-100, dfar =100;

 

 float anglex=0, angley=0, anglez=0;

 

 float red =0,green =0, blue =0;

 bool mouseisdown =false;

 

 float x=0,y=0,z=0, lx=0,ly=0,lz=-1;

 

 void init(){

 

  glClearColor(0.8,0.8,0.8,0);

 

  glMatrixMode(GL_PROJECTION);

  glLoadIdentity();

 

  glViewport(0,0, width ,high);

 

     glOrtho(xmin,xmax, ymin, ymax,dnear,dfar);

 

  glMatrixMode(GL_MODELVIEW);

     glLoadIdentity();

 

  glEnable(GL_DEPTH_TEST);

  glShadeModel(GL_SMOOTH);

 }

 GLuint loadTexture(Image * image) {  //装载图像,获得纹理图像

  GLuint textureId ;

  glGenTextures(1, &textureId); //分配编号

  glBindTexture(GL_TEXTURE_2D, textureId); //指定当前所使用的纹理对象

  //载入纹理

  glTexImage2D(GL_TEXTURE_2D,

  0,

  GL_RGB,

  image->width, image->height,

  0,

  GL_RGB,

  GL_UNSIGNED_BYTE,

 

  image->pixels);

  return textureId; //返回纹理编号

 }

 

 GLuint _textureId; //The id of the texture

 

 void initRendering() {  //获得图像

  glEnable(GL_DEPTH_TEST);

 // glEnable(GL_LIGHTING);

 // glEnable(GL_LIGHT0);

  //glEnable(GL_NORMALIZE);   //法向量

  //glEnable(GL_COLOR_MATERIAL);

 

  Image* image = loadBMP("F:/C++programs/20121229_light/caodi.bmp"); //图片路径:还必须是24位图

  _textureId = loadTexture(image);

  delete image;

 }

 void Car(){

 

       glPushMatrix();

     glEnable(GL_TEXTURE_2D);

  initRendering();

 

     glEnable(GL_TEXTURE_2D);

  glBindTexture(GL_TEXTURE_2D, _textureId);

 

  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

 

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

  glBegin(GL_QUADS);

  glNormal3f(0.0f, 0.0f, 1.0f);

     glTexCoord2f(0.0f, 0.0f);

  glVertex3f(-100.0f, -100.0f, -100.0f);

  glTexCoord2f(1.0f, 0.0f);

  glVertex3f(100.0f, -100.0f, 100.0f);

  glTexCoord2f(1.0f, 1.0f);

  glVertex3f(100.0f, 100.0f, 100.0f);

  glTexCoord2f(0.0f, 1.0f);

  glVertex3f(-100.0f, 100.0f, 100.0f);

  glEnd();

  glPopMatrix();

  //车下半部

 

  glBegin(GL_POLYGON); //后

  glVertex3f(-40.0f,0.0f,15.0f);

  glVertex3f(40.0f,0.0f,15.0f);

  glVertex3f(40.0f,-15.0f,15.0f);

  glVertex3f(-40.0f,-15.0f,15.0f);

  glEnd();

  glBegin(GL_POLYGON);  //右

  // glColor3f(0.3, 0.2, 0.5);

  glVertex3f(40.0f,0.0f,-15.0f);

  glVertex3f(40.0f,0.0f,15.0f);

  glVertex3f(40.0f,-15.0f,15.0f);

  glVertex3f(40.0f,-15.0f,-15.0f);

  glEnd();

  glBegin(GL_POLYGON);  //左

  //glColor3f(0.3, 0.1, 0.3);

  glVertex3f(-40.0f,0.0f,-15.0f);

  glVertex3f(-40.0f,0.0f,15.0f);

  glVertex3f(-40.0f,-15.0f,15.0f);

  glVertex3f(-40.0f,-15.0f,-15.0f);

  glEnd();

     glBegin(GL_POLYGON);// 前

  // glColor3f(0.1, 0.1, 0.8);

  glVertex3f(-40.0f,0.0f,-15.0f);

  glVertex3f(40.0f,0.0f,-15.0f);

  glVertex3f(40.0f,-15.0f,-15.0f);

  glVertex3f(-40.0f,-15.0f,-15.0f);

  glEnd();

  glBegin(GL_POLYGON);  //上

  //glColor3f(0, 0, 1);

  glVertex3f(-40.0f,0.0f,15.0f);

  glVertex3f(-40.0f,0.0f,-15.0f);

  glVertex3f(40.0f,0.0f,-15.0f);

  glVertex3f(40.0f,0.0f,15.0f);

  glEnd();

  glBegin(GL_POLYGON);   //下

  //glColor3f(0.8, 0.5, 0.2);

  glVertex3f(-40.0f,-15.0f,15.0f);

  glVertex3f(-40.0f,-15.0f,-15.0f);

  glVertex3f(40.0f,-15.0f,-15.0f);

  glVertex3f(40.0f,-15.0f,15.0f);

  glEnd();

 

  //车上半部

  glBegin(GL_POLYGON);

  //glColor3f(0, 0, 1);  //里侧面

  glVertex3f(-20.0f,0.0f,15.0f);

  glVertex3f(-10.0f,10.0f,15.0f);

  glVertex3f(20.0f,10.0f,15.0f);

  glVertex3f(25.0f,0.0f,15.0f);

  glEnd();

  glBegin(GL_POLYGON);

  // glColor3f(0, 0, 1);   //外侧面

  glVertex3f(-20.0f,0.0f,-15.0f);

  glVertex3f(-10.0f,10.0f,-15.0f);

  glVertex3f(20.0f,10.0f,-15.0f);

  glVertex3f(25.0f,0.0f,-15.0f);

  glEnd();

  glBegin(GL_POLYGON);

  // glColor3f(0, 1, 1);  //上顶面

      glVertex3f(-10.0f,10.0f,15.0f);

      glVertex3f(-10.0f,10.0f,-15.0f);

  glVertex3f(20.0f,10.0f,-15.0f);

  glVertex3f(20.0f,10.0f,15.0f);

  glEnd();

     glBegin(GL_POLYGON);  //左侧面

 

      glVertex3f(-10.0f,10.0f,15.0f);

  glVertex3f(-20.0f,0.0f,15.0f);

  glVertex3f(-20.0f,0.0f,-15.0f);

      glVertex3f(-10.0f,10.0f,-15.0f);

  glEnd();

  glBegin(GL_POLYGON);  //右侧面

 

  glVertex3f(20.0f,10.0f,15.0f);

  glVertex3f(20.0f,10.0f,-15.0f);

  glVertex3f(25.0f,0.0f,-15.0f);

  glVertex3f(25.0f,0.0f,15.0f);

  glEnd();

  //车轮

  glColor3f(1, 0, 0);

  glTranslated(-20.0f,-15.0f,15.0f);

     glutSolidTorus(2,5, 5,100);

 

  glTranslated(0.0f,0.0f,-30.0f);

     glutSolidTorus(2,5,5,100);

 

  glTranslated(45.0f,0.0f,0.0f);

     glutSolidTorus(2,5,5,100);

 

  glTranslated(0.0f,0.0f,30.0f);

     glutSolidTorus(2,5,5,100);

     glLoadIdentity();

 

 

 

 }

 void Display(void)

 {   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

       gluLookAt(x,y,z,

           lx,ly,lz,

            0,1,0);

  glRotatef(xRot, 1.0f, 0.0f, 0.0f);  //绕x轴旋转

  glRotatef(yRot, 0.0f, 1.0f, 0.0f);  //绕y轴旋转

 

  glTranslatef(anglex, angley, anglez);

  glColor3f(red, green, blue);

  glPushMatrix();

  Car();

  glPopMatrix();

 

  glutSwapBuffers();   //交换缓冲

 }

 

 //定义键盘控制函数

 void SpecialKeys(int key, int x, int y)//上下左右键实现左右前后移动

 {   if(key == GLUT_KEY_UP) angley += 1.0f;

  if(key == GLUT_KEY_DOWN) angley -= 1.0f;

  if(key == GLUT_KEY_LEFT) anglex -= 1.0f;

  if(key == GLUT_KEY_RIGHT) anglex += 1.0f;

 

  glutPostRedisplay(); // 刷新窗口

 }

 

 void key(unsigned char key ,int x, int y){  //键盘r、g、b三个键可以改变轿车颜色

  switch(key){

  case 'r':

  case 'R': red=1;green=0; blue=0; break;

  case 'g':

  case 'G': red=0;green=1; blue=0; break;

  case 'b':

  case 'B': red=0;green=0; blue=1; break;

  }

  glutPostRedisplay();

 }

 

 void timer(int value ){

  if(yRot <=360 )  yRot++;

  else yRot=0;

  glutPostRedisplay();

  glutTimerFunc(20, timer ,0);

 }

  void mouse( int button ,int state, int x, int y){  //鼠标中键(一次)进行自动旋转

  if(button==GLUT_MIDDLE_BUTTON &&state == GLUT_DOWN )

    glutTimerFunc(20, timer, 0);

  glutPostRedisplay();

 }

 

 void motion(int x, int y){  //鼠标左键连续按下,实现颜色的变化

 

  if(x<0) red=1;

  else if(x>width) red=0;

  else red=1.0*((float) x)/width;

 

  if(y<0) green=1;

  else if(y>high) green=0;

  else green=1.0*((float) y)/high;

  blue =0;

  glutPostRedisplay();

 

 }

 void setLight(void)  //环境为黑,反射为白光

 {

     static const GLfloat light_position[] = {20.0f, 100.0f, -100.0f, 1.0f};

     static const GLfloat light_ambient[]  = {0.0f, 0.0f, 0.0f, 1.0f};

     static const GLfloat light_diffuse[]  = {1.0f, 1.0f, 1.0f, 1.0f};

     static const GLfloat light_specular[] = {1.0f, 1.0f, 1.0f, 1.0f};

 

     glLightfv(GL_LIGHT0, GL_POSITION, light_position);

     glLightfv(GL_LIGHT0, GL_AMBIENT,  light_ambient);

     glLightfv(GL_LIGHT0, GL_DIFFUSE,  light_diffuse);

     glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);

 

     glEnable(GL_LIGHT0);

     glEnable(GL_LIGHTING);

     glEnable(GL_DEPTH_TEST);

 }

 void setMatirial( GLfloat mat_shininess)//反射为白光,本身为灰色

 {

     static const GLfloat mat_specular[] = {1.0f, 1.0f, 1.0f, 1.0f};

     static const GLfloat mat_diffuse[] = {1.0f, 1.0f, 1.0f, 1.0f};

     static const GLfloat mat_emission[] = {0.0f, 0.0f, 0.0f, 1.0f};

 

     glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, mat_diffuse);

     glMaterialfv(GL_FRONT, GL_SPECULAR,  mat_specular);

     glMaterialfv(GL_FRONT, GL_EMISSION,  mat_emission);

     glMaterialf (GL_FRONT, GL_SHININESS, mat_shininess);

 }

 

 

 void menuEvents(int option){

  switch(option){

  case 1: ly -=0.1 ; break;

  case 2: ly +=0.1; break;

  case 3: lx -=0.1;  break;

  case 4: lx +=0.1;  break;

  case 5: red=1;green=1;blue=0; break;

  case 6: red=1; green=0; blue=1;break;

  case 7: {

     setLight();

     setMatirial(0.0);

  // 定义光源,它是一种白色的光源

 //    GLfloat sun_light_position[] = {100.0f, 100.0f, -100.0f, 1.0f};

 //    GLfloat sun_light_ambient[]  = {0.0f, 0.0f, 0.0f, 1.0f};

 //    GLfloat sun_light_diffuse[]  = {1.0f, 1.0f, 1.0f, 1.0f};

 //    GLfloat sun_light_specular[] = {1.0f, 1.0f, 1.0f, 1.0f};

 //

 //    glLightfv(GL_LIGHT0, GL_POSITION, sun_light_position);

 //    glLightfv(GL_LIGHT0, GL_AMBIENT,  sun_light_ambient);

 //    glLightfv(GL_LIGHT0, GL_DIFFUSE,  sun_light_diffuse);

 //    glLightfv(GL_LIGHT0, GL_SPECULAR, sun_light_specular);

 //

 //    glEnable(GL_LIGHT0);

 //    glEnable(GL_LIGHTING);

 //    glEnable(GL_DEPTH_TEST);

 

     // 定义材质并绘制

 //        GLfloat sun_mat_ambient[]  = {0.0f, 0.0f, 0.0f, 1.0f};

 //        GLfloat sun_mat_diffuse[]  = {0.0f, 0.0f, 0.0f, 1.0f};

 //        GLfloat sun_mat_specular[] = {0.0f, 0.0f, 0.0f, 1.0f};

 //        GLfloat sun_mat_emission[] = {0.0f, 0.3f, 0.0f, 1.0f};

 //        GLfloat sun_mat_shininess  = 0.0f;

 //

 //        glMaterialfv(GL_FRONT, GL_AMBIENT,   sun_mat_ambient);

 //        glMaterialfv(GL_FRONT, GL_DIFFUSE,   sun_mat_diffuse);

 //        glMaterialfv(GL_FRONT, GL_SPECULAR,  sun_mat_specular);

 //        glMaterialfv(GL_FRONT, GL_EMISSION,  sun_mat_emission);

 //        glMaterialf (GL_FRONT, GL_SHININESS, sun_mat_shininess);

 

         break;

     }

     case 8: {

         cout<<"hjkg"<<endl;

 //    glEnable(GL_TEXTURE_2D);

 //

 //    initRendering();

 //

 // glBindTexture(GL_TEXTURE_2D, _textureId);

 // //Bottom  底面平铺

 // glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

 // glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

         break;

     }

  }

  glutPostRedisplay();

 }

 void menu(){  //鼠标右键进行视角选择

  int menu ,submenu1,submenu2,submenu3;

 

  submenu1 = glutCreateMenu(menuEvents);

  glutAddMenuEntry("视角上移",1);

  glutAddMenuEntry("视角下移",2);

  glutAddMenuEntry("视角左移",3);

  glutAddMenuEntry("视角右移",4);

 

  submenu2= glutCreateMenu(menuEvents);

  glutAddMenuEntry("黄色",5);

  glutAddMenuEntry("紫色",6);

 

  menu = glutCreateMenu(menuEvents);

  glutAddSubMenu("视角改变",submenu1);

  glutAddSubMenu("颜色改变",submenu2);

  glutAddMenuEntry("光照材质设置",7);

  glutAddMenuEntry("添加纹理",8);

 

     glutAttachMenu(GLUT_RIGHT_BUTTON);

     glutPostRedisplay();

 }

 int main(int argc, char **argv )

 {   glutInit(&argc, argv);

  glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);

  glutInitWindowPosition(100,100);

  glutInitWindowSize(width, high);

  glutCreateWindow("车");

  init();

  menu();

  glutSpecialFunc(SpecialKeys);

  glutKeyboardFunc(key);

  glutMouseFunc(mouse);

  glutMotionFunc(motion);

  glutDisplayFunc(Display);

  glutMainLoop();

  return 0;

 }

更多推荐

计算机图形学(OPENGLnbsp;的nbsp;NOTE)

本文发布于:2024-02-28 01:52:04,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1767711.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:计算机   图形学   OPENGLnbsp   nbsp   NOTE

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!