当前位置:   article > 正文

Unity中的数学基础——向量_unity向量

unity向量

一:概念 

——向量也称为矢量,是具有大小和方向的量(零向量比较特殊,是唯一一个大小为0并且没有方向的向量)。向量的大小(长度)称为模,长度为1的向量称为单位向量
——书写向量时,水平书写的向量([1,2,3])叫做行向量,垂直书写的向量叫做列向量


二:点与向量的关系

点代表了一个位置,他没有大小和方向的概念。而向量具有大小和方向的概念。Unity中的transform.position代表了一个点,它不具有方向。transform.forward代表了一个向量,它代表了当前物体在世界坐标z轴上的指向。但是他们在Unity中都是通过(x,y,z)来表示的


三:向量的几种关系

——向量AB不等于向量BA,因为方向不同
——向量AB等于负的向量BA,因为方向相同
——向量AB的长度等于向量BA的长度
——向量AB+向量BA=零向量,因为两个向量相反


四:单位向量

长度为1的向量称为单位向量。当我们只关心向量方向,不关心向量大小时,则可以使用单位向量。 
普通向量变换为单位向量的过程称为向量归一化

  1. Vector3 A = new Vector3(1, 2, 3);
  2. Vector3 B = new Vector3(2, 4, 5);
  3. Vector3 v = (B - A).normalized;
  4. Debug.Log("AB向量归一化后的坐标:" + v); //AB向量归一化后的坐标:(1/3,2/3,2/3)

五:向量的长度

  1. Vector3 A = new Vector3(1, 2, 3);
  2. Vector3 B = new Vector3(2, 4, 5);
  3. //第一种方法:Vector3.Magnitude,Vector3.SqrMagnitude求出的是长度的平方
  4. float dis = Vector3.Magnitude(B - A);
  5. //第二种方法:Vector3.Distance
  6. //float dis = Vector3.Distance(A, B);
  7. Debug.Log("AB向量的长度:" + dis); //AB向量的长度:3

六:向量的点积(内积)

向量点积后的结果是一个标量

点乘的结果大于0,则两个向量的夹角0<=θ<90
点乘的结果等于0,则两个向量的夹角θ=90,互相垂直
点乘的结果小于0,则两个向量的夹角90<θ<=180

  1. Vector3 A = new Vector3(1, 1);
  2. Vector3 B = new Vector3(1, 0);
  3. float dot = Vector3.Dot(A, B);
  4. Debug.Log("A向量与B向量的点乘为:" + dot); //A向量与B向量的点乘为:1
  5. float angle = Vector3.Angle(A, B);
  6. Debug.Log("A向量与B向量的夹角为:" + angle); //A向量与B向量的夹角为:45

Vector3.Angle求得的是不带符号的角度,在0度到180度之间
Vector2.SignedAngle求得得是带符号的角度,向量a到向量b是逆时针,结果是正数,反之,结果是负数,如果是180度则都是正数 


七:向量的叉积(外积)


2条性质
——叉乘求得的向量是垂直于A向量与B向量的(叉乘求得的向量与A向量和B向量的点积为0),求得的是一个平面的法向量

——axb不等于bxa,axb=-bxa

以下结论都是以左手定则为准的:(二维向量比较叉积的Z值,三维向量比较叉积的Y值)
叉乘的结果大于0,则向量旋转到向量B是顺时针
叉乘的结果等于0,则向量A与向量B是共线的
叉乘的结果小于0,则向量A旋转到向量B是逆时针

  1. Vector3 A = new Vector3(1, 2, 3);
  2. Vector3 B = new Vector3(-2, -2, 3);
  3. Vector3 cross = Vector3.Cross(A, B);
  4. Debug.Log("A向量与B向量的叉乘为:" + cross); //A向量与B向量的叉乘为:(12,-9,2)


八:求一个向量在另一个向量上的投影以及投影长度

求一个向量在另一个向量上的投影长度以及投影:

  1. Vector3 projection = Vector3.Project(new Vector3(4, 4, 4), new Vector3(0, 0, 1));
  2. float projectionDis = projection.magnitude;
  3. Debug.Log("向量(4,4,4)在向量(0,0,1)上的投影向量为:" + projection);
  4. Debug.Log("向量(4,4,4)在向量(0,0,1)上的投影长度为:" + projectionDis);

九:向量在游戏中的运用案例

——使用点乘求敌人在玩家的前后

  1. using System;
  2. using UnityEngine;
  3. public class Test : MonoBehaviour
  4. {
  5. public GameObject player;
  6. public GameObject enemy;
  7. void Awake()
  8. {
  9. }
  10. private void Start()
  11. {
  12. }
  13. private void Update()
  14. {
  15. Vector3 v1 = enemy.transform.position - player.transform.position;
  16. Vector3 v2 = player.transform.forward;
  17. float dot = Vector3.Dot(v1, v2);
  18. if (dot > 0)
  19. {
  20. Debug.Log("敌人在前方");
  21. }
  22. else if (dot == 0)
  23. {
  24. Debug.Log("敌人在正左右方向");
  25. }
  26. else
  27. {
  28. Debug.Log("敌人在后方");
  29. }
  30. }
  31. }


—— 


十:向量的一些公式

——已知向量a(x1,y1)与向量b(x2,y2)垂直,x1*x2+y1+y2=0
——已知向量a(x1,y1),则向量a的方向为y1/x1
——已知向量a的斜率为k,向量b与向量a垂直,则向量b的斜率为-1/k
——已知向量a的斜率为k,则向量a的方向为(1,k),向量a的单位向量为1/根号下(1+k平方)


十一:向量叉积的程序示意


由向量A旋转到向量B其实没有所谓的顺时针与逆时针,A向量顺时针或逆时针都可以旋转到向量B,所以定义了旋转的方向只能大于等于0小于等于180°。unity左手坐标系中的叉积计算遵循左手定则,即左手微握,大拇指伸出,向量A按四指旋转方向旋转到向量B时,且小于等于180°,则向量C沿着大拇指方向,大于180°小于等于360°则与大拇指反方向,这点刚好和叉积的右手定则反过来了

  1. using UnityEngine;
  2. public class CrossTest : MonoBehaviour
  3. {
  4. public Transform a;
  5. public Transform b;
  6. private Vector3 worldCenter = Vector3.zero;
  7. private void Update()
  8. {
  9. a.RotateAround(worldCenter, Vector3.up, 30 * Time.deltaTime);
  10. Vector3 cross = Vector3.Cross(a.position, b.position);
  11. Debug.DrawLine(worldCenter, a.position - worldCenter, Color.yellow);
  12. Debug.DrawLine(worldCenter, b.position - worldCenter, Color.blue);
  13. Debug.DrawLine(worldCenter, cross, Color.red);
  14. }
  15. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/100169
推荐阅读
相关标签
  

闽ICP备14008679号