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

0.前言

在游戏开发中,确定目标得方向,朝向,夹角等相关数据需要用到向量的计算,其中最常用到的就时点乘和叉乘。
因为我们主要研究的是游戏开发中的3D世界向量,所以小面的介绍会以几何定义为主,不研究其代数定义。

1.点乘

定义
点乘又称点积、数量积、标量积。
从几何角度看,点乘是两个向量的长度和它们的夹角余玄值的积。

从名称和定义来看,点乘的结果是标量。点乘的名称也源自与点乘的运算符号。

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

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

关于这里的计算需要插播一个点。**当两个单位向量的长度都为1的时候,向量的点乘就是它们夹角的余玄值。**在游戏开发中会有归一化的操作,然后直接求夹角的情况,如果对这个知识点没有了解,可能看不懂夹角计算的原理。
我们通过点积公式可以看出来a,b都是标量,都是正数,余玄值会根据角度有正负变化。
当(0-90)°的始后,余玄值是正数,整个点乘公式都是正的。
当90°的时候,余玄值为0,整个公式为0.
当(90-180)°的时候,余玄值为负数,整个公式为负的。

在Unity中的应用

using UnityEngine;
public class Example : MonoBehaviour
{public Transform cubeRed;//敌人public Transform cubeBlue;//玩家自身void Update(){if (Input.GetKeyDown(KeyCode.Space)){CalculateDot();}}private void CalculateDot(){//先计算出敌人相对自身的位置信息Vector3 relativePosition = cubeRed.position - cubeBlue.position;//再使用自身正方向与相对方向两个向量做点乘的相关运算Vector3 cubeForward = cubeRed.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中用的是左手坐标系,所以确定方向的时候我们要用左手法则,最后得到的方向正好与右手法则相反。所以两个向量的叉乘并不是一个真向量,它受参照系的影响,这个在以后的计算中要注意我们使用的到底是哪种坐标系。

几何意义

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

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

在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游戏开发——向量运算(点乘和叉乘)

    0.前言 在游戏开发中,确定目标的方位,朝向,夹角等相关数据需要用到向量间的计算,其中最常用到的就是点乘和叉乘. 说实话,因为向量的运算在平时开发中不是经常使用,我也总弄混这两种运算的含义,所以这次好 ...

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

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

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

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

  4. unity 角度限制_喵的Unity游戏开发之路 推球:游戏中的物理

    前言很多童鞋没有系统的Unity3D游戏开发基础,也不知道从何开始学.为此我们精选了一套国外优秀的Unity3D游戏开发教程,翻译整理后放送给大家,教您从零开始一步一步掌握Unity3D游戏开发. 本 ...

  5. 喵的Unity游戏开发之路 - 推球:游戏中的物理

    很多童鞋没有系统的Unity3D游戏开发基础,也不知道从何开始学.为此我们精选了一套国外优秀的Unity3D游戏开发教程,翻译整理后放送给大家,教您从零开始一步一步掌握Unity3D游戏开发. 本文不 ...

  6. 喵的Unity游戏开发之路 - 复杂重力

    转载(拷贝)自微信公众号(u3dnotes),图片和视频请查看原文: https://mp.weixin.qq.com/s?__biz=MzUxMDM3MTYwNQ==&mid=2247493 ...

  7. Unity游戏开发大师班

    大小解压后:8.63G 持续时间19h 包含项目文件 1280X720 MP4 语言:英语+中英文字幕(根据原英文字幕机译更准确) Unity游戏开发大师班 信息: 要求 –没有课程要求,展示了开发过 ...

  8. 喵的Unity游戏开发之路 - 玩家控制下的球的滑动

    很多童鞋没有系统的Unity3D游戏开发基础,也不知道从何开始学.为此我们精选了一套国外优秀的Unity3D游戏开发教程,翻译整理后放送给大家,教您从零开始一步一步掌握Unity3D游戏开发. 本文不 ...

  9. 从零开始的种田生活-Unity游戏开发

    从零开始的种田生活-Unity游戏开发 CSV中的静态数据读取 Json中的动态数据读取 ScriptableObject的使用 大家好,这里是暴躁老哥酒九.最近了我们的童年记忆<摩尔庄园> ...

最新文章

  1. java Bean 不需要自动生成get和set
  2. 为什么工厂老板们从不「迷信」人工智能?
  3. HighNewTech—2019CES:历史性!百度用自家的自动驾驶物流,把一个快递送到了 2019CES会场
  4. python爬取b站用户_用Python爬取bilibili全站用户信息
  5. NEFU 560 半数集
  6. java防止重复启动bat_java调用exe,及调用bat不成功的解决办法
  7. 升级系统服务器出错,win10更新失败80070002错误怎么办
  8. java清除运行窗口内容,Java实现软件运行时启动信息窗口的方法
  9. 线下反欺诈风控实践要点|实操
  10. oracle+prko+2006,oracle卸载Oracle Clusterware
  11. 1926: 粟粟的书架 前缀和+二分+主席树
  12. 计算机导论的计算题,计算机导论复习题(选择部分)汇总
  13. 炮灰模型——女生选择追求者模型
  14. 好书推荐|《CSS新世界》,前端人员必备宝书!
  15. ViewBinding使用详解
  16. 搭档之家|紧跟信息消费大发展时代步伐
  17. python面向对象之面向对象三要素
  18. 什么才算是关键指标?如何选择关键指标? by彭文华
  19. CSP认证202209-3:防疫大数据
  20. 福兮祸兮?- 议Google收购摩托罗拉移动

热门文章

  1. python从pdf文件中提取文本,并自动翻译
  2. 在Linux服务器上如何开启安全的SNMP代理
  3. 0x0B-HackTheBox-Obscurity
  4. 牛逼!程序员给鸿星尔克写了一个720°全景看鞋展厅
  5. Win10 无线投屏/无线屏幕拓展
  6. Swin-Transformer-Object-Detection V2.11.0 训练visdrone数据(二)
  7. 华为手机耳机sws音效是什么_华为M3平板的SWS 3.0技术对于音效有哪些改善?
  8. ProM开发指北2——环境设置
  9. 深入理解Linux网络技术内幕学习笔记第十九章:因特网协议第四版(IPv4):Linux的原理和功能
  10. 详解Xcode 6的视图调试