首页 > 其他分享 >【图形学】立方体建模及显示

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

时间:2022-10-17 18:00:27浏览次数:43  
标签:glTexCoord2f glVertex3f 0.0 50 TEXTURE 图形学 立方体 GL 建模


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

1.绘制目标

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

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

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

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


标签:glTexCoord2f,glVertex3f,0.0,50,TEXTURE,图形学,立方体,GL,建模
From: https://blog.51cto.com/u_15739363/5763804

相关文章