原创文章如需转载请注明:转载自 脱莫柔Unity3D学习之旅 Unity3D引擎技术交流QQ群:【119706192】本文链接地址: 3D游戏中的数学运用

【01】3D游戏数学简介

总导:游戏中会使用到的数学有:三角学、微积分、物理学、代数学、统计学。

在学习3D游戏编程的时候,对于所需要的基础数学知识有:

矢量、矩阵、四元数、射线、平面、多边形、简单的物理学。

1、矢量

矢量是游戏开发中涉及的最基本对象,矢量有多种形式,可以是2D、3D或者4D等。3D矢量是一个包含3个浮点数的结构体,每个成员的值代表矢量中不同的轴,也就是x、y、z轴,用于描述三维空间。矢量也可以用于描述3D空间中的方向,它可能是3D编程中最常用的数学对象。

2、矩阵

矩阵是游戏开发中第二个最常用数学对象。矩阵的主要用于将矢量从一个坐标系转换到另一个坐标系,还可以用于旋转和平移等。矩阵由浮点数的2D数组组成。3x3矩阵有3行3列共9个元素组成,4x4矩阵则由4行4列共16个浮点元素组成的2D数组。最常用的有3x3、3x4、4x4矩阵。程序中定义如下:

float matrix3x3[3][3];float matrix3x4[3][4];float matrix4x4[4][4];

3、四元组

四元组用于描述旋转。四元组石油 4个浮点数w、x、y、z构成的结构体,像4D矢量。虽然矩阵也可以用于旋转,但使用四元组更好,因为四元组只有4个浮点数,而矩阵有16个浮点数(对 4x4矩阵而言)。这意味着存储四元组所需的内存空间比存储矩阵所需的内存空间要少,另外四元组的数学操作也要少些,这使得四元组的计算速度更快。在处理 旋转时,四元组同样比矩阵更平滑。

4、射线

射线用于描述位置和方向。射线有原点,既射线的开始位置,方向就是射线指向的地方。射线包含两个矢量,一个代表位置,一个代表方向。通常,射线用于碰撞检测。

5、平面

平面是在区域上无限扩展的网格。可以将平面当作是沿地无限延伸的面。平面无限窄,而且没有边界。

6、多边形

多边形是封闭的区域,它有边界,而且大小有限。比如3各点相互连接构成3跳线,而3点3线构成一个3角面。这是一个计算机图像中最基本的多边形。

7、物理学

在游戏中最基本的是重力和碰撞。但这也仅是物理学的冰山一角。

【2】向量及其运算

    向量也可以叫作矢量,英文名Vector,在3D中可以表示坐标系里的位置或方向。向量不同于标量,标量只能表示大小,而向量即有大小又有方向。具体在3D图形学中,向量可以表示粒子的速度、加速度和光线方向等既有大小又有方向的量。

向量的数学运算:

1、向量的长度与归一化

使用向量时经常遇到一个问题是计算一个向量的长度。向量的长度在数学上也称为范数Norm。从几何上表示,向量的长度是从向量原点到向量终点的距离。要计算一个向量的长度,应用一下公式即可:

即:向量V的模(向量V的长度)|v| = sqrt(v.x^2+v.y^2+v.z^2)

知道向量的长度后,就可以对其进行归一化(normalize)处理了,归一化既对向量进行缩放,使其长度为1.0,并且方向保持不变。对一个向量进行归一化,可以使用以下公式:

既:v = V/|V|

2、向量的点积

如果学过线性代数,肯定听过向量的点乘和叉乘的概念,在这里叫做点积和叉积。两个向量的点积得到一个数,两个向量的叉积得到一个向量。

点积非常有用,在光照等计算中会用到这个运算,其运算法则可以用以下公式表示:

u·v = u.x·v.x + u.y·v.y + u.z·v.z

从公式可以看出,点积是将向量的各个分量相乘然后相加,得到一个标量。它还可以用以下公式表示:

u·v = |u|·|v|·cos(θ)

其中θ为两个向量的夹角,它说明点积还意味着它不仅与向量的长度有关,还与两个向量的夹角有关。如果两个向量是垂直的,它们的点积一定为0.那么可以用点积判断两个向量是否垂直(这个非常重要,特别是在游戏编程中经常用到!)

组合上两个公式还可发现,任意给定两个向量,可以很容易地求出它们之间的夹角,求夹角公式为:

这是一个功能非常强大的工具,也是很多3D图形学算法的基础。下面给出向量的点积与角度之间的定性规律,这些规律是非常有用的:

● 如果向量u和v之间的夹角=90度(相互垂直),则u·v=0。

● 如果向量u和v之间的夹角>90度(钝  角),则u·v<0。

● 如果向量u和v之间的夹角<90度(锐  角),则u·v>0。

● 如果向量u和v之间的夹角=90度(相互平行),则u·v=|u|·|v|。

点积还可以用于其他许多运算。在计算机图形学和游戏编程中,要经常计算一个向量在另一个向量上的投影分量大小。假设有一个向量v,他代表游戏中某个角色的运动轨道,还有另一个向量u,他代表另一个角色的运动轨道。很多情况下,需要知道u在v方向上的分量(Projv(u)),这时可以使用点积来完成这种运算。

一般来说,计算u在v上的投影向量的公式如下:

特别的是,如果v为单位向量,公式可以简化为:

点积满足交换律,既有:

u·v=v·u

3、向量的叉积

另一种向量乘法是叉积。两个向量的叉积得到第三个向量,这个向量与原始两个向量相垂直,其大小定义如下(叉积符号定义为×):

|u×v|=|u|*|v|*sin(θ)

其中sin(θ)为两个向量夹角的正弦值。要计算两个向量叉积的大小,可以建立一下矩阵:

假设n=u×v,那么:

n.x=u.y*v.z-u.z*v.y

n.y=-(u.x*v.z-u.z*v.x)

n.z=u.x*v.y-u.y*v.x

前面已经讲过,两个向量的叉积得到的向量与原来的向量都垂直,这在计算表面法线向量时非常有用。

要注意的是,叉积不满足交换律,但交换顺序的结果仅仅是改变了叉积结果的符号,即:

u×v=-v×u

4、其他

向量加法:U + V = <Ux + Vx, Uy + Vy, Uz + Vz>

与标量的乘法:k * V = <kVx, kVy, kVz>

题外话:博主写完这篇文章后毅然卸载了eclipse、Visual Studio、SQL server 决定朝美工方向发展!

3D游戏中的数学运用相关推荐

  1. 游戏中的数学之3D基础

    目录 1.方向向量 2.矩阵旋转 3.欧拉角 4.Quaternion 5.互相转换 1.方向向量 1: forward, up, right为单位方向向量,世界坐标系下的 2: 单位向量 * 标量 ...

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

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

  3. 3D游戏中角色的换装原理-落樱之剑实例图文详细剖析(JME3,JMonkeyEngine游戏开发)...

    **************************************************************************************************** ...

  4. 3D游戏中角色的换装原理-落樱之剑实例图文详细剖析(JMonkeyEngine游戏开发)

    前言 本文将详细讲解3D游戏中换装的原理及换装中的一些重点问题,先粗略看一下换装的简单原理: 没错,看起来很简单吧!!! 那么接下来,开始讲复杂的地方! 在阅读本文之前如果你能够了解或知道以下一些基础 ...

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

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

  6. 游戏中的数学与物理(一)

    (看了<游戏开发的数学与物理>,感觉很不错,记下点东西. 这是本"图灵程序丛书",对于这个系列的书,我一直是蛮喜欢的,感觉书的内容.排版等,都让人看着很舒服.) 1.1 ...

  7. 游戏中的数学之魔塔数学

    前言:这几天心血来潮找找以前玩过的老游戏,就随手下载了一个PK32.今天早上又看到光良50岁的热搜,一方面感叹时光飞逝,一方面也感觉到作者刘景雄在代码方面的强悍. 足足五页的游戏却只有7.3M的软件大 ...

  8. 3D游戏中扮演虚拟人生的角色------有人选择了Jruby的老师

    http://www.iteye.com/topic/30708 [img]http://trailfire.com/pages/images/banner.png[/img] trailfire的帖 ...

  9. 在3D游戏中显示网页

    在游戏中显示网页? 为什么要这么做呢? 其实可以做不少的应用: 嵌入帮助文档, 比如技能介绍, 可以做得很漂亮, 各种排版方式用传统UI做起来很费劲 活动公告页面直接在游戏中查看 游戏内的BBS/社区 ...

最新文章

  1. 清华、中科大实现了量子版本的GAN,平均保真度98.8%
  2. spring autowired idea都匹配上了_你清楚这几个Spring常用注解吗?
  3. Linux之CentOS安装composer与git
  4. 军转干部计算机测试题,2015福建军转干考试计算机基础知识:计算机网络
  5. 史上最强《Java 开发手册》泰山版王者归来
  6. how to find data source of F4 help in web client UI
  7. 一次查找sqlserver死锁的经历
  8. Hello Struts2
  9. “10亿赌约”董明珠赢了!格力电器2018年总收入超2000亿
  10. ASP.NET 2.0中的跨页面提交
  11. 03矩阵02——初等变换与高斯消元法、行阶梯形矩阵、行简化阶梯形矩阵、行阶梯形状与方程组解的关系、相抵
  12. y85手机Android密码,vivoy85忘记解锁密码怎么办?vivoy85解锁屏幕锁教程工具
  13. PyQt5最详细pyrcc5配置+样式使用
  14. 白盒测试-判定条件覆盖
  15. Codeforces 图论板刷总结(更新中)
  16. ESXi8.0中NVME硬盘不识别解决方法1,设置直通
  17. PicPick的安装方法
  18. ARM:嵌入式系统之WDT中断实验
  19. ThoughtWorks全球CEO郭晓谈软件人才的招聘与培养
  20. 优化器optimizer,BGD、SGD、MBGD、NAG、AdaGrad、Adadelta、RMSProp、Adam

热门文章

  1. 对于文字设置超出部分隐藏
  2. 【突变检验方法二】MATLAB实现贝叶斯突变检测
  3. Tkinter Cursors
  4. 全网变灰白,网站变黑白,网站首页变灰白,黑白
  5. IT服务管理之能力管理
  6. 记录chrome 浏览器 本地ip 地址报 CORS 错误
  7. 学习 CommandName 和 CommandArgument
  8. 跟着b站大学学习C语言--哔哩大学计算机学院
  9. 怎么权衡不同类型项目的收益产出比 ROI?
  10. WWDC————苹果全球开发者大会