本章中会记录数学中的角度与弧度的变换,勾股定理,矢量加减、矢量数乘、矢量分解,矢量点乘等。
物理中的距离、速度、加速度、力之间的关系与应用。
来源为:游戏人工智能编程案例精粹(修订版)第一章

一、数学

1.1 角度与弧度的变换

日常生活中,我们形容一个角,常常使用的是角度、而在数学中需要使用弧度的概念,这在游戏开发中也经常需要转换。(我在Unity和UE的开发当中,都有遇到过这样的需求)。弧度是以原点为中心的单位半径圆为基准的一种度量单位。

由于圆的周长为2PI,所以每个圆都有2PI弧度(Radians)。PI为圆周率,3.1415926。

360角度=2PI弧度 (1-1)

如果角度换弧度的公式为:

1角度=(2PI/360)弧度
1弧度=(360/2PI)角度 (1-2)

1.2 勾股定理

由于勾股定理只能用于直角三角形,这里只讨论直角三角形。
直角三角形有一个角为PI/2弧度(90角度),即直角的三角形。
勾股定理一个直角三角形直角所对应的斜边的平方等于其他两个边的平方和

c2=a2+b2 (1-3)

这意味着知道一个直角三角形的任意两个边的任意两个边的长度,就能找到第三边。
通过勾股定理,我们可以计算两个物体之间的距离。不过需要记得少用开方,因为开方计算很慢,可以直接使用平方即可。比如 a2+b2<距离2

来个实例:
比如有一个枪手(10,4)的射击范围是10米,目标敌人的位置为(2,3),请问枪手可以在不移动的情况下 射杀目标敌人吗?

红点为射手,蓝点为目标敌人。
距离2=(10-2)2+(4-3)2=65<100(102)

1.3 三角函数

sin(θ)=对边/斜边
cos(θ)=邻边/斜边
tan(θ)=对边/邻边(1-4)

三角函数在游戏开发中的应用就是计算角度。可以使用反三角函数来计算两个矢量之间的夹角。

1.4 矢量

1.4.1 矢量加减
如果我们的位置在坐标系的(0,0)处,有一张藏宝图告诉我们,需要通过矢量A(-2,1)和 B(3,0)去找到宝藏,但是我们懒得按照它规定的路线去,就想直接去目的地。这个时候就需要用到矢量的加法了。

A+B=(-2,1)+(3,0)=(1,1)

待我们计算出来之后,就可以直接通过目标向量去往目标点了。

1.4.2 计算矢量的大小
矢量的大小(模)是它的长度。
一个矢量的大小,我们可以通过勾股定理来计算。

模=(x2+y21/2(1-5)

这个公式可以帮我们计算两个角色之间的距离,示例的话,就是1.2中的例子。

1.4.3 矢量归一化
归一化就是用矢量的每一个分量去除以矢量的模。

N=(v/|v|)

举例,归一化矢量(4,5),其模为6.403,所以归一化后的向量为(4/6.403,5/6.403)=(0.62,0.78)。

1.4.4 矢量点乘

有两个二维矢量 u,v,两者点乘的两个公式如下:
(1) u·v=uxvx+uyvy =x分量相乘加上 y分量相乘
(2) u·v=|u||v|cos(θ)=两个向量的模相乘,再乘以余弦角度
如此,我们便能得到

cos(θ)=u·v/(|u||v|)(1-6)

所以如果我们将两个向量归一化后,他们的模,如|u|为1时,

cos(θ)=uxvx+uyvy(1-7)

如此再通过一个反余弦函数 acos(uxvx+uyvy) 就能得到角度θ了。

矢量点乘不仅能帮我们得到两个向量间的夹角,还能帮我知道一个怪物是否在主角的背后。
即主角的向前矢量与怪物到主角的矢量点乘之后,如果为正值,则怪物在主角的正面,如果为负值,则在背后。

还是用前面那个问题来举例:
比如有一个枪手在(10,4),朝向为Y轴,目标敌人的位置为(2,3),请问枪手需要转向多少度才能面向目标?

红点为枪手,蓝点为目标。枪手的初始向前矢量为(0,1),枪手朝向目标的矢量为(8,1)。
枪手朝向目标的归一化 矢量为(0.99,0.12)。

cos(θ)=(0x0.99)+(1x0.12)=0.12
θ=acos(0.12)=1.45弧度=83.10角度

1.4.5 求旋转向量
如果已知一个向量与其要旋转的角度,如何计算旋转后的向量呢?

如此:便设已知向量为A,旋转角度为θ,未知向量为B

B=(Xa * cos(θ)-Ya*sin(θ),Xa * sin(-θ)+Yacos(-θ))(1-8)

具体推导过程请查看二维向量的旋转

二、物理

2.1 距离计算公式

∆x=(v*∆t) ,其中v为速度,∆x为单位时间内行驶的距离,∆t为单位时间 (2-1)

可以用于计算游戏当中单位时间内物体的移动距离,比如:x的位置+=前进向量*刷新帧时间。

2.2、速度的计算公式

v=(∆x/∆t) ,其中v为速度,∆x为单位时间内行驶的距离,∆t为单位时间 (2-2)

2.3、加速度的计算公式

a=(∆v/∆t),其中a为加速度,∆v为单位时间内的速度,∆t为单位时间。(2-3)

如果加速度恒定的话,

v=at+u,其中a为加速度,v为速度,t为时间,u为初始速度。(2-4)

举例:一辆车的起始速度为1m/s,之后以2m/s加速,请问3秒后小车的速度?
v=2*3+1=7m/s

速度与时间图(y轴为速度,x轴为时间)如下:


速度与时间图,有一个有趣的特点就是:在两个时间点之间的图的下方面积等于物体在这段时间中行进的距离。

因此:

A的面积 = ∆t * u
B的面积 = ∆t * (v-u) /2

距离:

∆x=∆t * u+∆t * (v-u) /2 (2-5)

将v-u=∆v=a∆t带入上述距离公式(2-5),可得一个距离与时间与加速度的关系式

∆x=∆t * u+a *∆ t 2 *(1/2) (2-6)

如果在将∆t=(v-u)/a带入公式(2-6),可得一个距离与速度、加速度的公式。

v2=u2+2a * ∆x (2-7)

2.4 力

如果一个物体是静态的或者是保持匀速直线运动,所有作用在它身上的力的和一定为零。如果这些力的和不为零,那么物体将会沿着合力的方向加速而去。

力的计算公式

F=am,其中F为力的大小,a为加速度,m为物体的质量。(2-8)

记住:这个公式可以用于计算,多个力施加到一个物体时,物体的移动。比如:游戏人工智能编程案例精粹 第三章中的Flocking算法。

游戏开发中的基本数学与物理相关推荐

  1. 游戏开发中必备的数学知识(一)——向量

    3D空间中的向量 向量:只有长度和方向,不含有位置信息的量,也就是说,两个向量只要长度和方向相同,则二者相同. 左手坐标系和右手坐标系 同样是三维的坐标系,两者的差别在Z轴上面.在左手坐标系中,Z轴正 ...

  2. 游戏开发中常用的数学知识---矩阵(一)

    在数学中,矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合,最早来自于方程组的系数及常数所构成的方阵.这一概念由19世纪英国数学家凯利首先提出. 矩阵是高等代数学中的常见工具,也常见于统计分 ...

  3. 游戏开发中的数学和物理算法10-18

    1.标量 标量只有大小没有方向. 2.矢量 矢量既有大小又有方向. 3.常用举例: 物理上常用的矢量与标量的对应概念有:速度和速率:距离和位移等.如图: 距离: 假设A到B的距离为a,B到C的距离为b ...

  4. 游戏开发中的进阶向量数学

    游戏开发中的进阶向量数学 飞机 到飞机的距离 远离原点 以2D方式构建平面 飞机的一些例子 3D碰撞检测 更多信息 飞机 点积具有带有单位向量的另一个有趣的属性.想象一下,垂直于该矢量(并通过原点)的 ...

  5. 游戏开发中的数学、向量的应用

    点 数学中的坐标系统(笛卡尔坐标系统) 这里A(0,0), B(1,2), C(4,3), D(–1,2), E(–2,–1), F(3,–2). 计算机中的坐标系统(屏幕坐标系统) 注意这里的y轴在 ...

  6. 游戏开发中的物理介绍

    游戏开发中的物理介绍 碰撞对象 物理过程回调 碰撞层和蒙版 GUI示例 代码示例 Area2D StaticBody2D RigidBody2D KinematicBody2D 在游戏开发中,您通常需 ...

  7. 游戏开发中的物理之布娃娃系统

    游戏开发中的物理之布娃娃系统 介绍 设置布娃娃 创造物理骨骼 清理骨架 碰撞形状调整 关节调整 模拟布娃娃 碰撞层和遮罩 介绍 从3.1版开始,Godot支持布娃娃物理.Ragdolls依靠物理模拟来 ...

  8. 游戏开发中的物理之射线投射

    游戏开发中的物理之射线投射 介绍 空间 进入空间 Raycast查询 碰撞异常 防撞面罩 屏幕上的3D射线投射 介绍 游戏开发中最常见的任务之一是投射光线(或自定义形状的物体)并检查其撞击.这样就可以 ...

  9. 游戏开发中的物理之运动角色(2D)

    游戏开发中的物理之运动角色(2D) 介绍 物理过程 场景设定 运动学特征 介绍 是的,这个名字听起来很奇怪."运动角色".那是什么?该名称的原因是,当物理引擎问世时,它们被称为&q ...

  10. 手把手教你架构3d游戏引擎pdf_游戏开发中的算法

    游戏技术这条路,可深可浅.你可以满足于完成GamePlay玩法层面的东西,你也可以满足于架构和框架设计层面的东西,你也可以醉心于了解某一游戏引擎带来的掌控感.但是,我们不该止步于此,止步与目前所见或所 ...

最新文章

  1. 三维家导入户型镜像怎么使用_【业】1分钟看懂三维家定制柜设计
  2. OpenCASCADE: Code::Blocks构建OCCT
  3. 20162317 2017-2018-1 《程序设计与数据结构》第8周学习总结
  4. android t跳转到fragment,Android 使用EventBus进行Fragment和Activity通信
  5. python之模块calendar(汇集了日历相关的操作)
  6. java8新特性(2)--- 方法引用
  7. 大佬谈:英伟达、咪咕、赛迪共谈技术如何颠覆未来市场
  8. shell回文判断_习题07_Shell编程
  9. rbf java_RBF网络
  10. Subclipse更新地址
  11. python读取pdf提取文字和图片
  12. 淘宝客用微博推广方法
  13. 也谈谈印度人的职场话题
  14. mysql 按条件join_MySQL Join竟然可以这么玩?根据条件进行复制
  15. 这就是你日日夜夜想要的docker!!!---------docker+consul+ nginx集成分布式的服务发现与注册架构
  16. html5 自动分享到朋友圈,html5手机端分享微信朋友圈代码
  17. jsp如何打开本地html文件怎么打开,jsp文件怎么打开,教您电脑怎么打开jsp文件
  18. 免费地图下载流量如何领取?
  19. R语言之文本分析:主题建模LDA
  20. 解决conda创建新环境慢 conda install 速度慢 报错问题

热门文章

  1. textView 属性总结
  2. linux终端字体放大_5 个 PowerShell 主题,让你的 Windows 终端更好看
  3. java vcf文件增量写入,用snpEFF对vcf格式的突变数据进行注释
  4. go语言 liteIDE 错误: 进程无法启动.
  5. python遗传算法计算实例_python实现的遗传算法实例(一)
  6. MapGuide Maestro 3.0发布
  7. oracle10G/oracle11G连接oracle12c,ORA-28040的解决
  8. swf是什么文件以及与fla格式的区别
  9. swf导出html代码,将SWF轻松导出HTML5
  10. Nokia手机S40平台手机开发环境的搭建的过程