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;
}
=============================================================
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();
}
=============================================================
#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;
}
3、纹理
需加载imageloader.h , imageloader.cpp , 24位图
caodi.bmp, 最后写main.cpp
#include <windows.h>