向量的基本运算包括加法、减法、点乘、叉乘、单位化运算等,而在游戏开发中使用最为广泛的是减法、点乘、叉乘、单位化运算。向量是具有方向和长度的矢量,有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. windows WebStorm常用快捷键记录,常用的都在这儿找扒

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Webstorm version 2018.2  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1. Ctrl + Shift + ...

  2. webpack基本配置文件(含解释)

    const path = require('path'); // 以下文件需要npm i 文件名 --save-dev const uglify = require('uglifyjs-webpack ...

  3. vue-cli中怎么样使用less

    1.安装安装less依赖,npm install less less-loader --save 2.修改配置文件, 在build/webpack.base.conf.js文件的module.expo ...

  4. oracle如何创建存储过程和调用

    oracle存储过程的创建语法 create or replace procedure 存储过程名称 ( --定义输入.输出参数-- 参数名1 in 参数类型, 参数名2 in 参数类型, 参数名3 ...

  5. 浏览器与WEB服务器交互

    问题:打开浏览器,在地址栏输入url到页面展现,整个过程发生了什么? 图示: 步骤: 1 用户输入网址,包括协议和域名. 2 浏览器先查找自身缓存有没有记录,没有的话再找操作系统缓存. 3 当浏览器在 ...

  6. 本地代码上传到git

    1.(先进入项目文件夹)通过命令 git init 把这个目录变成git可以管理的仓库 git init 2.把文件添加到版本库中,使用命令 git add .添加到暂存区里面去,不要忘记后面的小数点 ...

  7. java根据输入的字符串和字节数来截取,输出对应字节数的字符串

    public class Test { //要进行截取操作的字符串 static String ss; //截取的字符串的字节数 static int n; public static void ma ...

  8. 解决MyEclipse启动慢,使用卡顿问题

    卡顿原因: 1.启动的服务和插件过多,导致启动和运行缓慢,电脑配置较差的直接会卡死没有响应 2.软件运行内存设置不足,导致没有足够的空间运行软件,致使软件卡顿 解决方法: windows --> ...

  9. 【原创】KMP算法代码(C)

    //s是模式字符串,t是匹配字符串(可以看我上一篇文章中的叙述) int KMP(const char * s , const char * t) { int slen = strlen(s) , t ...

  10. Spark在StandAlone模式下提交任务,spark.rpc.message.maxSize太小而出错

    1.错误信息org.apache.spark.SparkException: Job aborted due to stage failure:Serialized task 32:5 was 172 ...