向量的基本运算包括加法、减法、点乘、叉乘、单位化运算等,而在游戏开发中使用最为广泛的是减法、点乘、叉乘、单位化运算。向量是具有方向和长度的矢量,有2D、3D、4D等的。在游戏开发里面一般使用的是2D和3D,分别用<x,y>和<x,y,z>来表示的。

  (1)向量的加法

  两个向量的维数相同,那么二者相加后得到的值还是一个维数相同的向量,其运算方法是对应项相加。例如:[x,y,z]+[a,b,c]=[x+a,y+b,z+c]。向量的加法在游戏开发中一般表示物体从一个位置移动到另一个位置。

  如果想让一个物体V1移动到另一个物体V2的位置,通常的做法时先计算出方向,即Vector3 dir=(V2-V1),normalized,意为将两个向量详见并且单位化。如果说V1表示的物体的位置是obj.transform.position,将他移动到V2的位置可以表示为obj.transform.position+=dir*0.5(系统可以通过效果表现来设置,任意的);原型为y=ax+b。

  (2)向量的减法

  向量的减法可以解释为加上负向量。例如:a-b=a+(-b);[x,y,z]-[a,b,c]=[x-a,y-b,z-c],当然也必须要维数相同。向量中的减法在游戏开发中主要应用在计算方向上,也应用在计算两个物体之间的距离上。

  将一个物体的位置V1移动到位置V2,首先要做的就是确定其移动方向。计算公式为:(V2-V1).normalized;而计算距离可以使用Vector3.Distance(Vector3 a,Vector3 b)。

  (3)向量的点乘

  标量和向量可以点乘,向量和向量也可以点乘,向量点乘就是对应分量乘积的和,结果是标量。可以通过这个公式来计算[x,y,z]•[a,b,c]=ax+by+cz;也可以通过:a•b=|a|*|b|*cos<a,b>来计算,其中cos<a,b>代表向量a和向量b角度的余弦值。在游戏开发中通常使用点乘计算角度点乘得到的值是弧度常量,也可以转化为角度值。比如玩家转向NPC或者怪物都与点乘相关。

  2D空间的点乘可以使用Vector2.Dot(Vector2 a,Vector2 b),返回值是一个float类型的数值.3D空间的计算可以使用Vector3.Dot(Vector3 a,Vector3 b)。

  人工智能中关于追逐目标的例子,也是利用了点乘来计算物体的前进方向和物体到目标的方向的夹角,贴出源代码,大家可以看看:

 public override Vector3 Force()
{
Vector3 toTarget = target.transform.position - transform.position;
float relativeDirection = Vector3.Dot(transform.forward, target.transform.forward);
if ((Vector3.Dot(toTarget, transform.forward) > ) && (relativeDirection < -0.95f))
{
desiredVelocity = (target.transform.position - transform.position).normalized * maxSpeed;
return (desiredVelocity - m_vehicle.velocity);
}
float lookaheadTime = toTarget.magnitude / (maxSpeed + target.GetComponent<Vehicle>().velocity.magnitude);
desiredVelocity = (target.transform.position + target.GetComponent<Vehicle>().velocity * lookaheadTime - transform.position).normalized * maxSpeed;
return (desiredVelocity - m_vehicle.velocity);
}

  (4)向量的叉乘

  向量的叉积与点击不同,它的运算结果是一个向量而不是一个标量。并且两个向量的叉积与这两个向量的和垂直。计算公式为:a×b=|a|*|b|*sin<a,b>,其中sin<a,b>表示的是两个向量之间夹角的正弦值。在一个平面内的两个非平行向量叉乘的结果是这个平面的法向量,而法向量的方向可以用“右手定则”来判断。具体为:若是满足右手定则,当右手的四指是从向量a以不超过180°的转角转向向量b时,竖起的大拇指方向是n的指向。当法向量n与某一坐标轴同向时,四指指的是逆时针方向,而不超过180°的方向,使得可以用叉乘来判断转向一定是最优转向。在游戏开发中,可以用叉乘来判断一个角色是顺时针转动还是逆时针转动才能更快地转向敌人。

  Vector3.Cross(Vector3 a,Vector3 b)得到的值类型,也就是垂直于a,b的向量。

  在书上学习到的赛车游戏中经常用的方向盘例子贴出来可以互相学习:

 void RotateWheel(Vector3 pos)
{
currVec = pos - wheelPos; //计算方向盘中心点到触控点的向量 Vector3 normalVec = Vector3.Cross(currVec, oldVec); //计算法向量
float vecAngle = Vector2.Angle(currVec, oldVec); //计算两个向量的夹角 //使用“右手定则”可知,当大拇指方向指向我们时,四指方向为逆时针方向。
//当大拇指方向远离我们是,四指方向为顺时针方向
//这里叉乘后的法向量平行于z轴,所以用法向量的z分量的政府来判断法向量的方向
if (normalVec.z > ) //与z轴通向,则顺时针转
{
wheel.transform.Rotate(Vector3.forward, -vecAngle); //顺时针转
}
else if (normalVec.z < ) //与z轴反向,则逆时针转
{
wheel.transform.Rotate(Vector3.forward, vecAngle); //逆时针转
} oldVec = currVec; }

  

3D数学基础(二)向量的更多相关文章

  1. 【Unity3d游戏开发】Unity3D中的3D数学基础---向量

    向量是2D.3D数学研究的标准工具,在3D游戏中向量是基础.因此掌握好向量的一些基本概念以及属性和常用运算方法就显得尤为重要.在本篇博客中,马三就来和大家一起回顾和学习一下Unity3D中那些常用的3 ...

  2. 3D数学基础:四元数与欧拉角之间的转换

    在3D图形学中,最常用的旋转表示方法便是四元数和欧拉角,比起矩阵来具有节省存储空间和方便插值的优点.本文主要归纳了两种表达方式的转换,计算公式采用3D笛卡尔坐标系: 单位四元数可视化为三维矢量加上第四 ...

  3. 3D数学基础 KeyNote 1

    [计算几何复习要点] 1.向量加法的几何含意: a+b的释意为:a的尾连上b的头,新建一条从a的尾指向b的头的向量. 2.向量减法的几何含意: a-b的释意为:尾部相连,新建一个从b的头指向a的头的向 ...

  4. Civil 3D API二次开发学习指南

    Civil 3D构建于AutoCAD 和 Map 3D之上,在学习Civil 3D API二次开发之前,您至少需要了解AutoCAD API的二次开发,你可以参考AutoCAD .NET API二次开 ...

  5. 使用WPF实现3D场景[二]

    原文:使用WPF实现3D场景[二] 在上一篇的文章里我们知道如何构造一个简单的三维场景,这次的课程我将和大家一起来研究如何用代码,完成对建立好了的三维场景的观察. 首先看一下DEMO的界面:     ...

  6. 3D数学基础学习之向量一

    向量-数学定义 对数学家而言,向量就是一个数字列表,对程序员而言则是另一种相似的概念,数组. 向量-几何定义 a.向量的大小就是向量的长度(模),向量的长度非负 b.向量的方向描述了空间中向量的指向. ...

  7. 3D数学基础_图形与游戏开发

    https://blog.csdn.net/popy007/article/list/2?t=1&  //向量计算相关文章 https://www.baidu.com/link?url=48C ...

  8. WEB 3D SVG CAD 向量 几个实施

    一.他们所有的发展.从地上爬起来 VML+SVG发展矢量地图.你并不需要导入第三方的图片作为背景,直接在地图编辑器可以在底图内容编辑,由于岩石.巷道.煤层.画水.础地图样子再在其上面画出智慧线等设备, ...

  9. WEB 3D SVG CAD 向量 几个实施(转)

      一.他们所有的发展.从地上爬起来 VML+SVG发展矢量地图.你并不需要导入第三方的图片作为背景,直接在地图编辑器可以在底图内容编辑,由于岩石.巷道.煤层.画水.础地图样子再在其上面画出智慧线等设 ...

随机推荐

  1. 学习node.js的一些笔记

    最近看了几眼node.js,以前曾听说它用途很大. 在菜鸟教程上,已看了过半的内容:http://www.runoob.com/nodejs/nodejs-web-module.html,如今看到了这 ...

  2. git reset 和 git revert 使用区别

    git reset 用于回退代码,但是git pull后会和远程分支保持一致,所以无法修改远程代码 git revert可以撤销代码,撤销后直接git push ,可以修改远程分支的代码

  3. EF Core 生成数据库

       1.运行cmd,切换到打开项目所在文件夹,输入下面的命令 dotnet ef migrations add Initial 建立并初始化数据库 dotnet ef database update ...

  4. mpvue学习笔记(一) 基础介绍

    一. 小程序环境搭建 后台地址:https://mp.weixin.qq.com/ 文档地址:https://developers.weixin.qq.com/miniprogram/dev/ 注册账 ...

  5. Scrapy框架学习第二天

    编写scrapy爬虫的具体流程最初:分析网站页面需要爬取的结构第一步:创建scrapy项目:scrapy startproject +文件名第二步:打开项目第三步:编写items.py第四步:创建爬虫 ...

  6. springboot秒杀课程学习整理1-2

    1)从数据库到前端,做了三层转换,最后统一返回给前端的格式 DO-> model: 放在service中,目的是为了组装来自于数据库的数据,有些字段来自于不同的表的取,这一层相当于真正的业务模型 ...

  7. 比较推荐学习Linux系统应该看的书籍

    对于如何学习Linux,我想大家多多少少会有自己的一些想法--不管是学过Linux的还是没有学过Linux的.学习,对于我们来说,应该不是一件陌生的事:从小学开始,然后中学.大学.乃至于读硕读博,可以 ...

  8. Android Studio之SVN打分支、切换分支及合并分支

    1.打分支: 右击项目--Subversion--Branch or Tag 点击OK,分支就创建成功了,接下来我们切换到分支v2 2.切换分支: 右击项目--Subversion--Update D ...

  9. python之路-python2.x与python3.x区别

    Python崇尚优美.清晰.简单,是一个优秀并广泛使用的语言. Python2.x 与 Python3.x的区别: python2.x:源码混乱,重复代码较多,冗余. python3.x:源码规范,崇 ...

  10. C语言:开平方根sqrt程序02

    #include <stdio.h> int sqrt01(int x); void main(void){ int x=49,y; y=sqrt01(x); if(y<0) pri ...