您的位置:首页 > 运维架构

OPENGL (动画,光照,纹理)

2013-06-09 19:07 316 查看
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;
}


(动画,光照,纹理)" TITLE="OPENGL (动画,光照,纹理)" />


=============================================================
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();

}


(动画,光照,纹理)" TITLE="OPENGL (动画,光照,纹理)" />


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

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;
}



(动画,光照,纹理)" TITLE="OPENGL (动画,光照,纹理)" />
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: