### 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币余额
我的收藏
我的下载
下载帮助


最新资源
- 基于MATLAB的数字基带调制课程设计报告.doc
- 论工程造价管理未来发展趋势之信息化管理.docx
- (理科选修)基因工程的应用.ppt
- DevOps企业运用分析.docx
- ACCESS课程设计方案(论文)酒店管理系统[]7.doc
- 软件企业所得税政策解读.ppt
- 基于java的主流测试框架junit-powermock-spy源码.zip
- PPT模板:粉色小清新老师说课信息化教学设计PPT.pptx
- 云计算在港口行业中应用研究方案.docx
- 城市交通信号机的硬件设计.doc
- 【ppt可编辑模板】灰色简约风格互联网商业计划书PPT背景.pptx
- 基于wifi无线终端的物联网应用在高校物教学改革中面临的挑战及对策研究.docx
- 电气工程自动化系统建设中对智能化技术的应用.docx
- Matlab和双线性变换滤波器设计方案.doc
- PLC控制三相异步电动机.doc
- 几种有效的数值算法.ppt


