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

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

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.运行结果

在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

敲代码两年半的练习生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值