OPENGL (动画,光照,纹理)

1、黑环境的灰球的白光 效果
  #include <windows.h>
  #include <gl/glut.h>
  #include <gl/gl.h>
  #include <math.h>
 
  float width=300, high=300;
  float xmin=-100,xmax=100, ymin=-100, ymax=100, dnear =-100, dfar =100;
 
  void init(){
 
  glClearColor(0,0,0,1);
 
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
 
  glViewport(0,0, width ,high);
 
      glOrtho(xmin,xmax, ymin, ymax,dnear,dfar);
 
  glMatrixMode(GL_MODELVIEW);
 
  glEnable(GL_DEPTH_TEST);
  glShadeModel(GL_SMOOTH);
  }
  void Car(){
      glutSolidSphere(20,20,10);
  }
  void setLight(void)
  {
      static const GLfloat light_position[] = {100.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(const GLfloat mat_diffuse[4], GLfloat mat_shininess)
  {
      static const GLfloat mat_specular[] = {1.0f, 1.0f, 1.0f, 1.0f};
      static const GLfloat mat_emission[] = {0.1f, 0.1f, 0.1f, 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 myDisplay(void)
  {
      // 定义一些材质颜色
      const static GLfloat red_color[] = {1.0f, 0.0f, 0.0f, 1.0f};
      const static GLfloat green_color[] = {0.0f, 1.0f, 0.0f, 1.0f};
      const static GLfloat blue_color[] = {0.0f, 0.0f, 1.0f, 1};
      const static GLfloat white_color[] = {1.0f, 1.0f, 1.0f, 1.0f};
      const static GLfloat black_color[] = {0.0f, 0.0f, 0.0f, 1.0f};
 
      // 清除屏幕
      glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
      // 设置光源
      setLight();
 
      // 绘制一个不透明黑色球体
      setMatirial(black_color, 0.0);
      glPushMatrix();
  //     glTranslatef(0.0f, 0.0f, 0.5f);
      glutSolidSphere(50, 20, 20);
      glPopMatrix();
 
      glutSwapBuffers();
  }
 
  int main(int argc, char **argv )
  {   glutInit(&argc, argv);
  glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  glutInitWindowPosition(100,100);
  glutInitWindowSize(width, high);
  glutCreateWindow("光照");
 
  init();
  glutDisplayFunc(myDisplay);
  glutMainLoop();
  return 0;
  }
OPENGL <wbr>(动画,光照,纹理)

  =============================================================
  2、机器人的动画及光照

  #include <windows.h>
  #include <gl/glut.h>
  #include <gl/gl.h>
  #include <math.h>
 
  float width =300, high=300;
  float xmin=-5,xmax=5,ymin=-5,ymax=5,dnear=-5,dfar=5;
  float x0=0, y0=0;
  float red=0,green=1,blue=0;
  float xpos=0,ypos=0,zpos=-5,lx=0,ly=0,lz=5;
  float anglex=0,angley=0,anglez=0,movex=0,movey=0,movez=0;
 
  float angle1=15,angle2=15;
 
  void init(){
    glClearColor(0,0,0,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 robate(){
  //头
  glPushMatrix();
  glTranslatef(0,3,0);
  glutWireSphere(0.6,20,20);
  glPopMatrix();
 
  //身体
  glPushMatrix();
      glTranslatef(0,0.9,0);
  glScalef(1, 1.2f, 0.5);
  glutSolidCube(2.5);
  glPopMatrix();
  //两肢
  glPushMatrix();
      glTranslatef(-1.7,0.2,0);
  glScalef(0.3, 0.8, 0.5);
  glRotatef(angle2, 1,0,0);
  glutSolidCube(2.5);
  glPopMatrix();
 
  glPushMatrix();
      glTranslatef(1.7,0.2,0);
  glScalef(0.3, 0.8, 0.5);
  glRotatef(angle1, 1,0,0);
  glutSolidCube(2.5);
  glPopMatrix();
  //双腿
 
  glPushMatrix();
      glTranslatef(-0.6,-2.3,0);
  glScalef(0.3, 1.2, 0.5);
  glRotatef(angle1, 1,0,0);
  glutSolidCube(2.5);
  glPopMatrix();
 
  glPushMatrix();
      glTranslatef(0.6,-2.3,0);
  glScalef(0.3, 1.2, 0.5);
  glPushMatrix();
  glRotatef(angle2, 1,0,0);
  glutSolidCube(2.5);
  glPopMatrix();
  glPopMatrix();
 
  }
  void setLight(void)
  {
      static const GLfloat light_position[] = {100.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(const GLfloat mat_diffuse[4], GLfloat mat_shininess)
  {
      static const GLfloat mat_specular[] = {1.0f, 1.0f, 1.0f, 1.0f};
      static const GLfloat mat_emission[] = {0.1f, 0.1f, 0.1f, 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 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);
 
      // 设置光源
      setLight();
 
      // 绘制一个不透明体
      const static GLfloat green_color[] = {0.0f, 1.0f, 0.0f, 1.0f};
      setMatirial(green_color, 0.0);
 
    glPushMatrix();
    robate();
    glPopMatrix();
 
    glutSwapBuffers();
  }
 
  void timer(int value){
      bool leg1=true;
  bool leg2=true;
 
  if(leg1)
  angle1+=0.1;
  else angle1-=0.1;
  if(angle1>=15) leg1=false;
  if(angle1<=-15) leg1=true;
 
  if(leg2)
  angle2-=0.1;
  else angle2+=0.1;
  if(angle2<=15) leg1=false;
  if(angle2>=-15) leg1=true;
 
      glutPostRedisplay();
      glutTimerFunc(300,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("机器人动画与光照!");
 
      init();
      glutDisplayFunc(display);
    glutTimerFunc(300,timer,0); //时钟控制
      printf("动画说明:");
      glutMainLoop();
 
  }
OPENGL <wbr>(动画,光照,纹理)

  =============================================================
3、纹理
需加载imageloader.h , imageloader.cpp , 24位图 caodi.bmp, 最后写main.cpp
#include <windows.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;
 
  //Makes the image into a texture, and returns the id of the texture
  GLuint loadTexture(Image* image) {   //装载图像
  GLuint textureId;
  glGenTextures(1, &textureId); //Make room for our texture
  glBindTexture(GL_TEXTURE_2D, textureId); //Tell OpenGL which texture to edit
  //Map the image to the texture
  glTexImage2D(GL_TEXTURE_2D,                 //Always GL_TEXTURE_2D
  0,                             //0 for now
  GL_RGB,                       //Format OpenGL uses for image
  image->width, image->height,   //Width and height
  0,                             //The border of the image
  GL_RGB, //GL_RGB, because pixels are stored in RGB format
  GL_UNSIGNED_BYTE, //GL_UNSIGNED_BYTE, because pixels are stored
                    //as unsigned numbers
  image->pixels);               //The actual pixel data
  return textureId; //Returns the id of the texture
  }
 
  GLuint _textureId; //The id of the texture
 
  void initRendering() {   //获得图像
  glEnable(GL_DEPTH_TEST);
  glEnable(GL_NORMALIZE);
  glEnable(GL_COLOR_MATERIAL);
 
  Image* image = loadBMP("F:/C++programs/wenli_1230/caodi.bmp"); //图片路径:还必须是24位图
  _textureId = loadTexture(image);
  delete image;
  }
 
  void handleResize(int w, int h) { //重新定义大小
  glViewport(0, 0, w, h);
 
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
 
  gluPerspective(45.0, (float)w / (float)h, 1.0, 200.0);
  }
  void Car(){
  glutSolidCube(10);
 
  }
  void drawScene() {
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
  glMatrixMode(GL_MODELVIEW);
      glLoadIdentity();
 
  glTranslatef(0.0f, 1.0f, -6.0f);
 
 
  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(1.0f, 0.2f, 0.2f);
  glBegin(GL_QUADS);
  glNormal3f(0.0, 1.0f, 0.0f);
  glTexCoord2f(0.0f, 0.0f);
  glVertex3f(-2.5f, -2.5f, 2.5f);
  glTexCoord2f(1.0f, 0.0f);
  glVertex3f(2.5f, -2.5f, 2.5f);
  glTexCoord2f(1.0f, 1.0f);
  glVertex3f(2.5f, -2.5f, -2.5f);
  glTexCoord2f(0.0f, 1.0f);
  glVertex3f(-2.5f, -2.5f, -2.5f);
  glEnd();
 
  //Left   左边的咖啡色方形
  glDisable(GL_TEXTURE_2D);
  glColor3f(1.0f, 0.7f, 0.3f);
  glBegin(GL_QUADS);
 
  glNormal3f(1.0f, 0.0f, 0.0f);
  glVertex3f(-2.5f, -2.5f, 2.5f);
  glVertex3f(-2.5f, -2.5f, -2.5f);
  glVertex3f(-2.5f, 2.5f, -2.5f);
  glVertex3f(-2.5f, 2.5f, 2.5f);
 
  glEnd();
  glutSwapBuffers();
  }
 
  int main(int argc, char** argv) {
  glutInit(&argc, argv);
  glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  glutInitWindowSize(400, 400);
 
  glutCreateWindow("Textures - videotutorialsrock.com");
  initRendering();
 
  glutDisplayFunc(drawScene);
  glutReshapeFunc(handleResize);
 
  glutMainLoop();
  return 0;
  }
 
  OPENGL <wbr>(动画,光照,纹理)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值