博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
游戏制作详解自----OpenGL入门教程(九)(转)
阅读量:2449 次
发布时间:2019-05-10

本文共 2954 字,大约阅读时间需要 9 分钟。

游戏制作详解自----OpenGL入门教程(九)(转)[@more@]

  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()

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/8225414/viewspace-951755/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/8225414/viewspace-951755/

你可能感兴趣的文章
python 图像格式转换_如何用六行Python构建图像类型转换器
查看>>
url散列算法原理_如何列出与网站相关的所有URL
查看>>
如何在React Native中创建精美的动画加载器
查看>>
谷歌聊天机器人api_如何编写针对Google地图等网络应用量身定制的聊天机器人
查看>>
npm和angular_如何开发,使用和发布Angular库到NPM
查看>>
为什么要远离对日外包_远离魔法-或:为什么我不想再使用Laravel
查看>>
二进制数据结构:JavaScript中的树和堆简介
查看>>
如何开始使用centos_如何开始使用CentOS
查看>>
错过校招_您可能错过的Web优化技巧
查看>>
travis-ci自动部署_如何使用Travis CI设置高级自动部署
查看>>
机器学习与分布式机器学习_这就是为什么任何人都可以学习机器学习的原因
查看>>
django 部署_狂野的Django:部署生存的技巧
查看>>
actor akka_如果您仍在使用同步,则应改用Akka Actor-这就是为什么
查看>>
一个数据包的旅程_数据科学语言的个人旅程
查看>>
面向前端开发人员的Visual Studio Code概述
查看>>
2017年最喜欢的Visual Studio代码扩展
查看>>
gvim文本编辑器帮助_如何帮助您的文本编辑器帮助您
查看>>
函数setState是React的未来
查看>>
javascript使用_用JavaScript唤醒沉睡的城市
查看>>
山东大学有人陪!真的吗?_10,000小时! 您真的需要那么多吗?
查看>>