1、调用OpenGL三维绘图函数,绘制两个以上的物体(球体、圆锥体、多面体、环或茶壶),变换他们的位置。 2、采用透视变换及正交变换分别对他们进行观察。 3、透视变换中变换观察空间的大小分别对他们进行观察(观测角、近远端截面距离等)。 4、变换观测点位置对他们进行观察。 5、将不同的图形观察结果显示在同一窗口的不同视口中。
时间: 2023-07-10 16:09:37 浏览: 84
在OpenGL视图中绘制三维物体
5星 · 资源好评率100%
1. 绘制物体
OpenGL提供了很多绘制三维物体的函数,常见的有glutSolidSphere、glutSolidCone、glutSolidTorus等。我们可以使用这些函数来绘制球体、圆锥体、环等物体。
例如,绘制一个球体和一个圆锥体可以这样实现:
```cpp
void display() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
// 绘制球体
glColor3f(1.0, 0.0, 0.0);
glPushMatrix();
glTranslatef(-2.0, 0.0, 0.0);
glutSolidSphere(1.0, 30, 30);
glPopMatrix();
// 绘制圆锥体
glColor3f(0.0, 1.0, 0.0);
glPushMatrix();
glTranslatef(2.0, 0.0, 0.0);
glRotatef(-90.0, 1.0, 0.0, 0.0);
glutSolidCone(1.0, 2.0, 30, 30);
glPopMatrix();
glutSwapBuffers();
}
```
2. 透视变换和正交变换
OpenGL中使用gluPerspective函数进行透视变换,使用glOrtho函数进行正交变换。在进行变换之前,需要先设置投影矩阵模式为GL_PROJECTION。
例如,设置透视投影:
```cpp
void reshape(int w, int h) {
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0, (GLfloat)w / (GLfloat)h, 0.1, 100.0);
}
```
设置正交投影:
```cpp
void reshape(int w, int h) {
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-2.0, 2.0, -2.0, 2.0, -10.0, 10.0);
}
```
3. 观测空间大小的变换
透视投影中的观测角可以通过gluPerspective函数的第一个参数来调整。近端和远端截面距离可以通过第三个和第四个参数来调整。
例如,将观测角设为45度,近端截面距离设为1,远端截面距离设为10:
```cpp
gluPerspective(45.0, (GLfloat)w / (GLfloat)h, 1.0, 10.0);
```
4. 观测点位置的变换
观测点位置可以通过gluLookAt函数来进行设置。该函数接受三个向量参数:观测点位置、观测目标位置和观测方向。
例如,将观测点设置为(0,0,5),观测目标位置设置为(0,0,0),观测方向设置为(0,1,0):
```cpp
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
```
5. 多视口
使用glViewport函数可以设置视口的位置和大小。在绘制不同的图形时,可以先设置好视口再进行绘制。
例如,设置两个视口,左边的视口绘制球体,右边的视口绘制圆锥体:
```cpp
void reshape(int w, int h) {
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0, (GLfloat)w / (GLfloat)(h / 2), 1.0, 10.0);
}
void display() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
// 左边的视口
glViewport(0, 0, glutGet(GLUT_WINDOW_WIDTH) / 2, glutGet(GLUT_WINDOW_HEIGHT));
glLoadIdentity();
gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
glColor3f(1.0, 0.0, 0.0);
glutSolidSphere(1.0, 30, 30);
// 右边的视口
glViewport(glutGet(GLUT_WINDOW_WIDTH) / 2, 0, glutGet(GLUT_WINDOW_WIDTH) / 2, glutGet(GLUT_WINDOW_HEIGHT));
glLoadIdentity();
gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
glColor3f(0.0, 1.0, 0.0);
glRotatef(-90.0, 1.0, 0.0, 0.0);
glutSolidCone(1.0, 2.0, 30, 30);
glutSwapBuffers();
}
```
阅读全文