24,854
社区成员
发帖
与我相关
我的任务
分享
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <GL/glut.h>
#include<gl/glaux.h>
#include <math.h>
#include <time.h>
#pragma comment(lib, "opengl32.lib")
#pragma comment(lib, "glut32.lib")
#pragma comment(lib, "glu32.lib")
#pragma comment(lib, "glut.lib")
#pragma comment(lib, "glaux.lib")
#pragma comment(lib,"legacy_stdio_definitions.lib")
int WinWidth, WinHeight;
double posX, posY, posZ, viewX, viewY, viewZ, upX, upY, upZ;
const GLfloat PI = 3.141515926;
int use = 0;
GLfloat xRot = 0.0f;
GLfloat yRot = 0.0f;
UINT ground, box,box1;
const char* aa = "E://3up/box.bmp";
const char* bb = "E://3up/ground2.bmp";
const char* cc = "E://3up/box1.bmp";
const char* dd = "E://3up/dd.bmp";
const char* ee = "E://3up/ground1.bmp";
int light = 1;
bool r = true;
bool ct = true;
void setUpRc() {
GLfloat LightAmbient[] = { 0.0f,0.0f,0.0f,1.0f };//环境光参数 黑
GLfloat LightDiffuse[] = { 1.0f,1.0f,1.0f,1.0f };//漫射光参数
GLfloat LightSpecular[] = { 1.0f,1.0f,1.0f,1.0f, };//白
GLfloat LightPosition[] = { 0.0f, 30.0f,5.0f,1.0f }; //光源位置
glPushMatrix();
glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient);
glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse);
glLightfv(GL_LIGHT1, GL_SPECULAR, LightSpecular);
glLightfv(GL_LIGHT1, GL_POSITION, LightPosition);
glPopMatrix();
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT1);
//glFrontFace(GL_CW);
glEnable(GL_DEPTH_TEST);
}
void setAll(double px, double py, double pz,
double vx, double vy, double vz,
double ux, double uy, double uz)
{
posX = px;
posY = py;
posZ = pz;
viewX = vx;
viewY = vy;
viewZ = vz;
upX = ux;
upY = uy;
upZ = uz;
}
void setLookAt() {
gluLookAt(posX, posY, posZ,
viewX, viewY, viewZ,
upX, upY, upZ);
glPushMatrix();
}
void setPos(double x, double y, double z) {
posX = x;
posY = y;
posZ = z;
}
void DisplayBox1() {
float x, y, z;
glPushMatrix();
glScalef(x=4, y=4, z=4);
glEnable(GL_TEXTURE_2D); //贴图有效
glRotatef(xRot, 0.0f, 3.0f, 0.0f);
glBindTexture(GL_TEXTURE_2D, box);
GLfloat ambient[] = { 0.3f,0.2f,0.0f,1.0f, };
GLfloat diffuse[] = { 0.8f,0.6f,0.1f,1.0f, };
GLfloat specular[] = { 1.0f,1.0f,0.8f,1.0f, };
glMaterialfv(GL_FRONT, GL_AMBIENT, ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, specular);
glMaterialf(GL_FRONT, GL_SHININESS, 50.0);
//glMateriali(GL_FRONT, GL_SHININESS, 128);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f);// 前
glTexCoord2f(1.0f, 0.0f); glVertex3f(1.0f, 1.0f, 1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, 3.0f, 1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 3.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, 1.0f, -1.0f);// 后
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 3.0f, -1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(1.0f,3.0f, -1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f(1.0f, 1.0f, -1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 3.0f, -1.0f);// 上
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 3.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(1.0f, 3.0f, 1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, 3.0f, -1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);// 下
glTexCoord2f(0.0f, 1.0f); glVertex3f(1.0f, 1.0f, -1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f(1.0f, 1.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(1.0f, 1.0f, -1.0f);// 左
glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, 3.0f, -1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(1.0f, 3.0f, 1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f(1.0f, 1.0f, 1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, -1.0f);// 右
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 3.0f, 1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 3.0f, -1.0f);
glEnd();
glDisable(GL_TEXTURE_2D);//取消贴图
glPopMatrix();
}
void DisplayBox2() {
float x, y, z;
glPushMatrix();
glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE);
glPushMatrix();
glScalef(x = 2, y = 2, z = 2);
glEnable(GL_TEXTURE_2D); //贴图有效
glRotatef(yRot, 0.0f, 3.0f, 0.0f);
glBindTexture(GL_TEXTURE_2D, box1);
GLfloat ambient[] = { 0.2f,0.2f,0.1f,1.0f, };
GLfloat diffuse[] = { 0.3f,0.3f,0.1f,1.0f, };
GLfloat specular[] = { 0.8f,0.7f,0.2f,1.0f, };
glMaterialfv(GL_FRONT, GL_AMBIENT, ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, specular);
glMaterialf(GL_FRONT, GL_SHININESS, 80.0);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 8.0f, 1.0f);// 前
glTexCoord2f(1.0f, 0.0f); glVertex3f(1.0f, 8.0f, 1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, 10.0f, 1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 10.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, 8.0f, -1.0f);// 后
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 10.0f, -1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(1.0f, 10.0f, -1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f(1.0f, 8.0f, -1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 10.0f, -1.0f);// 上
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 10.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(1.0f, 10.0f, 1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, 10.0f, -1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 8.0f, -1.0f);// 下
glTexCoord2f(0.0f, 1.0f); glVertex3f(1.0f, 8.0f, -1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f(1.0f, 8.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, 8.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(1.0f, 8.0f, -1.0f);// 左
glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, 10.0f, -1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(1.0f, 10.0f, 1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f(1.0f, 8.0f, 1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 8.0f, -1.0f);// 右
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, 8.0f, 1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 10.0f, 1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 10.0f, -1.0f);
glEnd();
glDisable(GL_TEXTURE_2D);//取消贴图
glPopMatrix();
}
void Ground() {
glEnable(GL_TEXTURE_2D);
glEnable(GL_DEPTH_TEST);
glBindTexture(GL_TEXTURE_2D, ground);
GLfloat ambient[] = { 0.2f,0.2f,0.2f,1.0f, };
GLfloat diffuse[] = { 0.2f,0.2f,0.2f,1.0f, };
GLfloat specular[] = { 0.5f,0.5f,0.5f,1.0f, };
glMaterialfv(GL_FRONT, GL_AMBIENT, ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, specular);
glMaterialf(GL_FRONT, GL_SHININESS, 5.0);
glBegin(GL_QUADS);
glNormal3f(0.0f, 1.0f, 0.0f);
for (int z = 0; z < 20; z++) {
float zStart = 100.0f - z * 10.0f;
for (int x = 0; x < 20; x++) {
float xStart = x * 10.0f - 100.0f;
glColor4ub(200, 200, 200, 255);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(xStart, -1.0f, zStart);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(xStart + 10.0f, -1.0f, zStart);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(xStart + 10.0f, -1.0f, zStart - 10.0f);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(xStart, -1.0f, zStart - 10.0f);
}
}
glEnd();
glDisable(GL_TEXTURE_2D);
}
bool LoadTexture(char *filename, GLuint &texture) {
AUX_RGBImageRec *pImage = auxDIBImageLoadA(filename);
if (pImage == NULL) return false;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
gluBuild2DMipmaps(GL_TEXTURE_2D, 4, pImage->sizeX, pImage->sizeY, GL_RGB, GL_UNSIGNED_BYTE, pImage->data);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
return true;
}
void Display() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
Ground();
DisplayBox1();
DisplayBox2();
glutSwapBuffers();
}
void update() {
glLoadIdentity();
setLookAt();
glutPostRedisplay();
}
void TimerFunc(int value)
{
static double delta;
switch (value) {
case 0:
if (r == true) {
xRot -= 1.0f;
yRot += 1.0f;
glutTimerFunc(20, TimerFunc, 0);
glutPostRedisplay();
}
else;
break;
case 1:
xRot += 1.0f;
yRot -= 1.0f;
glutPostRedisplay();
glutTimerFunc(20, TimerFunc, 1);
break;
}
}
void init() {
glClearColor(0.0, 0.0, 0.0, 0.0);
char* id1 = const_cast<char*>(aa);
char* id2 = const_cast<char*>(bb);
char* id3 = const_cast<char*>(cc);
char* id4 = const_cast<char*>(dd);
char* id5 = const_cast<char*>(ee);
if (ct == true) {
LoadTexture(id1, box);
LoadTexture(id2, ground);
}
else {
LoadTexture(id4, box);
LoadTexture(id5, ground);
}
LoadTexture(id3, box1);
setAll(20, 20, 10, 0, 11, 0, 0, 5, 0);
//glPushMatrix();
//glLoadIdentity();
}
void ProcessKeyBoard(int key, int x, int y) {
static double delta;
if (key == GLUT_KEY_LEFT) {
delta += 0.03;
setPos(20 * cos(delta), posY, 20 * sin(delta));
glPushMatrix();
}
else if (key == GLUT_KEY_RIGHT) {
delta -= 0.03;
setPos(20 * cos(delta), posY, 20 * sin(delta));
glPushMatrix();
}
else if (key == GLUT_KEY_UP) {
delta += 0.03;
setPos(20 * cos(delta), 40 * sin(delta), posZ);
glPushMatrix();
}
else if (key == GLUT_KEY_DOWN) {
delta -= 0.03;
setPos(20 * cos(delta), 40 * sin(delta), posZ);
glPushMatrix();
}
else if (key == GLUT_KEY_F1) {
r = true;
//TimerFunc(0);
glutTimerFunc(20, TimerFunc, 0);
}
else if (key == GLUT_KEY_F2) {
r = false;
TimerFunc(0);
}
else if (key == GLUT_KEY_F3) {
if (light)
{
light = 0;
glDisable(GL_LIGHTING);
printf("off\n");
}
else
{
light = 1;
glEnable(GL_LIGHTING);
printf("on\n");
}
}
else if (key == GLUT_KEY_F4) {
ct = false;
init();
}
else if (key == GLUT_KEY_F5) {
ct = true;
init();
}
}
void myMouse(int button, int state, int x, int y) {
if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) {
glMatrixMode(GL_PR