//#include"stdafx.h"
#include <GL/glut.h>
#include <stdlib.h>
#include<algorithm>
using namespace std;
bool mouseLeftDown;
bool mouseRightDown;
float mouseX, mouseY;
float cameraDistance = -6.0;
float cameraAngleX;
float cameraAngleY;
float angle[4] = { 0,0,0,0 };
bool depth = false;
void mouseCB(int button, int state, int x, int y);
void mouseMotionCB(int x, int y);
void init(void) {
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glShadeModel(GL_SMOOTH);//设为smooth处理方式,注意看区别
glEnable(GL_DEPTH_TEST);//激活深度测试
}
#define V3 1.732
float arr[7][2] = { 2,0,1,V3,-1,V3,-2,0,-1,-V3,1,-V3,2,0 };
void display(void) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清除颜色缓存和深度缓存
glLoadIdentity();
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
if (depth)
{
glDepthFunc(GL_ALWAYS);
}
else {
glDepthFunc(GL_LESS);
}
glTranslatef(3.0, 0.0, -6.0);
glRotatef(angle[0], angle[1], angle[2], angle[3]);
glColor3f(0.5f, 0.5f, 0.5f);
glutWireTeapot(1);
glColor3f(1, 1, 1);
glutSolidTeapot(0.5);
glEnd(); // 结束绘制
glLoadIdentity();
glTranslatef(-2.0, 0, cameraDistance);
glRotatef(cameraAngleX, 1, 0, 0);
glRotatef(cameraAngleY, 0, 1, 0);
glBegin(GL_TRIANGLES);
for (int i = 0; i<6;i++)
{
glColor3f(1.0f, 0.0f, 0.0f);
glVertex3f(0.0f, 1.0f, 0.0f);
glColor3f(0.0f, 1.0f, 0.0f);
glVertex3f(arr[i][0], -1.0f, arr[i][1]);
glColor3f(0.0f, 0.0f, 1.0f);
glVertex3f(arr[i+1][0], -1.0f, arr[i+1][1]);
}
for (int i = 0; i < 6; i++)
{
glColor3f(0.5f, 0.5f, 0.5f);
glVertex3f(0.0f, -1.0f, 0.0f);
glColor3f(0.5f, 0.5f, 0.5f);
glVertex3f(arr[i][0], -1.0f, arr[i][1]);
glColor3f(0.5f, 0.5f, 0.5f);
glVertex3f(arr[i + 1][0], -1.0f, arr[i + 1][1]);
}
glEnd();
glutSwapBuffers();//交换双缓存
}
void reshape(int width, int height) { //鼠标左右中间
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f, (GLfloat)width / (GLfloat)height, 0.1f, 100.0f);
glMatrixMode(GL_MODELVIEW); //设置为模型视图矩阵
glLoadIdentity(); //当前矩阵设置为单位矩阵
}
void keyboard(unsigned char key, int x, int y) {
switch (key) { //考虑添加键盘命令,交互式控制金字塔的旋转
case 'q':
case 'Q':
angle[0] = 0,angle[1] = 1,angle[2] = 0,angle[3] = 0;
break;
case 'e':
case 'E':
angle[0] = 180, angle[1] = 0, angle[2] = 1, angle[3] = 0;
break;
case 'w':
case 'W':
angle[0] = 90, angle[1] = 1, angle[2] = 0, angle[3] = 0;
break;
case 's':
case 'S':
angle[0] = -90, angle[1] = 1, angle[2] = 0, angle[3] = 0;
break;
case 'a':
case 'A':
angle[0] = 90, angle[1] = 0, angle[2] = 1, angle[3] = 0;
break;
case 'd':
case 'D':
angle[0] = -90, angle[1] = 0, angle[2] = 1, angle[3] = 0;
break;
case ' ':
depth = not depth;
break;
default:
//exit(0);
break;
}
}
int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);//使用双缓存模式和深度缓存
glutInitWindowSize(1280, 480);
glutInitWindowPosition(100, 100);
glutCreateWindow("Transform2");
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard);
glutMouseFunc(mouseCB);
glutMotionFunc(mouseMotionCB);
glutIdleFunc(display);//设置空闲时调用的函数
glutMainLoop();
return 0;
}
void mouseCB(int button, int state, int x, int y)
{
mouseX = x;
mouseY = y;
if (button == GLUT_LEFT_BUTTON)
{
if (state == GLUT_DOWN)
{
mouseLeftDown = true;
}
else if (state == GLUT_UP)
mouseLeftDown = false;
}
else if (button == GLUT_RIGHT_BUTTON)
{
if (state == GLUT_DOWN)
{
mouseRightDown = true;
}
else if (state == GLUT_UP)
mouseRightDown = false;
}
}
void mouseMotionCB(int x, int y)
{
if (mouseLeftDown)
{
cameraAngleY += (x - mouseX);
cameraAngleX += (y - mouseY);
mouseX = x;
mouseY = y;
}
if (mouseRightDown)
{
cameraDistance += (y - mouseY) * 0.2f;
mouseY = y;
}
glutPostRedisplay();
}
解释?让GPT解释