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();
|
?
|
相关推荐
### OpenGL入门教程知识点详解 #### 一、OpenGL简介与优势 **OpenGL** 是一种跨语言、跨平台的应用程序编程接口(API),主要用于渲染2D、3D矢量图形。它是图形学领域的一个重要标准,被广泛应用于游戏开发、虚拟...
OpenGL入门教程实例 OpenGL入门教程实例 OpenGL入门教程实例 OpenGL入门教程实例 OpenGL入门教程实例 OpenGL入门教程实例 OpenGL入门教程实例
OpenGL入门教程(精)
入门教程内容: - 学习OpenGL能使人掌握创建绚丽PC游戏所必需的编程技能,突破老旧图形接口的限制。 - OpenGL之所以是主流图形API之一,是因为它具有与C语言的紧密结合、优秀的可移植性以及高性能的图形渲染能力。 -...
### OpenGL入门经典教程知识点概述 #### 一、OpenGL简介及特点 - **替代传统图形库**:传统的图形库,如TC中的`<graphics.h>`,虽然简单易用,但功能有限,仅支持较低分辨率(例如640x480)和较少的颜色模式(如16...
OpenGL入门教程是学习图形编程的重要资源,特别是对于初学者来说,它能帮助理解3D图形渲染的基本原理。OpenGL是一个跨语言、跨平台的编程接口,用于渲染2D、3D图像。在这个“OpenGL入门教程(精选)相关例子试验代码...
OpenGL入门教程12讲代码加解析
OpenGL入门教程 OpenGL入门教程 OpenGL入门教程
OpenGL入门教程旨在帮助初学者快速掌握这一强大的图形编程接口,为3D图形处理打下坚实的基础。OpenGL是一种跨语言、跨平台的编程接口,用于渲染2D、3D矢量图形。它广泛应用于游戏开发、科学可视化、工程设计等多个...
OpenGL入门教程旨在帮助初学者掌握这个强大的图形编程接口。OpenGL是一个跨语言、跨平台的编程接口,用于渲染2D和3D图形。它的核心库包含了115个基础函数,这些函数可在任何支持OpenGL的平台上运行。在此基础上,...
### OpenGL入门教程知识点详解 #### 一、OpenGL简介与优势 **OpenGL**(Open Graphics Library)是一种跨语言、跨平台的应用程序编程接口(API),主要用于渲染2D、3D矢量图形。它由一系列调用构成,这些调用定义...
android OpenGL 入门 教程 12 个小case 。
OpenGL教程.pdf
opengl教程,轻松入门 opengl教程,轻松入门 opengl教程,轻松入门 opengl教程,轻松入门
QT opengl入门教程案例
android2.2 opengl es 2.0 入门基础代码教程 通过简单代码总结,帮助新手入门。 内容包括:绘制基础、投影方式、光照效果、纹理绘制几个方面。