//该程序完成的功能是:绘制9个方块,鼠标左键点击,改变方块的颜色
#include <gl/glut.h>
#include<iostream>
#include<vector>
using namespace std;
int board[3][3]; //存储几个方块的颜色
#define BUFSIZE 512
//处理点击记录:
//hits为产生的点击的数量,buffer中存储点击记录,每个点击记录由四个项目组成
void processHits(GLint hits, GLuint buffer[])
{
unsigned int i, j;
GLuint ii, jj, names, *ptr;
vector<int> n;
ptr = (GLuint *)buffer;
for (i = 0; i < hits; i++) {
names = *ptr;
cout << "the name_num = " << names << endl;
ptr += 3;
for (j = 0; j < names; j++) {
n.push_back(*ptr);
ptr++;
}
}
if (n.size() > 0) {
cout << "茶壶标号";
for (int k = 0; k < n.size(); k++)
cout << n[k];
cout << endl;
}
}
//绘制所有方块,参数有GL_RENDER和GL_SELECT两种模式
void drawSquares(GLenum mode)
{
//设置清除屏幕的颜色,并清除屏幕和深度缓冲
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//设置成模型矩阵模式
glMatrixMode(GL_MODELVIEW);
//载入单位化矩阵
glLoadIdentity();
//坐标中心向Z轴平移-G_fDistance (使坐标中心位于摄像机前方)
glTranslatef(0.0, 0.0, -3.0);
////////////////////////////////////////////////
//绘制物体
//glInitNames(); //初始化名字堆栈并压入初始元素
//if (mode == GL_SELECT)
// glPushName(1);
//glutWireTeapot(0.3);
//if (mode == GL_SELECT) //弹出名字
// glPopName();
//glTranslatef(1, 0, 0);
//if (mode == GL_SELECT) //将y方向上的索引压入名字堆栈
// glPushName(2);
//glutWireTeapot(0.3);
//if (mode == GL_SELECT) //弹出名字
// glPopName();
//glTranslatef(0, 1, 0);
//if (mode == GL_SELECT) //将y方向上的索引压入名字堆栈
// glPushName(3);
//glutWireTeapot(0.3);
//if (mode == GL_SELECT) //弹出名字
// glPopName();
glInitNames();
glPushName(0);
for (int i = 0; i < 2; i++) {
if (mode == GL_SELECT)
glLoadName(i);
for (int j = 0; j < 2; j++) {
glPushMatrix();
glTranslatef(i, j, 0);
if (mode == GL_SELECT) //将y方向上的索引压入名字堆栈
glPushName(j);
glutWireTeapot(0.3);
//glutSolidSphere(0.2, 16, 16);
if (mode == GL_SELECT) //弹出名字
glPopName();
glPopMatrix();
}
}
//交换前后缓冲区
glutSwapBuffers();
// glFlush();
}
//当鼠标左键点击窗口时,进入选择模式开始绘制;绘制之后,处理点击记录
void pickSquares(int button, int state, int x, int y)
{
GLuint selectBuf[BUFSIZE]; //存储点击记录
GLint hits; //点击记录的个数
GLint viewport[4]; //视口
if (button != GLUT_LEFT_BUTTON || state != GLUT_DOWN)
return;
glGetIntegerv(GL_VIEWPORT, viewport); //获得视口
glSelectBuffer(BUFSIZE, selectBuf); //指定存储点击记录的数组
glRenderMode(GL_SELECT); //进入选择模式
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
//设置挑选矩阵,挑选区域的中心坐标是(x,viewport[3]-y),大小是(5,5)
gluPickMatrix((GLdouble)x, (GLdouble)(viewport[3] - y), 5.0, 5.0, viewport);
//设置投影矩阵
//gluOrtho2D(0.0, 3.0, 0.0, 3.0);
gluPerspective(60.0f, float(viewport[2]) / float(viewport[3]), 1.0f, 1000.0f);
//gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
//在选择模式下绘制方块
drawSquares(GL_SELECT);
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glFlush(); //绘制结束
hits = glRenderMode(GL_RENDER); //获取记录下的点击的个数
processHits(hits, selectBuf); //处理点击记录selectBuf
glutPostRedisplay();
}
void init()
{
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_FLAT);
for (int i = 0; i < 3; i++) //初始化9个方块的颜色
for (int j = 0; j < 3; j++)
board[i][j] = 0;
}
void display()
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
drawSquares(GL_RENDER); //基本绘制
//gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
glFlush();
}
void reshape(int w, int h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
/*gluOrtho2D(0.0, 3.0, 0.0, 3.0);*/
gluPerspective(60.0f, float(w) / float(h), 1.0f, 1000.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
int main(int argc, char ** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(600, 600);
glutInitWindowPosition(100, 100);
glutCreateWindow("pick");
init();
glutMouseFunc(pickSquares); //当鼠标点击时,调用pickSquares,进入选择模式进行绘制
glutReshapeFunc(reshape);
glutDisplayFunc(display); //display只完成基本的绘制
glutMainLoop();
return 0;
}
IndeReChill
- 粉丝: 170
- 资源: 8
最新资源
- 官网下载的VSCode和中文语言包, VSCodeUserSetup-x64-1.92.2.exe
- 全国高校计算机能力挑战赛往届真题整理.zip
- HandyDoc:HandyControl 的离线文档
- 202210120219+朱羡彬+软件工程实验一.docx
- C# 工厂模式开发示例,详细展示三种工厂模式
- Python大作业:基于OpenCV模板匹配的数字识别
- AI 绘画工具 Stable Diffusion 的换脸插件ReActor所使用的codeformer.pth 权重文件
- RDC小计的材料等等等等
- 振宇日语·最好用最好记15000日语单词随身背 (李晓东) (Z-Library).epub
- led-tcp-mastc
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈