OpenGL 入门教程(九)

OpenGL 入门教程(九)

本文源自:http://dev.gameres.com/Program/Visual/3D/OpenGLTutorial/OpenGL_9.htm

OpenGL中用表面来表示物体,一个物体就是一组平面。光线照射在平面上会产生反射,入射线与反射线的角平分线就是法线,它垂直于平面。面法线有两种可能的方向,我们称面有两侧。当描述封闭物体的外表面时,法线应该从内部指向外部;而表示在物体内部时,法线应该从外部指向内部。

用glNormal*(N_Vector);指定当前法向矢量。此后的顶点都会使用该法向,直到再次改变。

面的法向矢量是怎么确定的呢?右手手指沿顶点顺序握拳,拇指竖立所指方向即为一个面的法向,如果面对该平面,以逆时针序指定顶点,则法向指向你。当你用这样的顺序指定平面的顶点时,OpenGL能够正确的计算出法向矢量。法矢与顶点坐标一样要经过模型视矩阵变换,这样物体坐标系内的法向矢量就可以正确的变成世界坐标系内的法向矢量,保证最终生成的图像是正确的。

当一个顶点属于多个平面时,该顶点的法向应该取所在所有平面法向的平均值,以使表面棱角部份平滑自然的,否则会有一道黑线。

我们把平面的法向所指一侧称为前面,另一侧称为后面,可以为两侧分别指定不同的属性,所以glMaterial*命令的第一个参数必须是GL_FRONT/GL_BACK/GL_FRONT_AND_BACK之一。

下面这组图片展示了法向对场景的影响,角度表示图像是绕Y旋转多少后观察到的:

头两行中两三角法向从两者之间指向外部,简称外法向。
前三角的面法向(0,0,1),后三角的面法向(0,0,-1),光射线方向(0,0,-1)
第一行中,前三角,后三角呈现的是其GL_FRONT部份的材质
第二列中,两个三角形的前后关系已经反过来了。

三四两行中两三角法向从两者外部指向两者之间的内部,简称内法向。
前三角的面法向(0,0,-1),后三角的面法向(0,0,1),光射线方向(0,0,-1)。

第五行前两图中两三角法向相同均为(0,0,1)。

外法向的平面组可用来表示物体外观(外表面),第五行最后一张图则是这样表示的一个立方体。
内法向则适于表示从内部观察物体(灯光、视点均在内部,内表面),程序从略。

 察看图象 >>

双三角场景的
绘制程序代码如下:

  glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);   
glEnable(GL_LIGHTING);glEnable(GL_DEPTH_TEST);   
 glEnable(GL_COLOR_MATERIAL);  
 glEnable(GL_LIGHT0);   
glLoadIdentity();   
glRotatef(rot,0,1,0);//全局变量rot即为旋转角度
 glBegin(GL_TRIANGLES);   
glNormal3f(0.0,0.0,1.0);//法向与光射线指向同侧   
glColor3f(1.0,0.0,0.0);   
glVertex3f(-1.0,0.0,-0.30);   
glColor3f(0.0,1.0,0.0);   
glVertex3f(0.0,1.0,-0.30);   
glColor3f(0.0,0.0,1.0);   
glVertex3f(1.0,0.0,-0.30);     
glNormal3f(0.0,0.0,-1.0);//法向与光射线指向相反  
 glColor3f(1.0,0.0,0.0);   
glVertex3f(-1.0,0.0,0.0);  
 glColor3f(0.0,1.0,0.0);   
glVertex3f(0.0,1.0,0.0);   
glColor3f(0.0,0.0,1.0);   
glVertex3f(1.0,0.0,0.0); 
glEnd();

使用OpenGL默认的光照(光源在0,0,1沿-Z轴方向的白色平行光)和默认的平行投影。为简化代码,打开了GL_COLOR_MATERIAL直接用glColor设定顶点材质。另外为便于阅读图片做了减肥。
以上图片是在PII266/FireGL 1000pro/Win2000环境下获取的。

这两段代码都放在TOpenGL Panel的OnPaint事件里执行。

检讨:右边代码的法向全反了,如果你运行它就会发现虽然看起来仍是一个立方体,但是前后左右上下全都反过来了。这是因为各面法向朝里,前面的后侧对着我们,它不可见,看到的前面实际是后面前侧,而正常情况下后面应该会被前面挡住。

立方体场景的
绘制程序代码如下:

glBegin(GL_QUADS);   
glNormal3f(0,0,-1);    
glColor3f(1,0,0);   
glVertex3f(0,0,0);   
glVertex3f(1,0,0);   
glVertex3f(1,1,0);   
glVertex3f(0,1,0);    
glNormal3f(-1,0,0);//右   
glColor3f(0,1,0);  
 glVertex3f(1,0, 0);   
glVertex3f(1,0,-1);   
glVertex3f(1,1,-1);   
glVertex3f(1,1, 0);   
 glNormal3f(0,-1,0);//上   
glColor3f(0,0,1);   
glVertex3f(0,1, 0);   
glVertex3f(1,1, 0);   
glVertex3f(1,1,-1);   
glVertex3f(0,1,-1);    
glNormal3f(0,0,1); //后   
glColor3f(1,1,0);   
glVertex3f(0,1,-1);   
glVertex3f(1,1,-1);   
glVertex3f(1,0,-1);   
glVertex3f(0,0,-1);    
glNormal3f(1,0,0);//左   
glColor3f(0,1,1);   
glVertex3f(0,1, 0);   
glVertex3f(0,1,-1);   
glVertex3f(0,0,-1);   
glVertex3f(0,0, 0);    
glNormal3f(0,1,0);//下   
glColor3f(1,0,1);   
glVertex3f(0,0,-1);   
glVertex3f(1,0,-1);   
glVertex3f(1,0, 0);   
glVertex3f(0,0, 0); 
glEnd();
?
NEHE的OPENGL教程 第42课 多视窗口… NEHE的OPENGL教程 第42课 多视窗口… NeHe的OPENGL中文教程:第41课 体… NeHe的OPENGL中文教程:第40课 绳… NeHe的OPENGL中文教程:第39课 物… NeHe的OPENGL中文教程:第39课 物… NeHe的OPENGL中文教程:第38课 从… NeHe的OPENGL中文教程:第37课 卡… 愚人节十大IT假新闻:Opera浏览器… NeHe的OPENGL中文教程:第36课 放… NeHe的OPENGL中文教程:第35课 AVI… NeHe的OPENGL中文教程:第35课 AVI… NeHe的OPENGL中文教程:第34课 从… NeHe的OPENGL中文教程:第33课 加… NeHe的OPENGL中文教程:第32课 Alp… NeHe的OPENGL中文教程:第32课 Alp… NeHe的OPENGL中文教程:第32课 Alp… NeHe的OPENGL中文教程:第31课 模… NEHE的OPENGL中文教程:第30课 碰… NEHE的OPENGL中文教程:第30课 碰… NeHe的OPENGL中文教程:第29课 Bli… NeHe的OPENGL中文教程:第28课 贝… NeHe的OPENGL中文教程:第27课 影… NeHe的OPENGL中文教程:第26课剪裁… NeHe的OPENGL中文教程:第25课 变… NeHe的OPENGL中文教程:第24课 TAG… NeHe的OPENGL中文教程:第23课 球… NeHe的OPENGL中文教程:第22课 凸… NeHe的OPENGL中文教程:第22课 凸… NeHe的OPENGL中文教程:第21课 反… NeHe的OPENGL中文教程:第21课 反… NeHe的OPENGL中文教程:第20课 蒙… NeHe的OPENGL中文教程:第19课 粒… NeHe的OPENGL中文教程:第18课 二… NeHe的OPENGL中文教程:第17课 2D… NeHe的OPENGL中文教程:第16课 雾 NeHe的OPENGL中文教程:第15课 图… NeHe的OPENGL中文教程:第14课 图… NeHe的OPENGL中文教程:第13课 位… NeHe的OPENGL中文教程:第12课 显… NeHe的OPENGL中文教程:第11课 飘… NeHe的OPENGL中文教程:第十课 漫… NeHe的OPENGL中文教程:第课 漂… NeHe的OPENGL中文教程:第八课 Alp… NeHe的OPENGL中文教程:第七课 纹… NeHe的OPENGL中文教程:第七课 纹… NeHe的OPENGL中文教程:第六课 纹… NeHe的OPENGL中文教程:第五课 向3… NeHe的OPENGL中文教程:第四课 旋… NeHe的OPENGL中文教程:第三课 着… NeHe的OPENGL中文教程:第二课 多… NeHe的OPENGL中文教程:第一课 新… NeHe的OPENGL中文教程:第一课 新… DirectX与OpenGL方面的经典电子书… VC++ 6.0下OpengGL配置以及glut配… 怎样开始学习OpenGL
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值