### OpenGL 实现 3D 小球的知识点详解 #### 一、OpenGL简介 OpenGL(Open Graphics Library)是一种用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口(API)。它使用单个命令来绘制基本图形(如点、线和多边形),这些命令可以组合成更复杂的对象。OpenGL被广泛应用于游戏开发、虚拟现实系统以及各种科学可视化应用中。 #### 二、代码分析与知识点解析 ##### 1. 初始化函数 `init()` ```cpp void init(void) { printf("init"); GLfloat mat_specular[] = {1.0, 1.0, 1.0, 1.0}; GLfloat mat_shininess[] = {50.0}; GLfloat light_position[] = {1.0, 1.0, 1.0, 0.0}; // r-lu-df-b GLfloat diffuseLight[] = {1.0f, 1.0f, 1.0f, 1.0f}; GLfloat specular[] = {1.0f, 1.0f, 1.0f, 1.0f}; glClearColor(0.3, 0.8, 0.8, 0.0); // bgc glColor3ub(23, 17, 215); glShadeModel(GL_SMOOTH); glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess); glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight); glLightfv(GL_LIGHT0, GL_SPECULAR, specular); glLightfv(GL_LIGHT0, GL_POSITION, light_position); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_DEPTH_TEST); } ``` - **`glClearColor()`**: 设置清除颜色缓冲区时使用的颜色值。 - **`glColor3ub()`**: 设置当前颜色。此处设置的颜色值不参与任何光照计算,因此通常用于背景或调试目的。 - **`glShadeModel()`**: 指定着色模型为平滑。 - **`glMaterialfv()`**: 设置材料属性。这里设置了表面的镜面反射系数和高光强度。 - **`glLightfv()`**: 设置光源属性。包括漫反射颜色、镜面反射颜色和光源位置。 - **`glEnable()`**: 启用指定功能。这里启用了光照效果、第一个光源(GL_LIGHT0)和深度测试。 ##### 2. 绘制函数 `initDisplay()` ```cpp void initDisplay(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glutSolidSphere(0.4, 40, 50); glutSwapBuffers(); } ``` - **`glClear()`**: 清除颜色缓冲区和深度缓冲区。 - **`glLoadIdentity()`**: 重置当前矩阵为单位矩阵。 - **`glutSolidSphere()`**: 绘制一个实心球体。 - **`glutSwapBuffers()`**: 交换前后缓冲区,使得绘制的内容可见。 ##### 3. 重设视口函数 `reshape()` ```cpp void reshape(int w, int h) { printf("reshape"); glViewport(0, 0, (GLsizei)w, (GLsizei)h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if (w <= h) glOrtho(-1.5, 1.5, -1.5 * (GLfloat)(h) / (GLfloat)(w), 1.5 * (GLfloat)(h) / (GLfloat)(w), -10.0, 10.0); else glOrtho(-1.5 * (GLfloat)(w) / (GLfloat)(h), 1.5 * (GLfloat)(w) / (GLfloat)(h), -1.5, 1.5, -10.0, 10.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } ``` - **`glViewport()`**: 设置视口大小。 - **`glMatrixMode()`**: 设置当前操作的矩阵模式。 - **`glLoadIdentity()`**: 重置当前矩阵为单位矩阵。 - **`glOrtho()`**: 定义正交投影矩阵。 ##### 4. 主函数 `main()` ```cpp int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); glutInitWindowSize(400, 740); glutInitWindowPosition(300, 20); glutCreateWindow(argv[0]); init(); glutDisplayFunc(initDisplay); glutReshapeFunc(reshape); glutMainLoop(); return 0; } ``` - **`glutInit()`**: 初始化GLUT库。 - **`glutInitDisplayMode()`**: 设置显示模式。 - **`glutInitWindowSize()`**: 设置窗口大小。 - **`glutInitWindowPosition()`**: 设置窗口位置。 - **`glutCreateWindow()`**: 创建并返回一个窗口。 - **`glutDisplayFunc()`**: 设置显示回调函数。 - **`glutReshapeFunc()`**: 设置窗口尺寸改变时的回调函数。 - **`glutMainLoop()`**: 进入主事件循环。 #### 三、光照渲染原理 本例中的光照渲染涉及了OpenGL中的基本光照模型——Phong光照模型。该模型包括三种光照成分:环境光、漫反射和镜面反射。 - **环境光**:模拟光线从所有方向照射到物体上,使整个场景都有一定亮度。 - **漫反射**:当光照射到物体上时,一部分光线会被散射,形成不同强度的光斑。 - **镜面反射**:模拟光滑表面上的反光效果,当观察者处于反射光线的方向时会看到强烈的反光。 通过调整光源的位置、颜色和强度,以及材料属性(如镜面反射系数和高光强度),可以在OpenGL中实现多种光照效果。 这段代码演示了如何使用OpenGL在3D空间中渲染一个小球,并对其应用基本的光照效果。通过对光照参数的调整,可以进一步改善渲染效果,使之更加逼真。





























#include<GL/glut.h>
#include<stdlib.h>
#include<stdio.h>
#include<time.h>
#include<math.h>
void init(void)
{
printf(" init");
GLfloat mat_specular[]={1.0,1.0,1.0,1.0};
GLfloat mat_shininess[]={50.0};
GLfloat light_position[]={1.0, 1.0, 1.0, 0.0}; //r-l u-d f-b
GLfloat diffuseLight[] = { 1.0f, 1.0f, 1.0f, 1.0f};
GLfloat specular[] = { 1.0f, 1.0f, 1.0f, 1.0f};
glClearColor(0.3,0.8,0.8,0.0); //bgc
glColor3ub(23, 17, 215);
glShadeModel(GL_SMOOTH);
glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);
glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess);
glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuseLight);
glLightfv(GL_LIGHT0,GL_SPECULAR,specular);
glLightfv(GL_LIGHT0,GL_POSITION,light_position);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_DEPTH_TEST);

- merphyc2013-11-15还行吧,太简单了
- lsq102015-03-04可以参考,但是过于简单,适合初学者

- 粉丝: 77
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 云计算环境下高校图书馆统计与评估服务体系构建.docx
- 基于51单片机的多点温度控制系统设计文库.doc
- 互联网的社会图谱.docx
- 学生成绩管理系统VB程序.doc
- 融人物联网技术的机电一体化专业改革思考.doc
- 单片机原理与接口技术课程设计.doc
- 区域高新技术产业集群创新网络结构特征研究.docx
- 网络素养与数据伦理.pptx
- 深厚表土冻结法凿井信息化施工管理体系系统的开发与应用.doc
- 基于单片机的电子时钟(毕业设计)doc先用.doc
- 最新深蓝色区块链商业策划书PPT背景ppt模板.pptx
- 电池供电电磁流量计新特点与软件特点.doc
- linux下nagios安装详解.doc
- web高校教师管理.doc
- PLC自动售货机.doc
- 基于英国BTEC模式的卫生类职校计算机课程改革研究.docx


