📄 01_9_13_24.asp.html
字号:
<html><head><meta http-equiv='Content-Type' content='text/html; charset=gb2312'>
<TITLE>计算机世界网-利用OpenGL实现三维绘图</TITLE></HEAD>
<style>
.a14{font-size:14px;text-indent:25px;line-height:20px}
.f{font-size:18px;color=#0f3ccd}
img{border:0px;}
td,p,input{font-fammily:verdana,宋体;font-size:12px;}
A:link {text-decoration:none;color:black}
A:visited {text-decoration:none;color:#80006f}
A:hover {text-decoration:underline;color:black}
</style>
<center>
<BODY topmargin=2 leftmargin=0>
<style>
.v12{font-size:10pt;color:"#ffffff";FONT-WEIGHT: bold}
.v14{font-size:14px;text-indent:25px;line-height:20px}
img{border:0px;}
td,p,input,select{font-fammily:verdana,宋体;font-size:12px;}
A:link {text-decoration:none;color:black}
A:visited {text-decoration:none;color:#80006f}
A:hover {text-decoration:underline;color:black}
</style>
<style>
.v13{font-size:10pt;color:"#ffffff";FONT-WEIGHT: bold}
.v12{font-size:13px;color:"#4C029C";FONT-WEIGHT: bold}
.v14{font-size:14px;text-indent:25px;line-height:20px}
img{border:0px;}
td,p,input,select{font-fammily:verdana,宋体;font-size:12px;}
A:link {text-decoration:none;color:black}
A:visited {text-decoration:none;color:#80006f}
A:hover {text-decoration:underline;color:black}
</style>
<!--头-->
<table align=center cellpadding="0" cellspacing="0" border="0" width="767">
<tr><td valign=bottom>
<table cellpadding="0" cellspacing="0" border=0>
<tr><td valign=top><img src="../../../../../center/image/ccwlogo.gif"></td></tr>
<tr><td height="27" valign=top><img src="../../../../../center/image/knowledge.gif" width="207" height="27"></td></tr>
</table></td>
<td valign=bottom width=556 bgcolor="#4c029c" height=96>
<table cellpadding="0" cellspacing="0" border=0 width=556 bgcolor="#4c029c" height=96>
<tr><td height=25 valign=bottom bgcolor="#ffffff" colspan=2 ><img src="../../../../../image2002/top.gif" usemap="#F"></td></tr>
<tr valign=middle >
<td align=center valign=middle height="60" align=center>
<!-- <a href="http://www.ccw.com.cn/search/" target=_blank><img src="../../../../../img2/esearch.GIF" border=0 width=468 height=60></a> --><a href="http://www.ccw.com.cn/html/search/thememail/" target=_blank><img src="../../../../../img2/topbanner_thememail.GIF" border=0 width=468 height=60></a>
</td>
<td align=center width=15%>
<table width=95%>
<tr><td><a href="mailto:center@ccw.com.cn?subject=我要投稿:" target=_blank><font class=v13>我要投稿</a><br><a href="mailto:center@ccw.com.cn?subject=编读往来"><font class=v13>编读往来</a><br><a href="javascript:AddBookMark('计算机世界网首页')"><font class=v13>加入收藏</a></font></td></tr>
</table>
</td>
</tr>
<tr><td bgcolor="#ffffff" height=1 colspan=2 ></td></tr>
<tr><td bgcolor="#b4aafc" height=2 colspan=2 ></td></tr></table>
<map name="F">
<area href="http://www.ccw.com.cn/" shape="rect" coords="29, 3, 61, 18" target=_blank>
<area href="http://www.ccw.com.cn/news1/" shape="rect" coords="72, 3, 143, 18" target=_blank>
<area href="http://www.ccw.com.cn/center/" shape="rect" coords="155, 2, 216, 18" target=_blank>
<area href="http://www.ccw.com.cn/work/" shape="rect" coords="225, 2, 299, 18" target=_blank>
<area href="http://www.ccw.com.cn/search/" shape="rect" coords="310, 3, 364, 19" target=_blank>
<area href="http://www3.ccw.com.cn/" shape="rect" coords="372, 2, 412, 19" target=_blank>
<area href="http://www2.ccw.com.cn/" shape="rect" coords="424, 2, 550, 18" target=_blank></map>
</td></tr>
<tr><td colspan=2 bgcolor="#b4aafc">
<table border=0 cellpadding=0 cellspacing=0 width=100%>
<tr>
<td width=26% align=center><font class=v12>【2003年6月24日】 </font></td>
<td CLASS=V12> <a href="http://www.ccw.com.cn/center/topic.asp">专 题</a> /</td>
<td CLASS=V12><a href="http://www.ccw.com.cn/center/tech.asp">技 术</a> /</td>
<td CLASS=V12><a href="http://www.ccw.com.cn/center/prod.asp">产 品</a> /</td>
<td CLASS=V12><a href="http://www.ccw.com.cn/center/app.asp">应 用</a> /</td>
<td CLASS=V12><a href="http://www.ccw.com.cn/center/net.asp">网 络</a> /</td>
<td CLASS=V12><a href="http://www.ccw.com.cn/center/prog.asp">编 程</a> /</td>
<td CLASS=V12><a href="http://www.ccw.com.cn/center/skill.asp">技 巧</a> </td>
</tr>
</table>
</td></tr>
</table>
<table align=center width=728>
<tr><td align=center><br><h2><font color='#0f3ccd'>利用OpenGL实现三维绘图</font></h2>
<br><b>王刚</b>
</td></tr><tr><td align=right>01-9-13 下午 04:33:51<br><hr size=1 width=718 color=#f46240></td></tr></table><br>
<table align=center width=728><tr><td valign=top width=600>
<table width=100% ><tr>
<td class=a14><b>摘要: </b></td>
</tr></table><table width=100% ><tr>
<td class=a14> 本文主要介绍OpenGL编程的基本概念、步骤,以及如何利用OpenGL函数库实现三维绘图。</td>
</tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr>
<td class=a14> <b>前言: </b></td>
</tr></table><table width=100% ><tr><td class=a14>
在三维绘图蓬勃发展的过程中,计算机公司推出了大量的三维绘图软件包。其中SGI公司推出的OpenGL,作为一个性能优越的图形应用程序设计界面(API)异军突起,取得了很大的成就。它以高性能的交互式三维图形建模能力和易于编程开发,得到了Microsoft、 IBM、 DEC、 Sun、 HP等大公司的认同。因此,OpenGL已经成为一种三维图形开发标准,是从事三维图形开发工作的必要工具。 </td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr>
<td class=a14> <b>一.初始化OpenGL绘图环境 </b></td>
</tr></table><table width=100% ><tr><td class=a14>
1. 定义颜色格式和缓冲模式 </td></tr></table><table width=100% ><tr><td class=a14>
OpenGL提供两种颜色模式:RGB(RGBA)模式和颜色索引模式。在RGBA模式下所有颜色的定义用RGB三个值来表示,有时也加上Alpha值(表示透明度)。RGB三个分量值的范围都在0和1 之间,它们在最终颜色中所占的比例与它们的值成正比。如:(1,1,0)表示黄色,(0,0,1)表示蓝色。颜色索引模式下每个象素的颜色是用颜色索引表中的某个颜色索引值表示(类似于从调色板中选取颜色)。由于三维图形处理中要求颜色灵活,而且在阴影,光照,雾化,融合等效果处理中RGBA 的效果要比颜色索引模式好,所以,在编程时大多采用RGBA模式。 </td></tr></table><table width=100% ><tr><td class=a14>
OpenGL提供了双缓存来绘制图像。即在显示前台缓存中的图像同时,后台缓存绘制第二幅图像。当后台绘制完成后,后台缓存中的图像就显示出来,此时原来的前台缓存开始绘制第三幅图像,如此循环往复,以增加图像的输出速度。 </td></tr></table><table width=100% ><tr><td class=a14>
设置窗口显示模式函数: </td></tr></table><table width=100% ><tr><td class=a14>
void auxInitDisplayMode( </td></tr></table><table width=100% ><tr><td class=a14>
AUX_DOUBLE//双缓存方式 </td></tr></table><table width=100% ><tr><td class=a14>
|AUX_RGBA);//RGBA颜色模式 </td></tr></table><table width=100% ><tr><td class=a14>
2.设置光源 </td></tr></table><table width=100% ><tr><td class=a14>
OpenGL的光源大体分为三种:环境光(Ambient light),即来自于周围环境没有固定方向的光。漫射光(Diffuse light)来自同一个方向,照射到物体表面时在物体的各个方向上均匀发散。镜面光(Specular light)则是来自于同一方向,也沿同一个方向反射。全局环境光是一种特殊的环境光,它不来自特于某种定光源,通常做为场景的自然光源。 </td></tr></table><table width=100% ><tr><td class=a14>
指定光源函数: </td></tr></table><table width=100% ><tr><td class=a14>
Void glLightfv(Glenum light, //光源号 </td></tr></table><table width=100% ><tr><td class=a14>
Glenum pname, //指明光源种类 </td></tr></table><table width=100% ><tr><td class=a14>
//GL_DIFFUSE 光源为漫射光光源 </td></tr></table><table width=100% ><tr><td class=a14>
//GL_AMBIENT 光源为环境光光源 </td></tr></table><table width=100% ><tr><td class=a14>
//GL_SPECULAR 光源为镜面光光源 </td></tr></table><table width=100% ><tr><td class=a14>
const Glfloat* params);//指向颜色向量的指针 </td></tr></table><table width=100% ><tr><td class=a14>
设置全局环境光函数: </td></tr></table><table width=100% ><tr><td class=a14>
void glLightModelfv( GL_LIGHT_MODEL_ </td></tr></table><table width=100% ><tr><td class=a14>
AMBIENT, const Glfloat* param ); </td></tr></table><table width=100% ><tr><td class=a14>
//param 指向颜色向量的指针 </td></tr></table><table width=100% ><tr><td class=a14>
起用光源函数: </td></tr></table><table width=100% ><tr><td class=a14>
void glEnable(GL_LIGHTING); </td></tr></table><table width=100% ><tr><td class=a14>
void glEnable(GL_enum cap);// cap :指明光源号 </td></tr></table><table width=100% ><tr><td class=a14>
3. 设置材质 </td></tr></table><table width=100% ><tr><td class=a14>
在OpenGL中,用材料对光的三原色(红绿蓝)的反射率大小来定义材料的颜色。与光源相对应,材料的颜色,也分为环境色,漫反射色和镜面反射色,由此决定该材料对应不同的光呈现出不同的反射率。由于人所看到物体的颜色是光源发出的光经物体反射后进入眼睛的颜色。所以,物体的颜色是光源的环境光,漫反射光和镜面反射光与材料的环境色,漫反射色和镜面反射色的综合。例如:OpenGL 的光源色是(LR,LG,LB),材质色为(MR,MG,MB),那么,在忽略其他反射效果的情况下,最终进入眼睛的颜色是(LR*MR,LG*MG,LB*MB)。 </td></tr></table><table width=100% ><tr><td class=a14>
材质定义函数: </td></tr></table><table width=100% ><tr><td class=a14>
void glMaterialfv( GLenum face, //指明在设置材质 </td></tr></table><table width=100% ><tr><td class=a14>
的哪个表面的颜色。可以是GL_FRONT, GL_BACK,或GL_FRONT_AND_BACK </td></tr></table><table width=100% ><tr><td class=a14>
GLenum pname,//与光源的pname参数相似 </td></tr></table><table width=100% ><tr><td class=a14>
const float* params);//指向材质的颜色向量 </td></tr></table><table width=100% ><tr><td class=a14>
4.定义投影方式 </td></tr></table><table width=100% ><tr><td class=a14>
也即选择观察物体的角度和范围。由于我们是三维绘图,所以采用不同的视点和观察范围,就会产生不同的观察效果。由于计算机只能显示二维图形,所以在表示真实世界中的三维图形时,需将三维视景转换成二维视景。这是产生三维立体效果的关键。OpenGL提供了两种将3D图形转换成2D图形的方式。正投影(Orthographic Projection)和透视投影(Perspective Projection)。其中,正投影指投影后物体的大小与视点的远近无关,通常用于CAD设计;而透视投影则符合人的心理习惯,离视点近的物体大,离视点远的物体小。此外,在OpenGL中还要定义投影范围,只有在该范围中的物体才会被投射到计算机屏幕上,投影范围外的物体将被裁减掉。 </td></tr></table><table width=100% ><tr><td class=a14>
定义投影范围(不同的投影方式对应不同函数): </td></tr></table><table width=100% ><tr><td class=a14>
void glOrtho( GLdouble left, GLdouble right, </td></tr></table><table width=100% ><tr><td class=a14>
GLdouble bottom, GLdouble top, </td></tr></table><table width=100% ><tr><td class=a14>
GLdouble near,GLdouble far); </td></tr></table><table width=100% ><tr><td class=a14>
//(left,bottom,near)和(right,top,far)分别给出正射投 </td></tr></table><table width=100% ><tr><td class=a14>
//影投影范围的左下角和右上角的坐标。 </td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr>
<td class=a14> <b>二.定义与Windows接口的系统函数 </b></td>
</tr></table><table width=100% ><tr><td class=a14>
1.定义绘图窗口的位置: </td></tr></table><table width=100% ><tr><td class=a14>
void auxInitPosition(GLint x,GLint y,GLsizei width, GLsizei heigh);// (x,y)给出窗口左上角坐标 </td></tr></table><table width=100% ><tr><td class=a14>
// width和 heigh给出窗口的宽高 </td></tr></table><table width=100% ><tr><td class=a14>
2.定义绘图窗口的标题: </td></tr></table><table width=100% ><tr><td class=a14>
void auxInitWindow(GLbyte* 窗口标题字串); </td></tr></table><table width=100% ><tr><td class=a14>
3.定义绘图窗口改变时的窗口刷新函数: </td></tr></table><table width=100% ><tr><td class=a14>
void auxReshapeFunc(回调函数名称); </td></tr></table><table width=100% ><tr><td class=a14>
//当窗口改变形状时调指定的回调函数 </td></tr></table><table width=100% ><tr><td class=a14>
4.定义空闲状态的空闲状态函数以实现动画: </td></tr></table><table width=100% ><tr><td class=a14>
void auxIdleFunc(回调函数名称); </td></tr></table><table width=100% ><tr><td class=a14>
//当系统空闲时调用指定的回调函数 </td></tr></table><table width=100% ><tr><td class=a14>
5.定义场景绘制函数(当窗口更新或场景改变时调用): </td></tr></table><table width=100% ><tr><td class=a14>
void auxMainLoop(回调函数名称); </td></tr></table><table width=100% ><tr><td class=a14>
//当窗口需要更新或场景变化时调用 </td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr>
<td class=a14> <b>三.VC下实现 </b></td>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -