频道栏目
读书频道 > 软件开发 > C# > 精通C#游戏编程
8.2.5 法向量
2012-08-01 16:25:24     我来说两句
收藏   我要投稿

本文所属图书 > 精通C#游戏编程

本书通过引导读者创建一个基本的游戏,展示了如何使用c#和OpenGL一步步地开发出简单、整洁而可靠的代码。C#是一种高级编程语言,而OpenGL是业界显示图形最常用的方法。本书概述了创建优秀游戏项目时采用的方法和...  立即去当当网订购

法向量是长度为1的向量,也称为单位向量。单位向量是在不考虑大小时表示方向的绝佳方式。归一化(normalize)操作保持向量的方向不变,但是使其大小变为1。如果把一个单位向量与一个标量相乘,得到的向量的长度会与标量值相同。如果向量的长度未知,而想使其长度为6,就可以归一化该向量,然后乘以6。

public Vector Normalize(Vector v)

{

double r = v.Length();

if (r != 0.0) // guard against divide by zero

{

return new Vector(v.X / r, v.Y / r, v.Z / r); // normalize and return

}

else

{

return new Vector(0, 0, 0);

}

}

从技术上来说,这段代码并不正确,这是因为0向量是无法归一化的,而这段代码在归一化0向量时没有采取任何操作。通过计算向量的长度,然后把每个元素除以该长度,可以归一化向量。归一化向量的效果如图8-10所示。

\


在游戏编程中,方向很重要,它们通过法向量来定义。你可能听说过法线映射(normal mapping)这个词。那是一种纹理,其中每个像素代表一个法向量,纹理在3D模型中被拉伸,光照计算会考虑到渲染后的模型的每个像素上的法向量。法线映射使最终模型的表面上可以展现出比没有使用法线映射时多得多的细节。

假设有一个二维向量,它包含X元素和Y元素。可以分别使用[0,1]、[0,-1]、[-1,0]和[1,0]创建上、下、左、右4个向量。这创建了一个类似于十字的形状。如果在上、下、左、右4个向量之间再创建4个法向量,就可以开始模拟圆的过程了。这是一个单位圆,即其半径为1。图8-11显示了一个单位圆。如果使用3元素向量[X,Y,Z],那么就会创建一个单位球。如果所有向量的长度都为2,那么就会创建半径为2的球,以此类推。

\


测试圆或球与某个点是否相交十分简单,其实就是测试一个点是否在圆或者球内。以圆为例。圆通过圆心和半径定义。如果在[5,6]处有一个单位圆,要判断点[5.5,6.5]是否在该圆内,第一步是计算出该点与圆心的位置。这是通过对圆心的向量与该点的向量做减法得到的:[5, 6] - [5.5, 6.5] = [0.5, 0.5],减法的结果是从该点到圆心的一个向量。然后求出该向量的长度,也就是该点与圆的距离。计算得到的长度为0.707。如果这个长度小于圆的半径,那么点在圆内;如果长度大于圆的半径,则点在圆外。如果两者相等,则点在圆周上,如图8-12所示。

相同的方法也适用于球和点的相交性测试。这可以快速测试玩家是否在特定的位置,或者鼠标是否单击了特定的区域。如果不能想象出来,可以尝试在纸上绘制几个例子,直到自己熟悉了这种方法。此时,试着思考一下如何进行圆与圆或者球与球的相交性测试。

\


您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:8.2.4 向量加法、减法和乘法
下一篇:8.2.6 点积运算
相关文章
图文推荐
排行
热门
最新书评
特别推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站