定义一个简单形体(OpenGL提供的基础形体,如立方体、球体等),并生成正交投影及透视投影视图;。要求如下:使用OpenGL等图形库实现; 可交互,可调整观察姿态及位置(调整相机位置、姿态等); 无需考虑斜平行投影;
时间: 2023-08-08 22:07:33 浏览: 90
这里提供一个使用OpenGL库实现的立方体,并生成正交投影和透视投影视图的代码示例:
```c++
#include <iostream>
#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}
};
// 立方体六个面的顶点索引
GLubyte cubeIndices[] = {
0, 1, 2, 3,
4, 5, 6, 7,
0, 4, 5, 1,
1, 5, 6, 2,
2, 6, 7, 3,
3, 7, 4, 0
};
// 视点位置、方向、上方向
GLfloat eyeX = 0.0, eyeY = 0.0, eyeZ = 10.0;
GLfloat centerX = 0.0, centerY = 0.0, centerZ = 0.0;
GLfloat upX = 0.0, upY = 1.0, upZ = 0.0;
// 投影类型
enum ProjectionType {
ORTHO,
PERSPECTIVE
};
ProjectionType projectionType = ORTHO;
// 调整相机位置、姿态等
void updateView() {
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(eyeX, eyeY, eyeZ, centerX, centerY, centerZ, upX, upY, upZ);
}
// 生成正交投影视图
void setOrthoView() {
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-5.0, 5.0, -5.0, 5.0, 0.1, 100.0);
updateView();
}
// 生成透视投影视图
void setPerspectiveView() {
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0, 1.0, 0.1, 100.0);
updateView();
}
// 渲染函数
void display() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// 绘制立方体
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, vertices);
glDrawElements(GL_QUADS, 24, GL_UNSIGNED_BYTE, cubeIndices);
glDisableClientState(GL_VERTEX_ARRAY);
glutSwapBuffers();
}
// 窗口大小变化回调函数
void reshape(int w, int h) {
glViewport(0, 0, w, h);
if (projectionType == ORTHO) {
setOrthoView();
} else {
setPerspectiveView();
}
}
// 键盘事件回调函数
void keyboard(unsigned char key, int x, int y) {
switch (key) {
case 'o':
projectionType = ORTHO;
setOrthoView();
break;
case 'p':
projectionType = PERSPECTIVE;
setPerspectiveView();
break;
case 'q':
exit(0);
break;
}
}
int main(int argc, char **argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(500, 500);
glutCreateWindow("OpenGL Cube");
glEnable(GL_DEPTH_TEST);
glClearColor(0.0, 0.0, 0.0, 1.0);
setOrthoView();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard);
glutMainLoop();
return 0;
}
```
在该代码示例中,我们定义了一个立方体的顶点坐标和面的顶点索引,并设置了视点位置、方向和上方向。在 `updateView` 函数中,我们使用 `gluLookAt` 函数来设置视点位置、方向和上方向。在 `setOrthoView` 和 `setPerspectiveView` 函数中,我们分别使用 `glOrtho` 和 `gluPerspective` 函数来生成正交投影和透视投影视图。在 `display` 函数中,我们使用 `glVertexPointer` 和 `glDrawElements` 函数来绘制立方体。在 `reshape` 函数中,我们使用 `glViewport` 函数来设置视口大小,并根据当前投影类型来调用相应的生成视图函数。在 `keyboard` 函数中,我们响应键盘事件来切换投影类型或退出程序。最后,在 `main` 函数中,我们使用 GLUT 库创建了窗口,并设置了渲染函数、窗口大小变化回调函数和键盘事件回调函数。