3D数学基础(二)向量
向量的基本运算包括加法、减法、点乘、叉乘、单位化运算等,而在游戏开发中使用最为广泛的是减法、点乘、叉乘、单位化运算。向量是具有方向和长度的矢量,有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数学基础(二)向量的更多相关文章
- 【Unity3d游戏开发】Unity3D中的3D数学基础---向量
向量是2D.3D数学研究的标准工具,在3D游戏中向量是基础.因此掌握好向量的一些基本概念以及属性和常用运算方法就显得尤为重要.在本篇博客中,马三就来和大家一起回顾和学习一下Unity3D中那些常用的3 ...
- 3D数学基础:四元数与欧拉角之间的转换
在3D图形学中,最常用的旋转表示方法便是四元数和欧拉角,比起矩阵来具有节省存储空间和方便插值的优点.本文主要归纳了两种表达方式的转换,计算公式采用3D笛卡尔坐标系: 单位四元数可视化为三维矢量加上第四 ...
- 3D数学基础 KeyNote 1
[计算几何复习要点] 1.向量加法的几何含意: a+b的释意为:a的尾连上b的头,新建一条从a的尾指向b的头的向量. 2.向量减法的几何含意: a-b的释意为:尾部相连,新建一个从b的头指向a的头的向 ...
- Civil 3D API二次开发学习指南
Civil 3D构建于AutoCAD 和 Map 3D之上,在学习Civil 3D API二次开发之前,您至少需要了解AutoCAD API的二次开发,你可以参考AutoCAD .NET API二次开 ...
- 使用WPF实现3D场景[二]
原文:使用WPF实现3D场景[二] 在上一篇的文章里我们知道如何构造一个简单的三维场景,这次的课程我将和大家一起来研究如何用代码,完成对建立好了的三维场景的观察. 首先看一下DEMO的界面: ...
- 3D数学基础学习之向量一
向量-数学定义 对数学家而言,向量就是一个数字列表,对程序员而言则是另一种相似的概念,数组. 向量-几何定义 a.向量的大小就是向量的长度(模),向量的长度非负 b.向量的方向描述了空间中向量的指向. ...
- 3D数学基础_图形与游戏开发
https://blog.csdn.net/popy007/article/list/2?t=1& //向量计算相关文章 https://www.baidu.com/link?url=48C ...
- WEB 3D SVG CAD 向量 几个实施
一.他们所有的发展.从地上爬起来 VML+SVG发展矢量地图.你并不需要导入第三方的图片作为背景,直接在地图编辑器可以在底图内容编辑,由于岩石.巷道.煤层.画水.础地图样子再在其上面画出智慧线等设备, ...
- WEB 3D SVG CAD 向量 几个实施(转)
一.他们所有的发展.从地上爬起来 VML+SVG发展矢量地图.你并不需要导入第三方的图片作为背景,直接在地图编辑器可以在底图内容编辑,由于岩石.巷道.煤层.画水.础地图样子再在其上面画出智慧线等设 ...
随机推荐
- JQuery的常用选择器 转
JQuery的常用选择器 刚开始学JQuery写的如有错误欢迎批评指正 JQuery拥有的选择器可以让我们更快更方便找到想要的元素,然后对相应的元素进行操作 简单介绍一下一些常用的选择器: 1.基本选 ...
- nginx日志相关运维操作记录
在分析服务器运行情况和业务数据时,nginx日志是非常可靠的数据来源,而掌握常用的nginx日志分析命令的应用技巧则有着事半功倍的作用,可以快速进行定位和统计. 1)Nginx日志的标准格式(可参考: ...
- qtp中type方法的按键常量
记录键盘操作可以用set和presskey方法,而type方法是不记录的.type方法主要用于输入连接文本字符串和键盘修饰键(组合键),组合键之间用&符号. 如:JavaWindow(&quo ...
- Java 开发笔记
共同学习,以下内容,随时更新. 前端 1.前端页面'是单引号的转义符,"是双引号. 问题(前端JS进行参数传递时,使用的是单引号扩住变量,但是变量形式为 2019-27 ...
- CentOS7系统上的GPSTK示例代码调试 & 运行结果 & 心得
下载的源码程序包中,共有16个例子,这里记录它们的调试及运行结果,尤其是哪些可用,哪些不可用,今后使用时用作参考. 总结: (1)在 18 个示例程序中,example16 和 example17 编 ...
- 什么是ORM?
什么是ORM? MVC框架中重要的一部分就是ORM,实现了数据模型与数据库的解耦,即数据模型不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库. ORM是对象关系映射的简称,主要任务是: 根 ...
- maven项目的配置
软件151 王帅 1.增加web.xml Maven项目最重要的配置文件是pom.xml,pom是“项目对象模型”的意思.现在pom.xml中有一个错误,提示缺少web.xml: 展开目录src—m ...
- Mybatis使用MySQL进行模糊查询时输入中文检索不到结果
Mybatis使用MySQL进行模糊查询时输入中文检索时,需要在jdbcURL后增加参数 ?useUnicode=true&characterEncoding=UTF-8
- java AQS(AbstractQueuedSynchronizer)同步器详解
除了内置锁(synchronized)外,java AQS(AbstractQueuedSynchronizer)同步器几乎是所有同步容器,同步工具类的基础.ReentrantLock.Reentra ...
- HOU 1012
#include<iostream>using namespace std;int main(void){ int jiecheng[10]; jiecheng[0]=jiecheng[1 ...