Unity当中经常会用到向量的运算来计算目标的方位,朝向,角度等相关数据,下面咱们来通过实例学习下Unity当中最常用的点乘和叉乘的使用。

点乘 

(又称"点积","数量积”,"内积")(Dot Product, 用*)

定义:a·b=|a|·|b|cos<a,b> 【注:粗体小写字母表示向量,<a,b>表示向量a,b的夹角,取值范围为[0,180]】

几何意义:是一条边向另一条边的投影乘以另一条边的长度.

v1v2向量的点乘运算:相应元素的乘积的和:v1( x1, y1,z1) * v2(x2, y2,z2) = x1*x2 + y1*y2+z1*z2;

注意 : 结果不是一个向量,而是一个标量。

性质1: a*b = |a||b|Cos(θ) θ是向量a 和向量 b之间的夹角。

性质2: a*b = b*a  满足乘法交换律

Unity项目应用:

1.根据点乘计算两个向量的夹角。<a,b>= arccos(a·b / (|a|·|b|))

2.根据点乘的正负值,得到夹角大小范围,>0,则夹角(0,90)<0,则夹角(90,180),可以利用这点判断一个多边形是面向摄像机还是背向摄像机。

3.根据点乘的大小,得到向量的投影长度,反应了向量的长度关系。

4.在生产生活中,点积同样应用广泛。利用点积可判断一个多边形是否面向摄像机还是背向摄像机。向量的点积与它们夹角的余弦成正比,因此在聚光灯的效果计算中,可以根据点积来得到光照效果,如果点积越大,说明夹角越小,则物理离光照的轴线越近,光照越强。物理中,点积可以用来计算合力和功。若b为单位矢量,则点积即为a在方向b的投影,即给出了力在这个方向上的分解。功即是力和位移的点积。计算机图形学常用来进行方向性判断,如两矢量点积大于0,则它们的方向朝向相近;如果小于0,则方向相反。矢量内积是人工智能领域中的神经网络技术的数学基础之一,此方法还被用于动画渲染(Animation-Rendering)。

叉乘

(又称"叉积","向量积","外积")(cross product,用x)

定义:c = a x b,其中a b c均为向量

几何意义是:得到一个与这两个向量都垂直的向量,这个向量的模是以两个向量为边的平行四边形的面积

v1v2向量的叉乘运算:相应元素的乘积的和:v1( x1, y1,z1) x v2(x2, y2, z2) = (y1*z2 - y2*z1)i+(x2*z1 - x1*z2)j+(x1*y2-x2*y1)k;

利用三阶行列式计算

|i    j   k|

|x1 y1  z1|

|x2  y2  z2|

性质1:c⊥a,c⊥b,即向量c与向量a,b所在平面垂直

性质2:模长|c| = |a||b| sin<a,b>

性质3:(数学上)满足右手法则, a x b = -b x a,所以我们可以使用叉乘的正负值来判断a,b的相对位置,即b是处于a的顺时针还是逆时针方向。

叉乘的右手定则是用来确定叉乘积的方向的。

右手法则:右手的四指方向指向第一个矢量,屈向叉乘矢量的夹角方向(两个矢量夹角方向取小于180°的方向),那么此时大拇指方向就是叉乘所得的叉乘矢量的方向.(大拇指应与食指成九十度)(注意:Unity当中使用左手,因为Unity使用的是左手坐标系)

数学上叉乘的右手法则

Unity当中叉乘的左手法则

Unity项目应用:

1.根据叉乘得到a,b向量的相对位置,和顺时针或逆时针方位。

简单的说: 点乘判断角度,叉乘判断方向。 
形象的说: 当一个敌人在你身后的时候,叉乘可以判断你是往左转还是往右转更好的转向敌人,点乘得到你当前的面朝向的方向和你到敌人的方向的所成的角度大小。

2.得到a,b夹角的正弦值,计算向量的夹角(0,90),可以配合点乘和Angle方法计算出含正负的方向。

3.根据叉乘大小,得到a,b向量所形成的平行四边形的面积大小,根据面积大小得到向量的相对大小。

下面是代码

using UnityEngine;public class VectorExample : MonoBehaviour {//点积private void TestDot(Vector3 a, Vector3 b){// 计算 a、b 点积结果float result = Vector3.Dot(a, b);// 通过向量直接获取两个向量的夹角(默认为 角度), 此方法范围 [0 - 180]float angle = Vector3.Angle(a, b);// 计算 a、b 单位向量的点积,得到夹角余弦值,|a.normalized|*|b.normalized|=1;result = Vector3.Dot(a.normalized, b.normalized);// 通过反余弦函数获取 向量 a、b 夹角(默认为 弧度)float radians = Mathf.Acos(result);// 将弧度转换为 角度angle = radians * Mathf.Rad2Deg;}//叉乘private void TestCross(Vector3 a, Vector3 b){//计算向量 a、b 的叉积,结果为 向量 Vector3 c = Vector3.Cross(a, b);// 通过反正弦函数获取向量 a、b 夹角(默认为弧度)float radians = Mathf.Asin(Vector3.Distance(Vector3.zero, Vector3.Cross(a.normalized, b.normalized)));float angle = radians * Mathf.Rad2Deg;// 判断顺时针、逆时针方向,是在 2D 平面内的,所以需指定一个平面,//下面以X、Z轴组成的平面为例 , (Y 轴为纵轴),// 在 X、Z 轴平面上,判断 b 在 a 的顺时针或者逆时针方向,if (c.y > 0){// b 在 a 的顺时针方向}else if (c.y == 0){// b 和 a 方向相同(平行)}else{// b 在 a 的逆时针方向}}// 获取两个向量的夹角  Vector3.Angle 只能返回 [0, 180] 的值// 如真实情况下向量 a 到 b 的夹角(80 度)则 b 到 a 的夹角是(-80)// 通过 Dot、Cross 结合获取到 a 到 b, b 到 a 的不同夹角private void GetAngle(Vector3 a, Vector3 b){Vector3 c = Vector3.Cross(a, b);float angle = Vector3.Angle(a, b);// b 到 a 的夹角float sign = Mathf.Sign(Vector3.Dot(c.normalized, Vector3.Cross(a.normalized, b.normalized)));float signed_angle = angle * sign;Debug.Log("b -> a :" + signed_angle);// a 到 b 的夹角sign = Mathf.Sign(Vector3.Dot(c.normalized, Vector3.Cross(b.normalized, a.normalized)));signed_angle = angle * sign;Debug.Log("a -> b :" + signed_angle);}
}

Unity 点乘和叉乘的原理和使用相关推荐

  1. Unity中实现溶解(Dissolve)特效及其原理解析

    Unity中实现溶解(Dissolve)特效及其原理解析 今天我们分享一个Unity中非常常见的特效: 溶解. 下面先来看看效果. 大家可能和我一样, 在不了解实现方式的时候, 会觉得这个效果很神奇, ...

  2. java半碳前叉结构,山地车避震前叉功能及原理分类详解(图文)

    什么是山地车避震前叉?山地车避震前叉的作用是什么?同没有减震前叉的车有什么区别?山地车避震前叉的维修保养.如上等等一系列关于山地车避震前叉的问题苦恼了很多车友,及新手朋友们,下面,小编为你汇总了山地车 ...

  3. android 叉叉助手 弹幕原理

    叉叉助手能实现从它的app打开另外的app,并实现弹幕,请问下这种弹幕效果是用的什么技术呢?

  4. 二叉堆的原理和构建、调整

    /*** 二叉堆* <p>* 本质上是一种完全二叉树,分为最大堆和最小堆* 最大堆: 任何一个父节点的值都大于等于它左右孩子节点的值* 最小堆:任何一个父节点的值,都小于或者等于它左右孩子 ...

  5. Unity | Video Player的使用方法和原理

    讲解逻辑为Unity | 基础逻辑_菌菌巧乐兹的博客-CSDN博客 一.把素材仓库里的视频放进Game界面 1.我们需要在素材仓库中放一个视频(其他文件夹不用管,我只是懒得删了) 2.在Unity里建 ...

  6. 优先队列-二叉堆-堆排序原理-Java相关API

    完全二叉树概念 除了最后一层,前面所有层都是满的 最后一层是从左到右 是一个二叉树 堆 满足完全二叉树 父节点存储的元素比子节点大 上浮 不符合堆规则的节点,与父节点交换 直到上浮到符合为止 下沉 不 ...

  7. Unity游戏开发客户端面经——数学(初级)

    前言:记录了总6w字的面经知识点,文章中的知识点若想深入了解,可以点击链接学习.由于文本太多,按类型分开.这一篇是 数学 常问问题总结,有帮助的可以收藏. 1. 四元数与欧拉角 1.1 四元数概念 四 ...

  8. Unity协程(Coroutine)原理深入剖析

    Unity协程(Coroutine)原理深入剖析 By D.S.Qiu 尊重他人的劳动,支持原创,转载请注明出处:http.dsqiu.iteye.com 记得去年6月份刚开始实习的时候,当时要我写网 ...

  9. Unity向量的点乘和叉乘的使用

    Unity中点乘和叉乘 点乘(API: Vector3.Dot()) 点乘的计算公式 点乘的几何意义 用途之一:判断一个物体当前方位 利用点乘求出角度 叉乘(API: Vector3.Cross()) ...

最新文章

  1. java中整数的整数次方_数值的整数次方 - 剑指 Offer 学习心得_教程_Java开发社区...
  2. python矩阵sin计算器_Python-Numpy科学计算器的基本软件包
  3. SpringBoot图文教程4—SpringBoot 实现文件上传下载(亲测)
  4. SQLServer数据库收缩相关知识笔记
  5. H.264解码器中CAVLC码表查找算法的分析与优化
  6. String和StringBuffer、StringBuilder的区别
  7. 【回归预测】基于matlab布谷鸟算法优化BP神经网络回归预测(多输入单输出)【含Matlab源码 1555期】
  8. 基于java人脸识别考勤签到系统设计与实现毕业设计毕设作品
  9. 14行代码教你制作自己的有道词典单词本(python)
  10. Web前端主流框架优缺点有哪些?小编帮你分析
  11. JZOJ1321 灯
  12. 卷积神经网络之 - 残差⽹络(RESNET)
  13. python循环语句打印三角形_python循环输出三角形图案的例子
  14. vue+node.js+mysql的数据库课程设计有感
  15. Centos7用户相关及多用户迁移
  16. Python修改论文的字体及其大小
  17. 数据分析,怎么做才能有前瞻性?
  18. (windows图形化界)粘滞键后门
  19. 【大数据】第二章:搭建Hadoop集群(送尚硅谷大数据笔记)
  20. 回馈社会 初志企业文化践行月活动顺利开展

热门文章

  1. 泰山OFFICE技术讲座:给中文设置英文字体,会怎样
  2. awx文件解析_气象卫星分发产品及其格式规范AWX2.1(数据格式C语言)
  3. 定义一个矩形类(Rectangle),私有数据成员为矩形的长度( len)和宽度(wid),缺省构造函数置len和wid为0,有参构造函数置len和wid为对应形参的值,另外还包括求矩形周长、面积
  4. NVMe固态硬盘安装Windows 7方法
  5. Java多线程 - ReentrantLock实际开发中的应用场景
  6. 防止onresize事件触发多次
  7. 直播回顾丨Shopee 官方联合!2万点赞!千人在线!全程干货直击跨境小白!
  8. 什么是JAVA构建路径
  9. github pages + jekyll 构建静态网站
  10. 微信小程序生态13-微信公众号自定义菜单、个性化菜单配置