我们所感知到的世界是一个几何的世界, 物理的世界. 从感观上我们很容易描述这个世界, 但是计算机不能接受这种描述方式. 计算机需要的是更加抽象的表达方式. 长期以来, 数学家发展出了用数学概念来抽象出现实世界的方式. 计算机接受的就是这种数学的方式. 这篇文章是 "游戏中的基本数学概念" 的第一篇, 它要介绍的是构成我们三维游戏世界的基本元素--矢量与点.

在游戏中, 矢量 (Vector> 和点 (Point) 是构成我们三维世界的基本元素. 其它元素, 从简单的线 (Line), 面 (Plane), 到复杂的视觉平截体 (View Frustm) 都是由矢量和点组合而成的. 要正确有效地编程, 理解相关的知识非常重要.

在游戏中矢量经常应用在两个方面. 第一个是用来表示方向. 例如表示三角形的法线 (Normal) 方向. 另一个例子是用矢量表示游戏中摄像机 (Camera) 面对的方向. 矢量的第二个用处是用来描述变化. 在游戏中我们常常利用速度来计算物体位置的变化, 这个速度其实就是一种矢量.

图一所示就是一个矢量. 矢量有大小和方向. 矢量的大小很好理解, 它就是矢量的长度. 对三维空间矢量v = < x, y, z >而言:

矢量的方向也很好理解, 但它在程序中的描述要复杂一些. 矢量的方向可由矢量v本身描述, 但通常我们都用单位矢量来描述方向, 即

v = v / ||v||

没有线性代数基础的读者可能会不能理解上面的描述. 我将从几何角度作进一步的分析. 从几何上来说, 矢量的箭头指向就是它的方向. 这虽然容易理解, 但是在程序中我们难以表达和保存这种概念. 我们需要更抽象的数学表达方法. 前面我们说了矢量本身就能描述方向. 那么矢量保存的 < x, y, z > 怎样和箭头的指向建立联系呢? 这时候矢量的点积 (Dot Product) 就派上了用场.

u * v = ||u|| ||v|| cosá

考虑uv是两个用单位矢量表示的方向, 就有

||u|| = ||v|| = 1.0.
u * v = cosá -------- (1)

所以两个单位矢量的点积就描述了这两个矢量之间的夹角. 在三维游戏中, 我们经常定义三个标准方向i: <1, 0, 0>, j: <0, 1, 0>, k: <0, 0, 1>. 然后任意矢量的方向都能用它与这三个标准方向的点积来表示. 例如对矢量u = < ux, uy, uz > 而言, 由公式(1)我们可以得到:

cosá = u * i = ux * 1 + uy * 0 + uz * 0 = ux

从以上推导可知, ux反映的是矢量u与标准矢量i的夹角. 同理, 我们可以得出uy和uz反映的是矢量u分别与标准矢量jk的夹角. 这样一来, 我们得出了结论, 矢量的方向是相对于标准矢量的. 在我们确定一组标准矢量后 (对三维空间来说, 一组意味着三个标准矢量) , 任意矢量的方向都能用它与这三个标准矢量的夹角来表示.

点是构成三维游戏世界的另外一个要素. 它比矢量更容易理解. 点在游戏中被用来标识位置. 三维模型由许多的三角形组成. 每个三角形由三个点来标识三角形三个顶点的位置 (具体见"三维模型--简单的三维模型"). 物体在空间中的位置也要由点来标识.

与矢量相似, 空间任意一点的位置也是相对的. 它们的位置都是相对于空间中某一参照点的位置. 这个参照点就叫做原点 (Origin). 原点的选择与标准方向一样也是可变的. 一个原点与一组标准方向一起决定了一个坐标系, 如图二 (在游戏中通常用到的都是这种坐标系, 称为笛卡尔坐标系). 坐标系确定以后, 空间中的任意一点都能用该坐标系的原点和标准方向唯一决定, 表达的方式是一组实数 < x, y, z >. 它和空间中的点一一对应. 矢量的确定不需要原点的概念, 空间中的任意矢量通过一组标准方向就能唯一决定. 表达的方式也是一组实数 < x, y, z >.

在游戏中点与矢量通常都有相同的表示方式 ( < x, y, z > ), 但它们是完全不同的两个概念. 对它们的操作也不尽相同. 认识到这一点对正确的编程和使用标准的库函数都非常重要. 例如: 对两点来说, 它们之间有距离的概念, 但对矢量而言, 距离毫无意义. 同样, 对点来说, 很难想象夹角有什么意义, 但对矢量而言, 这是它的基本意义. 这些都是不难理解的. 下面给出点和矢量之间的合法运算.

1) 如果我们有两点P, Q, 那么

u = P - Q

代表了一个矢量. 它的大小是P, Q两点之间的距离, 方向则是从Q点指向P的方向.

2) 如果我们有一点P和一个矢量u, 那么

Q = P + u

标识了一个点Q. Q点在空间的位置是P点沿着u矢量的方向移动||u||单位 (u矢量的长度) 得到的位置.

需要指出的是: 在一个游戏中常常会应用到多个标准方向和原点. 不同的标准方向和原点的选择对应了不同的坐标系. 这样就涉及到不同坐标系之间的变换. 这是掌握三维游戏编程的又一个重点

转载自:http://www.gametechzone.net/content/view/28/1/

游戏中的基本数学概念-矢量与点(转载)相关推荐

  1. python画海绵宝宝_《1,2,3到动物园》数数书,适合幼儿园小班宝宝亲子共读,从游戏中了解数字的概念...

    大家好,我是神桐妈妈,最近开始陆续给几个幼儿园做了有关绘本方面的师资培训,然后又有新的幼儿园要有了嵌入式幼儿园绘本馆,有了绘本,有了书香氛围,又有孩子们开始接触绘本,每天拿着一本绘本带回家,和爸爸或者 ...

  2. 图像算法中常用的数学概念

    1.最大似然法 最大似然估计,就是利用已知的样本结果,反推最有可能(最大概率)导致这样结果的参数值(模型已知,参数未知) 2.概率密度函数PDF 概率密度函数定义:当试验次数无限增加,直方图趋近于光滑 ...

  3. 游戏中的数学与物理学 第二版_在游戏中启蒙幼儿的数学能力和逻辑思维能力...

    同事奥北是个很有教育想法的妈妈,怀孕的时候就学习很多育儿知识,孩子出生后,她就在生活中,有意识的去培养孩子的各种能力.最近,孩子到了3岁后,她想要开始逐步培养孩子良好的逻辑思维能力.她本想着送孩子到早 ...

  4. 游戏中的图像资源(位图与矢量图比较)

    当今游戏早已不再是黑白机的时代,游戏都由色彩丰富.精致的图像,流畅的动画构成.Flash游戏也不例外,Flash既支持矢量图又支持位图,他们各有优缺点.本文的目的即是介绍何时使用矢量图,何时使用位图, ...

  5. 漫谈游戏中的人工智能

    今天我们来谈一下游戏中的人工智能.当然,内容可能不仅仅限于游戏人工智能,还会扩展一些其他的话题. 游戏中的人工智能,其实还是算是游戏开发中有点挑战性的模块,说简单点呢,是状态机,说复杂点呢,是可以帮你 ...

  6. pca数学推导_PCA背后的统计和数学概念

    pca数学推导 As I promised in the previous article, Principal Component Analysis (PCA) with Scikit-learn, ...

  7. 3D游戏中的数学运用

    原创文章如需转载请注明:转载自 脱莫柔Unity3D学习之旅 Unity3D引擎技术交流QQ群:[119706192]本文链接地址: 3D游戏中的数学运用 [01]3D游戏数学简介 总导:游戏中会使用 ...

  8. 游戏中的数学与物理学 第二版_在数学课堂中适度开展游戏活动,可以提高课堂教学效率...

    [摘要]小学生是以无意注意为主的,而无意注意又受兴趣的影响,更何况数学是一门比较抽象的学科.因此,在数学课中适度引入游戏是很有必要的.基于学生的心理特征,学生需要游戏,恰当的游戏不仅能够调节课堂气氛, ...

  9. 算法中的一些数学问题分享,ICG游戏

    1,石子游戏 题目出处 https://leetcode-cn.com/problems/stone-game/ 亚历克斯和李用几堆石子在做游戏.偶数堆石子排成一行,每堆都有正整数颗石子 piles[ ...

最新文章

  1. keras 的 example 文件 babi_rnn.py 解析
  2. 新疆兵团开展迎新春“送文化下基层”慰问演出活动
  3. c语言utc时间转换北京时间_C/C++标准库之转换UTC时间到local本地时间详解
  4. Xen Server二安装xc及管理xen主机
  5. BZOJ 1631: [Usaco2007 Feb]Cow Party【最短路】
  6. MySQL优化--where条件字段的顺序对效率的影响 (02)
  7. 3项目里面全局用less变量 cli vue_vue-cli3 如何全局引入less变量
  8. 解决IDEA修改已有项目为maven项目时目录结构被改变的问题
  9. 关于一些电脑使用的小技巧
  10. 《电路分析导论(原书第12版)》一2.8 导体和绝缘体
  11. stft isar成像 matlab,基于时频分析的ISAR成像
  12. win7旗舰版系统如何重装系统win10
  13. Fildder之Mac安装
  14. 对“才鸟”——动态显示扩展数据的改写
  15. 冒险岛PHP源码,岁月最新源码 岁月冒险岛端源码。。部分源码需要的拿走了、不谢!!! 联合开发网 - pudn.com...
  16. 计算机做游戏软件视频,电脑上录制游戏视频用什么软件好?专业的游戏录制软件推荐...
  17. ucserver admin.php,Discuz!X3.2 升级后【ucenter、uc_server密码正确无法登录后台的解决方法】...
  18. python爬取京东商品图片_Python---爬取京东商城的图片
  19. Appgamekit制作消消乐小游戏(附代码)# 4
  20. perl linux yum,Linux CentOS6.5(x86_64)安装Perl5.26

热门文章

  1. C C++基础的Java教程
  2. 由于找不到opencv_world310d.dll,无法继续执行代码。重新安装程序可能会解决此问题。
  3. 关于操作Excel的各种库及方法
  4. svn分支合并到主干可能出现异常信息
  5. `云国` 数字公民 · 技术趋势
  6. DNS和IP的WHOIS查询
  7. 上海师范大学计算机科学与技术中法合作,2009年度上海师范大学计算机科学与技术专业(中法合作...
  8. linux中怎么卸载tree,Liunx系统命令中tree命令详解
  9. 人工智能数学基础--概率与统计11:离散随机变量的超几何分布和负二项分布
  10. 地信遥感专业(本科、研究生小白适用)的网站资源分享(持续更新)