3D数学基础-向量

向量的模

在这里插入图片描述

向量的方向

在这里插入图片描述

向量的运算

在这里插入图片描述
在这里插入图片描述

计算向量长度、向量以及向量的加减.cs

using UnityEngine;
using System.Collections;

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

    private void Update()  
    {
        Demo03(); 
    }

    //计算向量长度
    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.GetKey(KeyCode.A))
            //避免两物体的间距对速度造成影响
            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);

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

    }


}

TransformPoint.cs

TransformPoint()将点从自身坐标系转换到世界坐标系,在自身坐标系中物体自身就是原点

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

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

练习:计算前右方30度 10米处世界坐标

    //练习
    private void Demo07()
    { 
        //计算:前右方30度  10米处世界坐标 
        Vector3 localPos =  new Vector3
                                        (
                                            10 * Mathf.Sin(30 * Mathf.Deg2Rad), 
                                            0, 
                                            10 * Mathf.Cos(30 * Mathf.Deg2Rad)
                                        );
        //TransformPoint()将点从自身坐标系转换到世界坐标系,在自身坐标系中物体自身就是原点
        Vector3 worldPos = transform.TransformPoint(localPos);

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

点乘和叉乘结合显示0~360°.cs

    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度则
        }
		//叉乘和点乘结合可以显示0~360°
        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); 

    }

点乘

应用

在这里插入图片描述

结果与角度关系

在这里插入图片描述

1.a,b做归一化处理以后,a、b做点乘运算就可以直接得到a、b夹角的余弦值。
2.点积夹角的特点:(1)点积结果只能看0~180°(总是显示最小夹角)(如上方第一个图只显示白色小夹角,不显示红色大夹角)(2)点积结果的角度不分正负(如上方第一个图所示)
3.点积的作用:计算两向量的夹角。
4.判断夹角大于某角度的两种表达方式,如上方第三个图所示。

叉乘

在这里插入图片描述

应用

在这里插入图片描述

结果与角度关系

在这里插入图片描述
1.叉乘在unity中判断方向是使用左手定则,因为unity是左手坐标系
2.叉乘的应用:(1)创建垂直于平面的向量(2)判断两向量的相对位置,当a和b叉乘结果向上的时候,a到b应该是顺时针,当a和b叉乘结果向下的时候,a到b是逆时针。
3.点乘和叉乘结合可以求0~360°。
4.求180°~360°的方法:当a和b叉乘结果向下的时候,a到b是逆时针,所以这时需要使用点乘求得的angle,angle = 360-angle(如上方的图二所示)。
5.上方图三的练习求扇形攻击范围的代码需要注意。

练习:求扇形攻击范围

  private void Demo04()
    {
        //敌人正前方向量
        //方法一:
        Vector3 Radius = this.transform.TransformPoint(0, 0, 1) - this.transform.position;
        //方法二:
        //Vector3 Radius = this.transform.forward;
        //Debug.DrawLine(this.transform.position, Radius);
        float radian = Vector3.Dot(Radius.normalized, (tf.position - this.transform.position).normalized);
        angle = Mathf.Acos(radian) * Mathf.Rad2Deg;
        distance = Vector3.Distance(this.transform.position, tf.transform.position);
        if(angle < 60 && distance <= 20)
            Debug.DrawLine(Vector3.zero, transform.position, Color.red);
    }

常用属性及方法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

物体移动的三种方式.cs(MoveTowards和Lerp的使用)

    //自定义比例曲线
    public AnimationCurve Curve;
    private float x;
    //到达终点的秒数 默认初始化是1s
    public float duration = 1;
    //存放查找标签的那个物体
    private GameObject player;


    //移动的方式
    private void Demo05()
    {
        //1.匀速移动
        //MoveTowards()的参数三是速度
        //this.transform.position = Vector3.MoveTowards(this.transform.position, tf.transform.position, 0.1f);

        //2.变速移动(先快后慢),只能无限接近目标点 Lerp
        //起点不固定,终点固定
        //this.transform.position = Vector3.Lerp(this.transform.position, tf.transform.position, 0.05f);

        //3.自定义移动
        //起点固定,终点固定,比例根据曲线变化
        x += Time.deltaTime / duration;
        player = GameObject.FindGameObjectWithTag("Player");
        player.transform.position = Vector3.Lerp(new Vector3(0, 0, 0), tf.transform.position, Curve.Evaluate(x));

    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值