建模并显示下图所示的立方体,要能响应键盘操作以旋转该立方体:
‘x’:绕x轴旋转
‘y’:绕y轴旋转
‘z’:绕z轴旋转
‘r’:复原
/**********************自定义变量**********************/
cv::Mat img[6];
int Pw = 0, Ph = 0;
const string picture[] = {
"side1.png",
"side2.png",
"side3.png",
"side4.png",
"side5.png",
"side6.png",
};
/******************************************************/
void loadTexture() {
/// TO DO
///加载立方体六个面的纹理并设置纹理属性//
for (int i = 0; i < 6; i++)
{
img[i] = loadImage(picture[i], Pw, Ph);
}
// 设置纹理属性
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_REPEAT);
// 设置线形滤波
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
}
void init()
{
glClearColor(0.f, 0.f, 0.f, 0.f);
glEnable(GL_DEPTH_TEST);//开启深度测试
/ TO DO /
//申请纹理ID、加载纹理、设置纹理环境/
// 申请纹理ID
glGenTextures(6, TEXTURE_IDS);
// 加载纹理
loadTexture();
// 设置纹理环境
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
// 开启纹理映射
glEnable(GL_TEXTURE_2D);
}
void drawCube()
{
/// TO DO
// 绘制立方体/
//需要设计立方体六个面的三维顶点以及对应的纹理坐标///
glBindTexture(GL_TEXTURE_CUBE_MAP, TEXTURE_IDS[0]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, Pw, Ph, 0, GL_RGB, GL_UNSIGNED_BYTE, img[0].data);
glBegin(GL_TRIANGLE_FAN);
glTexCoord2f(0.f, 1.f); glVertex3f(-50, 50, 50);
glTexCoord2f(0.f, 0.f); glVertex3f(-50, -50, 50);
glTexCoord2f(1.f, 0.f); glVertex3f(50, -50, 50);
glTexCoord2f(1.f, 1.f); glVertex3f(50, 50, 50);
glEnd();
glBindTexture(GL_TEXTURE_CUBE_MAP, TEXTURE_IDS[1]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, Pw, Ph, 0, GL_RGB, GL_UNSIGNED_BYTE, img[1].data);
glBegin(GL_TRIANGLE_FAN);
glTexCoord2f(0.f, 1.f); glVertex3f(-50, -50, 50);
glTexCoord2f(0.f, 0.f); glVertex3f(-50, -50, -50);
glTexCoord2f(1.f, 0.f); glVertex3f(50, -50, -50);
glTexCoord2f(1.f, 1.f); glVertex3f(50, -50, 50);
glEnd();
glBindTexture(GL_TEXTURE_CUBE_MAP, TEXTURE_IDS[2]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, Pw, Ph, 0, GL_RGB, GL_UNSIGNED_BYTE, img[2].data);
glBegin(GL_TRIANGLE_FAN);
glTexCoord2f(0.f, 1.f); glVertex3f(-50, 50, -50);
glTexCoord2f(0.f, 0.f); glVertex3f(-50, -50, -50);
glTexCoord2f(1.f, 0.f); glVertex3f(-50, -50, 50);
glTexCoord2f(1.f, 1.f); glVertex3f(-50, 50, 50);
glEnd();
glBindTexture(GL_TEXTURE_CUBE_MAP, TEXTURE_IDS[3]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, Pw, Ph, 0, GL_RGB, GL_UNSIGNED_BYTE, img[3].data);
glBegin(GL_TRIANGLE_FAN);
glTexCoord2f(0.f, 1.f); glVertex3f(-50, -50, -50);
glTexCoord2f(0.f, 0.f); glVertex3f(-50, 50, -50);
glTexCoord2f(1.f, 0.f); glVertex3f(50, 50, -50);
glTexCoord2f(1.f, 1.f); glVertex3f(50, -50, -50);
glEnd();
glBindTexture(GL_TEXTURE_CUBE_MAP, TEXTURE_IDS[4]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, Pw, Ph, 0, GL_RGB, GL_UNSIGNED_BYTE, img[4].data);
glBegin(GL_TRIANGLE_FAN);
glTexCoord2f(0.f, 1.f); glVertex3f(-50, 50, -50);
glTexCoord2f(0.f, 0.f); glVertex3f(-50, 50, 50);
glTexCoord2f(1.f, 0.f); glVertex3f(50, 50, 50);
glTexCoord2f(1.f, 1.f); glVertex3f(50, 50, -50);
glEnd();
glBindTexture(GL_TEXTURE_CUBE_MAP, TEXTURE_IDS[5]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, Pw, Ph, 0, GL_RGB, GL_UNSIGNED_BYTE, img[5].data);
glBegin(GL_TRIANGLE_FAN);
glTexCoord2f(0.f, 1.f); glVertex3f(50, 50, 50);
glTexCoord2f(0.f, 0.f); glVertex3f(50, -50, 50);
glTexCoord2f(1.f, 0.f); glVertex3f(50, -50, -50);
glTexCoord2f(1.f, 1.f); glVertex3f(50, 50, -50);
glEnd();
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
TO DO /
/ 设置模型、视点变换以及立方体显示 /
gluLookAt(0.0, 0.0, 260.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
glRotatef(ZROT, 0.0f, 0.0f, 1.0f);
glRotatef(YROT, 0.0f, 1.0f, 0.0f);
glRotatef(XROT, 1.0f, 0.0f, 0.0f);
glScalef(1, 1, 1);
drawCube();
glutSwapBuffers();
glFlush();
}
void reshape(int w, int h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
// TO DO /
设置三维透视投影/
gluPerspective(60, float(w) / float(h), 10.0, 1000.0);
}
// 键盘按键回掉函数
void keyboard(unsigned char key, int x, int y) {
switch (key) {
case 'x':
/ TO DO /
//设置绕x轴的旋转角度
XROT += 1.0f;
glutPostRedisplay(); //更新显示内容
break;
case 'y':
/ TO DO /
//设置绕y轴的旋转角度
YROT += 1.0f;
glutPostRedisplay();
break;
case 'z':
/ TO DO /
//设置绕z轴的旋转角度
ZROT += 1.0f;
glutPostRedisplay();
break;
case 'r':
/ TO DO /
//复原所有旋转角度///
XROT = 0.0f;
YROT = 0.0f;
ZROT = 0.0f;
glutPostRedisplay();
default:
break;
}
}
需求 我们想在编辑一个列表中某一个条目时,将编辑的详情内容也放置当前面,比如...
前言: 我们介绍了 MySQL 权限管理相关知识。当数据库实例中存在大量的库或用户...
好多网友问起来,·深度学习网址导航·深度学习整站系统 的后台管理能否增加批量...
最近有朋友向笔者反馈说,电脑玩游戏很不稳定,玩了一会儿后就黑屏甚至死机,电...
在 html5 中,a 标签新增了 download 属性,包含该属性的链接被点击时,浏览器会...
什么是Ajax Ajax是Asynchronous JavaScript and XML的缩写,这一技术能够向服务...
一、JSTL介绍 JSTL(JavaServer Pages Standard Tag Library)由JCP(Java Communi...
当定义了 Text 的 height 属性时,在 Text 中输入的文字都不是垂直居中的,不过...
本文实例为大家分享了ASP.NET生成验证码的具体代码,供大家参考,具体内容如下 ...
复制代码 代码如下: script var xmlHttp; var BrowerType="ie"; function create...