3D空间中的向量

向量:只有长度和方向,不含有位置信息的量,也就是说,两个向量只要长度和方向相同,则二者相同。

左手坐标系和右手坐标系

同样是三维的坐标系,两者的差别在Z轴上面。在左手坐标系中,Z轴正向穿入纸面;右手坐标系中,Z轴正向穿出纸面

当某一向量的其起始坐标和坐标系的原点重合的时候,我们称该向量处于标准位置。

用来描述向量坐标的,称之为分量。

当某一个向量的起始位置在坐标系的原点,也就是处于标准位置的向量,我们描述他的时候,使用的其终点位置的坐标来描述他,这样很容易将向量和某一点的描述混合,所以主要区分两者的标准就是,点只是描述了位置,但是向量描述了长度和方向。

4个特殊的3D向量

零向量:所有方向的分量都是0, 0 = (0,0,0)

其余三个向量我们称之为标准基向量:i,j,k,这三个向量分别在三个坐标系的x,y,z轴上:i = (1,0,0),j = (0,1,0),k = (0,0,1)。

游戏开发中我们使用到的数学计算,在我们的DX9的库里面,一一都提供好了,但是我们还是需要去理解他内部的原理。

注意:初次接触DX9的朋友,可以简单看看介绍:DX9百度百科,说明白一点,DX9就是一个库,里面提供了各种各样的API供我们使用,而我们即将介绍的向量的有关计算,矩阵的有关计算在DX9提供的库里面都会提供相应的API,让我们直接的计算。

里面也定义了各种各样的变量,来供我们使用。而我们刚才表示的3D空间中的向量,在DX9里面也有相应的表示,DX9有一个D3DX的一个库,我们用类D3DXVETOR3表示3D空间中的向量,这里附上源代码:D3DX库中表示3D空间向量的类:D3DXVECTOR3

此处主要介绍3D向量,但是在3D图形学里面,也经常使用2D或者4D向量,D3DX库里面提供了类:D3DXVECTOR2和D3DXVECTOR4来分别表示:2D以及4D向量,维数不同的向量都具有相同的属性就是:长度以及方向,只是维数不同。

向量相等

在几何学中只要两个向量的方向以及长度相等,那么两个向量就是相等的。但是在代数学中,两个向量除了长度相等以及方向相同之外,维数也必须相等,则二者相等。

在代码中我们可以通过重载“==”以及“!=”来判断两个向量是否相等。

例如:同样的三维向量,若:(Ux,Uy,Uz)=(Vx,Vy,Vz),则:Ux = Vx,Uy = Vy,Uz = Vz。反之也成立。

注意:通常我们在坐标的比较中,使用的是浮点数,由于浮点数的不精确性,我们认为两个相等的浮点数字可能有了略微的差别;所以我们应该测试他们是否近似相等,我们可以定义一个很小的常量:VALUE,然后将其作为误差容限,然后将比较的两个数字进行相减,如果两个数字的差是小于这个误差容限的,那么就认为这两个浮点数是相等的。下面的代码就说明了两个浮点数字是否相等:

#include "math.h"const float EPSILON = 0.1f;
bool Equal(float a, float b)
{//fabs函数是返回参数的绝对值return fabs(a - b) < EPSILON ? true : false;
}

计算向量的长度

几何学中,向量的模就是有向线段的长度。根据向量的个分量,我们就可以通过代数的方式计算向量的大小

||X||表示向量x的模。

在D3DX库里面有专门的函数来提供,用来计算向量的模:D3DXVecLength()

float D3DXVec3Length(const D3DXVECTOR* pv)

向量的规范化

向量的规范化就是让向量变成模为1的向量,也就是变成单位向量,模为1的向量就是单位向量。

把向量规范化的方法就是,让向量的每一个分量都去除该向量的模:

借助D3DX库,我们可以用如下函数实现向量的规范化。

D3DXVECTOR3 *D3DXVec3Normalize(D3DXVECTOR3 *pOut        //Resualtconst D3DXVECTOR3 *pV     //The vector to normalize
)

向量的加法

U + V = (Ux+Vx, Uy+Vy, Uz+Vz)

向量加法的几何解释

如果想在程序中使用向量的加法,只需要将加好重载一下就好了。

向量的减法

U - V = (Ux-Vx, Uy-Vy, Uz-Vz)

向量减法的几何解释

如果想在程序中使用向量的减法,只需重载一下减号。

数乘

kU = (kUx, kUy, kUz)

点积

u·v = UxVx + UyVy + UzVz

上述公式其实没有什么意义,但是通过余弦定理,可以发现:u·v = ||u||||v||cosλ,(λ是两个向量的夹角度数),

也就是两个向量的模的乘积在乘一个夹角的余弦值。如果两个向量都是单位向量。那么点积的值就是两个向量的余弦值。、

下面是有关点积一些有用的性质:

①若u·v = 0,   则u和v垂直;

②若u·v > 0,则两个向量的夹角小于90度;

③若u·v < 0,则两个向量的夹角大于90度;

我们可以利用D3DX库里面的以下函数来计算两个向量的点积:

float D3DXVecDot(const D3DXVECTOR3 *pV1const D3DXVECTOR3 *pV2
)

叉积

与点积不同,叉积的结果是另外一个向量,计算出来的向量,和原来的两个向量分别垂直。

计算公式:

例如:向量p是u和v的叉积,则p垂直于u,p也垂直于v

其分量形式为:

D3DX库中也有提供计算叉积的函数:

D3DXVECTOR3 *D3DXVecCross(D3DXVECTOR *pOut,D3DXVECTOR *pV1,D3DXVECTOR *pV2
)

游戏开发中必备的数学知识(一)——向量相关推荐

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

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

  2. 游戏开发中的基本物理学知识

    第三章:不能再简单的世界 在真正开始编写之前,先回顾一下初中学过的经典物理的知识,OK,闭上眼睛想三分钟,嗯,动量守恒,摩擦系数,胡克定律,弹性碰撞...是不是突然想到了很多,但是并不系统,这里就简单 ...

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

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

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

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

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

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

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

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

  7. 游戏开发中的矩阵与变换

    游戏开发中的矩阵与变换 介绍 矩阵组件和恒等矩阵 缩放转换矩阵 旋转变换矩阵 变换矩阵的基础 翻译转换矩阵 全部放在一起 剪切变换矩阵(高级) 转换的实际应用 在转换之间转换位置 相对于自身移动对象 ...

  8. 斗牛怎么玩法算法_游戏开发中的算法

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

  9. 游戏开发中的人工智能(一):游戏人工智能简介

    本系列文章对<游戏开发中的人工智能>David M.Bourg / Glenn Seemann 一书进行解读. 这本书谈了很多游戏软件 AI 的主题,内容深度适合初涉开发人员.所以,无论你 ...

最新文章

  1. c语言判断2 1000素数,2是不是素数(C语言判断一个数为素数)
  2. python是人工智能最大骗局-Python与人工智能的关系原来是这样的...
  3. Java8 ThreadLocal 源码分析
  4. python运行excel高级筛选怎么用_懂点EXCEL就行!教你利用Python做数据筛选(上)...
  5. Majority Element(169) Majority Element II(229)
  6. Java 进程间文件锁FileLock详解
  7. click传值vue_对vue下点击事件传参和不传参的区别详解
  8. maftools|TCGA肿瘤突变数据的汇总,分析和可视化
  9. c语言中switch嵌套,C 嵌套 switch 语句 ——jQuery中文网
  10. php过滤文件中的空行,如何从PHP文本中删除空行?
  11. 远程桌面——TeamViewer中“显示黑屏”的功能框无法使用
  12. Spark on Yarn遇到的几个问题
  13. 062 函数进阶小结
  14. 关于电商行业网络安全解决方案
  15. 电压、电流检测方法介绍
  16. 5+:基于单细胞测序和转录组数据构建胰腺癌中坏死性凋亡相关的预后模型
  17. 【DSU+思维】CF855G Harry Vs Voldemort
  18. 技术沙龙|原来落地AI应用是这么回事儿!
  19. 刚刚,我们和ChatGPT聊了聊边缘计算
  20. Linux文件、目录——鸟哥的Linux私房菜

热门文章

  1. 请详细的描述PBR角色只做流程,用分解步奏一步步的详细描述出来
  2. 云原生WebAssembly应用程序已来
  3. nodejs的下载与安装
  4. Ubuntu16.04 下载百度网盘文件 实现
  5. 贝叶斯预测模型 (数学原理与推导)
  6. shell脚本学习笔记 (流编辑器sed)
  7. RNA-seq结果图片如何解读(火山图、韦恩图、聚类热图和折线图)
  8. nexus3安装配置
  9. Hbase的Regina分区
  10. C++ 字符串和数字之间的相互转换