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发展矢量地图.你并不需要导入第三方的图片作为背景,直接在地图编辑器可以在底图内容编辑,由于岩石.巷道.煤层.画水.础地图样子再在其上面画出智慧线等设 ...
随机推荐
- nginx 判断移动端或者PC端 进入不同域名
自己最近用node.js + react 做了个网站.在PC端上的访问是这样的: 手机访问居然是这样的: 这样用户体验很不好. 所以做了一个移动端的版本. 需求: 需要判断用户是否手机还是电脑 访问网 ...
- springcloud-zuul路由网关
路由网关(zuul) 在微服务架构中,需要多个基础的服务治理组件,包括服务注册与发现.服务消费.负载均衡.断路器.智能 路由.配置管理等,由这个基础组件相互协作,共同组建了一个简单的微服务系统.一个简 ...
- nginx 出现504 Gateway Time-out的解决方法
本文介绍nginx出现504 Gateway Time-out问题的原因,分析问题并提供解决方法. 1.问题分析nginx访问出现504 Gateway Time-out,一般是由于程序执行时间过长导 ...
- win10php环境变量配置(xampp环境)
我的电脑--属性(右键)--高级系统设置--环境变量--系统变量--Path--编辑 新建两条变量: 一个是xampp文件下的php文件,例如 C:\xampp\php 一个是xampp文件下的php ...
- tomcat 7 启动报错:java.lang.NoSuchMethodError: javax.servlet.ServletContext.getSessionCookieConfig()Ljavax/servlet/SessionCookieConfig的解决
现象: tomcat 7 启动报错:java.lang.NoSuchMethodError: javax.servlet.ServletContext.getSessionCookieConfig() ...
- java 编译
package javacodeforstudy.testcode; public class Helloworld{ public static void main(String[] args) { ...
- 开发部署项目时出现:java.lang.OutOfMemoryError: PermGen space
java.lang.OutOfMemoryError: PermGen space 错误: 原文地址:http://www.cnblogs.com/shihujiang/archive/2012/06 ...
- java----判断闰年和平年
public class year{ public static void main(String[] args){ int year=2010; if((year%4==0&&yea ...
- sql:按年、月、日钻取时间
#按月排SELECT count(EN_NAME), DATE_FORMAT( CREATE_DATE, "%Y-%m" )FROM financeWHERE DATE_FORMA ...
- 用Tensorflow搭建神经网络的一般步骤
用Tensorflow搭建神经网络的一般步骤如下: ① 导入模块 ② 创建模型变量和占位符 ③ 建立模型 ④ 定义loss函数 ⑤ 定义优化器(optimizer), 使 loss 达到最小 ⑥ 引入 ...