计算机图形图像技术(OpenGL的基本图元)

一、实验原理

1、OpenGL程序框架

#include <GL/freeglut.h>
void init(){ 
    /* 全局初始化。主要用于设置一些全局的状态,如颜色模式、
    窗口的初始位置和大小等。使用默认值时不需要定义该函数。*/
}
void init2(){
    /* 当前窗口初始化。主要用于设置一些与当前窗口关联的状态或开关,如光照处理、
    光源特性、深度检测和裁剪等。使用默认值时不需要定义该函数。*/
}
void Reshape(int w, int h){ 
    /* 设置投影方式和观察体。主要使用glViewport()、glOrtho()、glFrustum()、
    gluPerspective()和gluOrtho2D()等。使用默认值时不需要定义该函数。*/
}
void Paint(){ 
    /* 使用OpenGL库函数构造对象的数学描述,包括点线面的位置、
    几何变换和光照处理等,是OpenGL的主要部分。*/
}
int main(int argc, char *argv[]){ 
    glutInit(&argc, argv); // 初始化GLUT, 记录main()的参数
    init(); // 全局初始化, 使用默认值时不是必需的
    glutCreateWindow("窗口标题"); // 创建程序窗口,指定窗口标题
    init2(); // 当前窗口初始化, 使用默认值时不是必需的
    // 注册回调函数
    glutDisplayFunc(Paint); // 指定场景绘制函数,必需
    glutReshapeFunc(Reshape); // 指定窗口变化回调函数,缺省则使用默认值
    glutMainLoop(); // 开始循环执行OpenGL命令
}

 2、OpenGL部分函数说明

(1)初始化GLUT库:void glutInit(int *argc, char **argv);

(2)设置窗口的初始大小:void glutInitWindowSize(int width, int height);

(3)进入GLUT事件处理循环:void glutMainLoop(void);

(4)注册窗口变化回调函数:void glutReshapeFunc(void (*func)(int width, int height));

(5)注册场景绘制函数:void glutDisplayFunc(void (*func)(void));

(6)清除颜色缓冲区:void glClear(GL_COLOR_BUFFER_BIT);

(7)指定背景颜色:void glClearColor(float red, float green, float blue, float alpha);

(8)结束绘图并返回:void glFlush(void);

(9)基本图元定义的开始:void glBegin(GLenum mode);

(10)基本图元定义的结束:void glEnd(void);

(11)消除其他视口中的物体变换对当前视口的影响:void glLoadIdentity();

(12)将物体绕旋转轴(0,0,0)~(x,y,z) 旋转th度以调整物体的方向:void glRotatef(GLfloat th, GLfloat x, GLfloat y, GLfloat z);

3、基本图元部分预定义几何形体

(1)矩形:void glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2);

(2)立方体:

            ① 实心立方体:void glutSolidCube(GLdouble size);

            ② 线框立方体:void glutWireCube(GLdouble size);

(3)球面:

            ① 实心球面:void glutSolidSphere(GLdouble radius, int slices, int stacks);

            ② 线框球面:void glutWireSphere(GLdouble radius, int slices, int stacks);

(4)犹他茶壶:

            ① 实心立方体:void glutSolidTeapot(GLdouble size);

            ② 线框立方体:void glutWireTeapot(GLdouble size);


二、算法程序

1、使用OpenGL和GLUT编写一个显示线框球体的简单图形程序。其中球体半径为0.8,经线数为24,纬线数为12,并绕x轴旋转30度,程序窗口的大小为(200,200),标题为“线框球”;

#include <GL/glut.h>
void Paint() {
    glClear(GL_COLOR_BUFFER_BIT);
    glLoadIdentity();
    glRotated(30, 1, 0, 0);
    glutWireSphere(0.8, 24, 12);
    glFlush();
}
int main(int argc, char* argv[]) {
    glutInit(&argc, argv);
    glutInitWindowSize(200, 200);
    glutCreateWindow("线框球");
    glutDisplayFunc(Paint);
    glutMainLoop();
    return 0;
}

2、使用OpenGL、GLU和GLUT编写一个显示线框立方体的程序。其中立方体的半径为1.5单位,并首先绕(0, 0, 0)~(1, 1, 0)旋转30度,然后远移6.5单位;观察体规定为:视场角=30度,宽高比=1,近=1,远=100;程序窗口的大小为(200, 200),标题为“线框立方体”。

#include <GL/glut.h>
void Paint() {
    glClear(GL_COLOR_BUFFER_BIT);
    glLoadIdentity();
    gluPerspective(30, 1, 1, 100);
    glTranslatef(0, 0, -6.5);
    glRotated(30, 1, 1, 0);
    glutWireCube(1.5);
    glFlush();
}
int main(int argc, char* argv[]) {
    glutInit(&argc, argv);
    glutInitWindowSize(200, 200);
    glutCreateWindow("线框立方体");
    glutDisplayFunc(Paint);
    glutMainLoop();
    return 0;
}

3、使用OpenGL、GLU和GLUT编写一个三维犹他茶壶程序。其中茶壶的半径为1单位,并远移6.5单位;观察体规定为:视场角=30度,宽高比=1,近=1,远=100;程序窗口的大小为(200, 200),标题为“旋转的犹他茶壶”。茶壶绕z方向中轴不断旋转,旋转的时间间隔为25毫秒,角度间隔为2度。注意旋转角度必须限定在0~360度以内。

#include <GL/glut.h>
int angle = 0;
void Paint() {
    glClear(GL_COLOR_BUFFER_BIT);
    glLoadIdentity();
    gluPerspective(30, 1, 1, 100);
    glTranslatef(0, 0, -6.5);
    glRotated(angle, 0, 0, 1);
 	glutSolidTeapot(1);
 	glFlush();
}
void timer(int millis){
 	angle = (angle + 2) % 360;
    glutPostRedisplay();
    glutTimerFunc(millis, timer, millis);
}
int main(int argc, char* argv[]) {
    glutInit(&argc, argv);
    glutInitWindowSize(200, 200);
    glutCreateWindow("旋转的犹他茶壶");
    glutTimerFunc(25, timer, 25);
    glutDisplayFunc(Paint);
    glutMainLoop();
    return 0;
}

三、结果演示

1、线框球

2、线框立方体

3、旋转的犹他茶壶

  • 35
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是使用OpenGL生成一个简单的立方体,并生成正交投影和透视投影的代码示例: ```c++ #include <GL/glut.h> void init() { glEnable(GL_DEPTH_TEST); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); } void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 设置正交投影 glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-2, 2, -2, 2, -10, 10); // 设置视点 glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0, 0, 5, 0, 0, 0, 0, 1, 0); // 绘制立方体 glPushMatrix(); glColor3f(1.0f, 0.0f, 0.0f); glutSolidCube(1.0f); glPopMatrix(); // 设置透视投影 glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(60, 1, 1, 100); // 设置视点 glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0, 0, 5, 0, 0, 0, 0, 1, 0); // 绘制立方体 glPushMatrix(); glColor3f(0.0f, 1.0f, 0.0f); glTranslatef(2.5f, 0.0f, 0.0f); glutSolidCube(1.0f); glPopMatrix(); glutSwapBuffers(); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(800, 600); glutCreateWindow("OpenGL Demo"); init(); glutDisplayFunc(display); glutMainLoop(); return 0; } ``` 在上述代码中,我们首先启用了深度测试和光照,然后在 `display()` 函数中先设置了正交投影,绘制了一个红色的立方体,接着设置了透视投影,绘制了一个绿色的立方体。在每次绘制前,我们都需要使用 `glPushMatrix()` 和 `glPopMatrix()` 函数保存和恢复当前的矩阵状态,以避免不必要的变换影响后续的绘制。最后使用 `glutSwapBuffers()` 函数实现双缓冲,避免绘制过程中出现闪烁。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有为肥宅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值