首页 | 互联网 | IT动态 | IT培训 | Cisco | Windows | Linux | Java | .Net | Oracle | 软件测试 | C/C++ | 嵌入式开发 | 存储世界 | 服务器
网络设备 | IDC | 安全 | 求职招聘 | 数字网校 | 网页设计 | 平面设计 | 技术专题 | 电子书下载 | 教学视频 | 源码下载 | 搜索 | 博客 | 论坛
 您现在的位置: 中国IT实验室 >> 游戏开发 >> 游戏开发入门 >> 正文
游戏制作详解自----OpenGL 入门教程(九)
来源:ChinaItLab 作者: 时间:2004-12-29


  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();
【责编:admin】

中国IT教育热线咨询

相关文章
dx8中关于用索引缓冲渲染索引图元
作为一个状态机的OpenGL
OGRE中的四元数与旋转
[RGSS]Sprite类方法教学
[RGSS]去掉“战斗|逃跑”选项
推荐文章

 精彩友情推荐
·Asp源码 PHP源码
·CGI源码 JSP源码
·建站书籍教程
·服务器软件 .net源码
·建站工具软件
·IDC资讯大全
·机房品质万里行
·IDC托管必备知识
·全国IDC报价
·网站推广优化
 基础入门  开发文档
 最新推荐
  多数的Windows程序都需要Windows.h和Windowsx.h这两个头文件,要确保使用它们。当然,你还需要其它......
游戏引擎演化史
在Windows上安装OGRE的方法
关于滤镜遮罩概念,Sobel 遮罩
游戏开发新手入门之Windows编程
游戏开发新手入门之位图化图形
教你实现卡通渲染的另类勾边方法
游戏设计大师谈如何成为一名游戏设
Visual C#编写 3D游戏框架示例
真正的 Java 学习从入门到精通
游戏开发经验——游戏开发的基本常
  为什么要研究攻击行为在人类有记载的5600年的历史中,共计发生了14,400次战争;今天,平均一天要发生............
游戏开发中显示对话的特殊句法
游戏原型设计的介绍
网络游戏中的攻击行为
谈动作类游戏的必要条件
规则的多元分析模式
载入位图文件到DirectDraw
Archer Game Suite 是什么?
浅谈游戏企划-新手入门篇
暴雪称霸游戏业界的六大秘密绝招
骨骼动画及示例Skinned Mesh的解析
  培训中心