当前位置:   article > 正文

Unity三维数学 ——— 向量Vector、三角函数_unity 求vector

unity 求vector

一、Unity 中的向量

1、向量的长度

  1. public class sc03 : MonoBehaviour
  2. {
  3. // Update is called once per frame
  4. void Update () {
  5. Demo1();
  6. }
  7. void Demo1()
  8. {
  9. // 获取当前物体的空间坐标
  10. Vector3 pos1 = transform.position;
  11. //计算当前向量模长的三种方法
  12. float m01 = Mathf.Sqrt(Mathf.Pow(pos1.x, 2) + Mathf.Pow(pos1.y, 2) + Mathf.Pow(pos1.z, 2));//Method1
  13. float m02 = pos1.magnitude;//Method2-----Unity Provide
  14. float m03 = Vector3.Distance(Vector3.zero, pos1);//Method3
  15. Debug.LogFormat("{0}-----{1}-----{2}", m01, m02, m03);
  16. Debug.DrawLine(Vector3.zero, pos1,Color.red); //在原点到物体之间划红色的线
  17. }
  18. }

效果如下图所示

 

2、向量的归一化处理(即向量的方向)

  1. public class sc03 : MonoBehaviour
  2. {
  3. // Update is called once per frame
  4. void Update () {
  5. Demo1();
  6. }
  7. void Demo1()
  8. {
  9. // 获取当前物体的空间坐标
  10. Vector3 pos1 = transform.position;
  11. // 通过公式来对向量进行归一化处理
  12. Vector3 n01 = pos1 / pos1.magnitude;
  13. // 通过Unity的API来对向量进行归一化处理
  14. Vector3 n02 = pos1.normalized;
  15. Debug.DrawLine(Vector3.zero, pos1); //原点到物体间划线
  16. Debug.DrawLine(Vector3.zero, n01,Color.red);//原点到归一化后的向量之间划线
  17. }
  18. }

结果如下所示

 

3、向量的运算(求两点的方向):

(1)、在Unity中的两个向量相减的结果,如下图的a向量减b向量,所得到的结果并不在虚线处,而是实线处。因为它是从世界坐标原点作为起点的,相当于将所减的结果由虚线平移到坐标原点处。两个向量相减的结果一定是与这两个向量共起点(即世界坐标系的原点)。在Unity中 ab 的结果是如下图红色箭头所指的点。

 

(2)、在Unity中用代码展示如下:

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class OperVector : MonoBehaviour
  5. {
  6. public Transform tf0, tf1, tf2, tf3;
  7. void Start () {
  8. tf0 = GameObject.Find("Sphere").GetComponent<Transform>();//位于坐标原点:黑色的球
  9. tf1 = GameObject.Find("Sphere1").GetComponent<Transform>();//蓝色的球
  10. tf2 = GameObject.Find("Sphere2").GetComponent<Transform>();//紫色的球
  11. tf3 = GameObject.Find("Sphere3").GetComponent<Transform>(); //白色的球
  12. }
  13. // Update is called once per frame
  14. void Update () {
  15. Demo01();
  16. }
  17. /// <summary>
  18. /// 向量的方向
  19. /// </summary>
  20. void Demo01()
  21. {
  22. //dir01 相当于两个向量相减之后的点
  23. Vector3 dir01 = tf1.position - tf2.position;
  24. //该向量的方向为:坐标原点到dir01
  25. Debug.DrawLine(tf0.position, dir01,Color.red);
  26. Debug.DrawLine(tf0.position, tf1.position,Color.yellow);
  27. Debug.DrawLine(tf0.position, tf2.position,Color.yellow);
  28. Debug.DrawLine(tf1.position, tf2.position,Color.red);
  29. Debug.DrawLine(tf3.position, dir01,Color.blue);
  30. }
  31. }

结果如下

 

(3)、将一个向量平移到另一个地方,但方向依然保持不变。

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class Move : MonoBehaviour
  5. {
  6. Transform s1, s2, s3, s4;
  7. Vector3 v1;
  8. Vector3 v2;
  9. Vector3 leftv1,leftv2;
  10. void Start () {
  11. s1 = GameObject.Find("Sphere1").GetComponent<Transform>();
  12. s2 = GameObject.Find("Sphere2").GetComponent<Transform>();
  13. s3 = GameObject.Find("Sphere3").GetComponent<Transform>();
  14. s4 = GameObject.Find("Sphere4").GetComponent<Transform>();
  15. }
  16. private void Update()
  17. {
  18. // v1只表示s1到s2的向量,其长度固定,但起点位于世界坐标系的原点
  19. v1 = s2.position - s1.position;
  20. // v2只表示s2到s3的向量,其长度固定,起点位于世界坐标系的原点
  21. v2 = s3.position - s2.position;
  22. // leftv1相当于将向量v1平移到s4位置处,即方向大小保持不变,起点位于s4处。
  23. leftv1 = s4.position + v1;
  24. leftv2 = leftv1 + v2;
  25. Debug.DrawLine(s1.position, s2.position, Color.red);
  26. Debug.DrawLine(s2.position, s3.position, Color.yellow);
  27. Debug.DrawLine(s4.position, leftv1, Color.red);
  28. Debug.DrawLine(leftv1, leftv2, Color.yellow);
  29. }
  30. }

运行结果如下

  


二、向量的运算

1、向量的基本操作

  1. Vector3 a, b;
  2. //向量a[0],a[1],a[2]分别表示a.x , a.y , a.z
  3. a[0] = a[1] = a[2] = 10;
  4. Vector3.Angle(a, b); //返回向量a,b间的夹角,结果为度
  5. Vector3.Cross(a, b); //向量a,b叉乘
  6. Vector3.Dot(a, b); //向量a,b点乘
  7. // MoveTowards 是从一个点按指定的速度匀速的移动到另一个点,可以看到移动的过程。
  8. transform.position = Vector3.MoveTowards(this.transform.position, new Vector3(0, 0, 10),0.1f);

2、点乘与叉乘及求角度

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class OperVector : MonoBehaviour
  5. {
  6. private Transform tf0, tf1, tf2, tf3;
  7. float angle01;
  8. void Start () {
  9. tf0 = GameObject.Find("Sphere").GetComponent<Transform>();//位于坐标原点:黑色的球
  10. tf1 = GameObject.Find("Sphere1").GetComponent<Transform>();//蓝色的球
  11. tf2 = GameObject.Find("Sphere2").GetComponent<Transform>();//紫色的球
  12. tf3 = GameObject.Find("Sphere3").GetComponent<Transform>(); //白色的球
  13. }
  14. void Update () {
  15. Demo02();
  16. }
  17. void Demo01()
  18. {
  19. Debug.DrawLine(tf0.position, tf1.position,Color.yellow);
  20. Debug.DrawLine(tf0.position, tf2.position,Color.yellow);
  21. //两向量点乘
  22. float resultOfDot = Vector3.Dot(tf1.position, tf2.position);
  23. /*由点乘结果求两向量的夹角时,必须先对两向量归一化处理,或者最后除以两向量模长的乘积再求反余弦
  24. * 1、此时求的角是两向量间的最小夹角
  25. * 2、所求的角度没有正负之分,只能看大小
  26. * 3、对于标准化过的向量,方向完全相同,点乘结果为1,相反为-1
  27. * 4、角度的范围是:0——180度之间
  28. */
  29. float resultOfDot01 = Vector3.Dot(tf1.position.normalized, tf2.position.normalized);
  30. angle01 = Mathf.Acos(resultOfDot01) * Mathf.Rad2Deg;
  31. }
  32. void Demo02()
  33. {
  34. Debug.DrawLine(tf0.position, tf1.position, Color.yellow);
  35. Debug.DrawLine(tf0.position, tf2.position, Color.yellow);
  36. //求两向量的叉乘
  37. Vector3 resultOfCross = Vector3.Cross(tf1.position, tf2.position);
  38. Debug.DrawLine(Vector3.zero, resultOfCross,Color.red);
  39. //用叉乘来求两向量的夹角:叉乘求角度的范围是:0——90 度。
  40. Vector3 resultOfCross01 = Vector3.Cross(tf1.position.normalized, tf2.position.normalized);
  41. float angle02 = Mathf.Asin(resultOfCross01.magnitude) * Mathf.Rad2Deg;
  42. //结合点乘和叉乘,可以计算一圈的夹角
  43. /* 当叉乘大于0时,两向量的夹角小于180度;
  44. * 当叉乘小于0时,两向量的夹角大于180度。
  45. */
  46. if (resultOfCross.y<0)
  47. {
  48. float angle03 = 360 - angle01;
  49. }
  50. }
  51. }

 


三、Unity 中三角函数的角度表示

  1. //角度到弧度转换
  2. float d = 60; //60度
  3. float r1 = d * Mathf.PI / 180;
  4. float r2 = d * Mathf.Deg2Rad;
  5. //弧度到角度
  6. float r = 3;
  7. float d1 = r * 180 / Mathf.PI;
  8. float d2 = r * Mathf.Rad2Deg;

 

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

闽ICP备14008679号