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发展矢量地图.你并不需要导入第三方的图片作为背景,直接在地图编辑器可以在底图内容编辑,由于岩石.巷道.煤层.画水.础地图样子再在其上面画出智慧线等设 ...
随机推荐
- Tensorflow 报错:tensorflow.python.framework.errors_impl.InternalError: Failed to create session.
问题描述 IDE:pycharm,环境中安装tensorflow-gpu 1.8.0 ,Cuda9 ,cudnn 7,等,运行代码 报错如下 tensorflow.python.framework.e ...
- XFS文件系统的备份和恢复
1.工具 XFS文件系统提供了xfsdump和xfsrestore来协助备份.恢复XFS文件系统中的数据,xfsdump按inode顺序来备份XFS文件系统,备份时不需要卸载文件系统,备份和恢复的过程 ...
- rpm -ivh 安装与 rpm -U安装解决问题一例
[root@localhost server3.10.12]# rpm -ivh krb5-libs-1.15.1-18.el7.x86_64.rpm警告:krb5-libs-1.15.1-18.e ...
- 【转】Asp.Net Core2.0获取客户IP地址,及解决发布到Ubuntu服务器获取不到正确IP解决办法
1.获取客户端IP地址实现方法(扩展类) using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc.ModelBinding; u ...
- Firebug: 已拦截跨源请求:同源策略禁止读取位于XXX的远程资源。(原因:CORS 头缺少 'Access-Control-Allow-
第一种,就是在被请求的程序中添加HTTP头,即CORS跨域(跨域资源共享,Cross-Origin Resource Sharing) 如: Response.Headers.Add("Ac ...
- 小程序中data数据的处理方法总结(小程序交流群:604788754)
WXML: <view class="container"> <view wx:for="{{list}}" wx:key="thi ...
- Qt 比对TreeItem节点
void TreeModel::settingsUpdate(const QStringList &lines){ QList<TreeItem*> parents; TreeIt ...
- 给django视图类添加装饰器
要将login_required装饰到view class的dispatch方法上, 因为dispatch方法为类方法,不是单个的函数,所以需要将装饰函数的装饰器 login_required转化为装 ...
- 使用AES加密的勒索类软件分析报告
报告名称: 某勒索类软件分析报告 作者: 李东 报告更新日期: 样本发现日期: 样本类型: 样本文件大小/被感染文件变化长度: 样本文件MD5 校验值: da4ab5e31793 ...
- Asp .Net Core Spa (二) - 服务器渲染1
Server Side Rendering 服务器渲染是各 Spa 项目目前很热衷于解决的一个问题,毕竟针对SEO和首次加载优化 .Net Core SPA 服务器渲染 将分为 两篇: 第一篇 主要分 ...