Unity 3D 数学之向量

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_40229737/article/details/102583500

进入Vector3类,operator定义这个数据类型(Vector3)都能使用哪些运算符

什么是向量

计算向量模长的三种方法 

this.transform.position是世界坐标,vector.zero是世界原点

获取向量的方向

向量相减

即结果为:

代码:移动物体从所在的位置沿着计算出的方向移动

向量相加

58与59行等价 

总结:平行四边形里面可以表示向量相加相减的含义 

向量与标量的乘除

向量点乘

向量叉乘

向量叉乘的应用

向量的点乘(两向量夹角)与叉乘(夹角方位(左右))

下面是相关代码:

using UnityEngine;
using System.Collections;

/// <summary>
/// 向量
/// </summary>
public class VectorDemo : MonoBehaviour
{
    public Transform t1, t2,t3;

    private void Update()
    {
        Demo08();
    }

    //计算向量长度
    private void Demo01()
    {
        Vector3 pos = transform.position;
        float m1 = Mathf.Sqrt(Mathf.Pow(pos.x, 2) + Mathf.Pow(pos.y, 2) + Mathf.Pow(pos.z, 2));
        float m2 = pos.magnitude;
        print(m1 + "----" + m2);
    }

    //计算向量方向
    private void Demo02()
    {
        Vector3 pos = transform.position;

        Vector3 n1 = pos / pos.magnitude;
        Vector3 n2 = pos.normalized;

        Debug.DrawLine(Vector3.zero, n1, Color.red);
    }

    //向量基本运算
    private void Demo03()
    {
        Vector3 result = t1.position - t2.position;
        //需求:t3 沿着 result 方向移动
        if (Input.GetMouseButtonDown(0))
            //t3.Translate(result.normalized);
            t3.position = t3.position + result.normalized;

        Debug.DrawLine(Vector3.zero, t1.position);
        Debug.DrawLine(Vector3.zero, t2.position);
        Debug.DrawLine(Vector3.zero, result, Color.red);

        //已知向量a  长度为8.3m
        //计算该方向 长度为1.5m的向量
        //解决方案:将a向量标准化, 再乘以1.5

    }

    //弧度与角度
    private void Demo04()
    { 
        // f1角度=>f2 弧度: 弧度=角度数*PI/180   
        float f1 = 50;
        float f2 = f1 * Mathf.PI / 180;
        float f3 = f1 * Mathf.Deg2Rad;
        // Mathf.Rad2Deg  弧度  --->  角度 
    }

    //三角函数
    private void Demo05()
    {
        /*
             sin x = a  /  c
             a = c *  sin x;
             c =  a / sin x; 
         */ 
         //已知:角度x  边长 a
         //计算:边长 c
        float x = 50;
        float a = 10;
        float c = a / Mathf.Sin(x * Mathf.Deg2Rad);

        //已知:边长 a  c
        //计算:角度angle
        float angle = Mathf.Asin(a / c) * Mathf.Rad2Deg;

        print(angle);
    }

    //自身坐标  -->  世界坐标
    private void Demo06()
    { 
        Vector3 worldPos = transform.TransformPoint(1, 0, 0); 
        Debug.DrawLine(this.transform.position, worldPos);  

        //transform.forward   
        //transform.up
        //transform.right
    }

    //练习
    private void Demo07()
    { 
        //计算:前右方30度  10米处世界坐标 
        Vector3 localPos =  new Vector3
                                        (
                                            10 * Mathf.Sin(30 * Mathf.Deg2Rad), 
                                            0, 
                                            10 * Mathf.Cos(30 * Mathf.Deg2Rad)
                                        );
        Vector3 worldPos = transform.TransformPoint(localPos);

        Debug.DrawLine(transform.position, worldPos);
    }

    public float angle;
    //向量     向量
    private void Demo08()
    {
        //向量   + - 向量
        //向量   *  / 数
        //向量   (点乘)  (叉乘)    向量
        //

        //参与点乘运算的向量标准化后,结果为夹角的 cos 值
        float dot = Vector3.Dot(t1.position.normalized, t2.position.normalized);
        angle = Mathf.Acos(dot) * Mathf.Rad2Deg;

        //if (angle > 30)//比较角度
        if (dot < 0.866f)//比较cos值
        {
            //如果夹角大于30度则
        }

        Vector3 cross = Vector3.Cross(t1.position, t2.position);
        if (cross.y <0)
        {
            angle = 360 - angle;
        }

        Debug.DrawLine(Vector3.zero, cross, Color.red);
        Debug.DrawLine(Vector3.zero, t1.position);
        Debug.DrawLine(Vector3.zero, t2.position); 



    }
}

猜你喜欢

转载自blog.csdn.net/qq_40229737/article/details/102583500