【圖形學】立方體建模及顯示
- 1.繪制目標
- 2.核心代碼
- 3.運行結果
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://www.uj5u.com/qita/278556.html
標籤:其他
上一篇:第3節 體驗自定義函式
下一篇:Qt入門系列教程------01
