计算机图形学(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;
}
发布评论