当前位置:主页 > 查看内容

【图形学】立方体建模及显示

发布时间:2021-08-20 00:00| 位朋友查看

简介:【图形学】立方体建模及显示 1.绘制目标 2.核心代码 3.运行结果 1.绘制目标 建模并显示下图所示的立方体要能响应键盘操作以旋转该立方体 ‘x’:绕x轴旋转 ‘y’:绕y轴旋转 ‘z’:绕z轴旋转 ‘r’:复原 2.核心代码 /**********************自定义变量********……

【图形学】立方体建模及显示

1.绘制目标

建模并显示下图所示的立方体,要能响应键盘操作以旋转该立方体:
‘x’:绕x轴旋转
‘y’:绕y轴旋转
‘z’:绕z轴旋转
‘r’:复原

在这里插入图片描述

2.核心代码

/**********************自定义变量**********************/
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;
	}
}

3.运行结果

在这里插入图片描述

;原文链接:https://blog.csdn.net/Gyangxixi/article/details/115906457
本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!
上一篇:Qt入门系列教程------01 下一篇:没有了

推荐图文


随机推荐