0.前言

在游戏开发中,确定目标的方位,朝向,夹角等相关数据需要用到向量间的计算,其中最常用到的就是点乘和叉乘。

说实话,因为向量的运算在平时开发中不是经常使用,我也总弄混这两种运算的含义,所以这次好好区分一下,也给有同样困扰的朋友一点小小的帮助。

因为我们主要研究的是游戏开发中的3D世界向量,所以下面的介绍会以几何定义为主,不研究其代数定义。

1.点乘

定义

又称点积、数量积、标量积。

从几何角度看,点乘是两个向量的长度和它们的夹角余弦值的积。

从名称和定义上来看,点乘的结果是标量。

点乘的名称也源自于点乘的运算符号。

通过上面的公式,我们还可以得到如下公式。

也就是说如果给定了两个向量,那么我们就可以求出两个向量的夹角。

关于这里的计算需要插播一个点,当两个单位向量的长度都是1的时候,向量的点乘就是他们夹角的余弦值。在游戏开发中会有归一化的操作,然后直接求夹角的情况,如果对这个知识点没有了解,可能看不懂夹角计算的原理。

我们通过点积公式可以看出来a,b都是标量,都是正数,余弦值会根据角度有正负变化。

当(0-90)°的时候,余弦值是正数,整个点乘公式都是正的。

当90°的时候,余弦值为0,整个公式为0。

当(90-180)°的时候,余弦值是负数,整个公式为负的。

利用这个性质,我们可以根据点乘的正负,做一些判断了。

在Unity中的应用

下面会直接用代码解释如何使用Unity提供的数学库进行点乘相关运算

using UnityEngine;

public class Example : MonoBehaviour

{

// 红色方块为敌人// 蓝色方块为自身public Transform cubeRed;

public Transform cubeBlue;

private void Update()

{

if (Input.GetKeyDown(KeyCode.Space))

{

CalculateDot();

}

}

private void CalculateDot()

{

// 先计算出敌人想对自身的位置信息// 再使用自身正方向与相对方向两个向量做点乘的相关运算Vector3 relativePosition = cubeRed.position - cubeBlue.position;

Vector3 cubeForward = cubeBlue.forward;

// 计算两个向量的点乘// 如果大于0说明敌人在自身前面// 如果小于0说明敌人在自身后面// 如果等于0说明敌人在自身左右float result = Vector3.Dot(cubeForward, relativePosition);

Debug.Log("点积的结果:" + result);

// 得到两个向量后,可以直接计算其夹角float angle = Vector3.Angle(cubeForward, relativePosition);

Debug.Log("两个向量的夹角:" + angle);

// 这是前面说到的当两个向量的长度都为1时,点乘的结果就是夹角的余弦值float cos = Vector3.Dot(cubeForward.normalized, relativePosition.normalized);

Debug.Log("余弦值:" + cos);

// 通过反余弦函数得到两个向量的角度// 不过这里得到是弧度值,并不是角度值float radians = Mathf.Acos(cos);

Debug.Log("通过余弦值求弧度:" + radians);

// 弧度值通过数据库转换成角度值angle = radians * Mathf.Rad2Deg;

Debug.Log("把弧度转换成角度:" + angle);

}

}

得到的结果如图所示,当敌人在自身后方时,点乘的结果小于0,当敌人在自身前方时,点乘的结果大于0。

2.叉乘

定义

又称叉积、向量积

首先叉乘的结果是向量不是标量。

叉乘的名称也来源于符号

叉乘的公式定义稍微复杂一点。

叉乘最后的结果是一个向量,大小可以根据公式算出,但是方向要根据右手法则确定。

实际上Unity中用的是左手坐标系,所以确定方向的时候我们要用左手法则,最后得到的方向正好与右手法则相反。所以两个向量的叉乘并不是一个真向量,它受参照系的影响,这个在以后的计算中要注意我们使用的到底是哪种坐标系。Unity官方API文档

几何意义

如果以向量a和b为边构成一个平行四边形,那么这两个向量的叉乘的模长与这个平行四边形的面积相等。

其实这个概念很好理解。我们不考虑叉乘方向的问题,叉乘的模长就是a*b*sinθ,其实也就是平行四边形面积公式中的底乘高。

在Unity中的应用

private void CalculateCross()

{

Vector3 relativePosition = cubeRed.position - cubeBlue.position;

Vector3 cubeForward = cubeBlue.forward;

Vector3 result = Vector3.Cross(cubeForward, relativePosition);

Debug.Log(result.y);

}

根据左手定则,y轴是法向量的方向,当y大于零的时候,敌人在我方右边,当y小于零的时候,敌人在我方左边。

在实际开发中,我们可以用叉乘来判断最优转向角,根据敌人的方位,判断我们应该向什么方向是最快的。

3.总结

简单来说,在两个物体的位置关系判断中。

点乘可以判断出目标物体在我的前方还是后方。大于零在前方,小于零在后方。

叉乘可以判断出目标物体在我的左边还是右边。大于零在右方,小于零在左方。

在计算机图形学中。

点乘可以用来计算夹角余弦值。

叉乘可以用来计算平面法向量。

两个向量的点乘和叉乘怎么算_Unity游戏开发——向量运算(点乘和叉乘)相关推荐

  1. Unity游戏开发——向量运算(点乘和叉乘)

    Unity游戏开发--向量运算(点乘和叉乘) 0.前言 在游戏开发中,确定目标得方向,朝向,夹角等相关数据需要用到向量的计算,其中最常用到的就时点乘和叉乘. 因为我们主要研究的是游戏开发中的3D世界向 ...

  2. [Unity游戏开发]向量在游戏开发中的应用(一)

    本文已同步发表在博客园:http://www.cnblogs.com/davidsheh/p/5246213.html ---------------------------------------- ...

  3. Unity游戏开发中的向量运算-点乘和叉乘

    Unity游戏开发中的向量运算-点乘和叉乘 1.点乘: 定义: 又称点积.数量积.标量积.既可以由向量坐标的代数运算得出,也可以通过引入两个向量的长度和角度等几何概念来求解. 公式一: 公式二: 点积 ...

  4. 两个向量的点乘和叉乘怎么算_向量的点乘和叉乘

    向量的点乘和叉乘2019-12-09 15:46:24文/董月 点乘,也叫数量积.结果是一个向量在另一个向量方向上投影的长度,是一个标量.叉乘,也叫向量积.结果是一个和已有两个向量都垂直的向量. 点乘 ...

  5. 两个向量的点乘和叉乘怎么算_向量的点乘和叉乘的区别,举个例子,谢谢!

    一.运算结果不同: 叉乘运算结果是一个向量而不是一个标量.并且两个向量的叉积与这两个向量和垂直.点乘,也叫数量积.结果是一个向量在另一个向量方向上投影的长度,是一个标量. 二.应用不同: 1.点乘:平 ...

  6. MATLAB从入门到精通-向量运算点乘、叉乘和卷积

    1.点乘运算 C=dot(A,B) 如果A和B长度相同,计算得出向量A与B的点积.当A与B为列向量时,dot(A,B)相当于进行A'B运算.若A与B为同型矩阵或者高维数组时,那么沿着第一个长度不为1的 ...

  7. 游戏开发中常用的几何之,两个线段是否相交

    游戏中判断两个线段是否相交的重要依据是根据向量的叉乘判断,所以不熟悉叉乘的意义的可以去看看叉乘的定义和几何意义 相交又分为两种情况,平行相交和非平行相交: 1:先说说平行相交,如果两个向量平行必然满足 ...

  8. Unity 3D数学\图形学基础-游戏开发(向量)

    Unity 3D数学\图形学基础-游戏开发(向量) 向量运算的几何意义 标量与向量的计算 向量的模长 标准化向量 normalize 0向量 向量与向量的加减法 两点间距离公式(向量间距离) 点积,点 ...

  9. 金叉和死叉看哪几条线?股票macd金叉和死叉怎么看?

    资本市场上,每天都在演绎着转瞬即逝的遗憾,和曙光来临的场景.怎么更好的把握住机遇,人工智能和<股市三大猜想>指出人类在金融领域探索的脚步从未停止过.资本追逐利益是投资者的责任与使命,是金融 ...

最新文章

  1. 王思聪究竟上了多少次热搜?
  2. 每日一皮:我一般不担心警告,只担心错误...
  3. Python 过滤字母和数字
  4. maven 安装m2e 报错
  5. 注解配置 AOP 详解
  6. Faster-rcnn详解
  7. HDU 4403 A very hard Aoshu problem DFS
  8. java技术不行有复试怎么办_复试答不上来怎么办?记住这四点不慌!
  9. 扒一扒开源世界有哪些licenses?
  10. python中pixels函数_Python+OpenCV3.3图像处理(一)
  11. JBoss Tools 4.5.3.Final安装及下载
  12. phpcms v9给栏目添加自定义英文栏目名称字段图文教程
  13. Unity 小程序开发
  14. 数字图像处理 笔记--2
  15. Python绘制美女乘风破浪词云舞蹈视频
  16. GCC编译过程及使用
  17. Nginx搭建虚拟主机环境
  18. Google搜索使用技巧
  19. python 2.7上安装pymssql和pymysql
  20. 安卓电池校正_都说苹果寿命长,2年前的iPhoneXR,相当于目前什么安卓手机?

热门文章

  1. 开源雨林 | 从高校中走出的 Apache 顶级项目 —— IoTDB 核心成员黄向东访谈实录...
  2. [转载] 七龙珠第一部——第062话 超神水的效果
  3. uniapp - 全平台兼容的 “多图上传“ 功能,搭配 uview 组件库中的 upload 上传组件(附带详细的示例源码及注释,可直接复制使用或简单修改)
  4. chrome扩展插件拦截修改请求头
  5. String和int、long、double等基本数据类型的转换
  6. 怎么用anaconda打开py文件?
  7. Docker中安装宝塔
  8. 微工具箱Android4,微工具箱2018最新版-微工具箱高通骁龙版v7.8.24 安卓版-腾牛安卓网...
  9. java 第三方HTTP请求的调用
  10. redis底层数据结构 -String