使用OpenGL 写一个三维空间里物体线性缩放的程序
时间: 2023-06-16 18:04:13 浏览: 49
下面是一个简单的使用OpenGL实现三维空间里物体线性缩放的程序:
```c++
#include <GL/glut.h>
// 三角形顶点坐标
GLfloat vertices[][3] = {
{-1.0, -1.0, -1.0},
{1.0, -1.0, -1.0},
{1.0, 1.0, -1.0},
{-1.0, 1.0, -1.0},
{-1.0, -1.0, 1.0},
{1.0, -1.0, 1.0},
{1.0, 1.0, 1.0},
{-1.0, 1.0, 1.0}
};
// 三角形边框颜色
GLfloat colors[][3] = {
{0.0, 0.0, 0.0},
{1.0, 0.0, 0.0},
{1.0, 1.0, 0.0},
{0.0, 1.0, 0.0},
{0.0, 0.0, 1.0},
{1.0, 0.0, 1.0},
{1.0, 1.0, 1.0},
{0.0, 1.0, 1.0}
};
// 三角形顶点索引
GLubyte indices[] = {
0, 1, 2, 3,
4, 5, 6, 7,
0, 4, 1, 5,
2, 6, 3, 7
};
// 缩放参数
GLfloat scale = 1.0f;
void display(void) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, vertices);
glColorPointer(3, GL_FLOAT, 0, colors);
glPushMatrix();
glScalef(scale, scale, scale);
glDrawElements(GL_QUADS, 16, GL_UNSIGNED_BYTE, indices);
glPopMatrix();
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
glutSwapBuffers();
}
void reshape(int w, int h) {
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (w <= h) {
glOrtho(-2.0, 2.0, -2.0 * (GLfloat)h / (GLfloat)w, 2.0 * (GLfloat)h / (GLfloat)w, -10.0, 10.0);
} else {
glOrtho(-2.0 * (GLfloat)w / (GLfloat)h, 2.0 * (GLfloat)w / (GLfloat)h, -2.0, 2.0, -10.0, 10.0);
}
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void keyboard(unsigned char key, int x, int y) {
switch (key) {
case '+':
scale += 0.1f;
break;
case '-':
scale -= 0.1f;
break;
case 'q':
case 'Q':
exit(0);
break;
}
glutPostRedisplay();
}
int main(int argc, char **argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(500, 500);
glutCreateWindow("Scaling");
glutReshapeFunc(reshape);
glutDisplayFunc(display);
glutKeyboardFunc(keyboard);
glEnable(GL_DEPTH_TEST);
glutMainLoop();
return 0;
}
```
该程序使用了OpenGL的三角形顶点坐标、边框颜色以及顶点索引,绘制了一个立方体。用户可以使用键盘的“+”和“-”键来控制缩放比例,缩放比例存储在变量scale中。在display函数中,将缩放变换应用于立方体,并绘制出来。在keyboard函数中,根据用户按下的键来更新缩放比例,并调用glutPostRedisplay函数来重新绘制立方体。
该程序使用OpenGL的固定管线进行渲染,因此在编译和运行之前需要安装OpenGL库和GLUT库。