本帖最后由 da11 于 2021-6-14 11:54 编辑
//MathVectorDeom.cs
//实验可随便挂在任意物体上
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MathVectorDeom : MonoBehaviour
{
/* 什么是向量
* · 一个数字列表,表示各个维度上的有向位移。
* · 一个有大小有方向的物理量。
* - 大小就是向量的模长(magnitude)。
* - 方向描述了空间中向量的指向(direction)。
* · 可以表示物体的位置和方向。
*
* 向量的大小(模长)计算
* · 向量各分量平分和的平方根。
* · 公式:(x²+y²+z²)后开2次平方!
*
* · API调用方法计算: float Num2 = V3.magnitude;
* -- 模的平方 float Num = vector.sqrMagnitude;
* -- 因为平方根的计算耗时长,所以效率高于vector.magnitude。
*
* 向量的方向
* · 获取向量方向也称 “标准化向量”,或 “归一化向量”;
* 既获取该向量的单位向量。
* · 单位向量:大小为1的向量。
*
* · 公式:V / |V| (向量除以向量的模长!)
* · 几何意义:将该向量拉长或者缩短,使模长等于1.
*
* · API调用方法计算:Vector3 vector2 = vector1.Normalized();
* -- vector1.Normalized(); 将vector1自身设置为单位向量
* -- vector2 为vector1的单位向量
*
* 注意:标准化向量、归一化向量、单位向量,指的都是同一个东西:将该向量拉长或者缩短,使模长等于1.
* 向量相减
* · 等于各分量相加减
* · 公式:[x1,y1,z1] - [x2,y2,z2] = [x1-x2,y1-y2,z1-z2]
* · 几何意义:向量a与向量b相减,结果理解为以b的终点为始点,
* 以a的终点为终点的向量。方向由b指向a。
* · 应用案例:计算两点之间的距离和相对方向。
*
* 向量相加
* · 等于各分分量相加和
* · 公式:[x1,y1,z1] + [x2,y2,z2] = [x1+x2,y1+y2,z1+z2]
* · 几何意义:向量a与向量b相加,平移使b的始点与a的终点重合,
* 结果为以a的始点为始点,以b的终点为终点的向量。
* 应用案例:物体移动
*
* 向量与标量的乘除
* · 乘法: 该向量的各分量与标量相乘 k[x,y,z] = [xk,yk,zk]
* · 除法: 该向量的各分量与标量相除 [x,y,z]/k = [x/k,y/l,z/k]
* · 几何意义: 缩放向量长度。(方向不变)
*
*/
private void Update()
{
MathDemo1();
MathDemo2();
}
//模长演示方法
private void MathDemo1()
{
Vector3 V3 = this.transform.position;
//求平方的API方法:Mathf.Pow(源值,平方数);
//开2次平方的API方法:Mathf.Sqrt(源值);
//求模长--方案1,直接套公式:(x²+y²+z²)后开2次平方!--公式可以灵活运用
float Num1 = Mathf.Sqrt(Mathf.Pow(V3.x, 2) + Mathf.Pow(V3.y, 2) + Mathf.Pow(V3.z, 2));
//求模长--方案2,调用Vector3实例的magnitude方法即可。--一般求模长使用方案2
float Num2 = V3.magnitude;
//求模长--方案3,调用Vector3类的Distance(两点间距)方法,形参一个是0点,一个是测量点vector3的位置。--知道即可,一般求模长不用这个。
float Num3 = Vector3.Distance(Vector3.zero,V3);
//Debug.DrawLine是调试的时候,根据两点距离,画出两点间的一条线,在游戏发布后不会显示。
//以下举例:显示向量的直线距离
Debug.DrawLine(Vector3.zero, V3);
//Debug.LogFormat允许使用占位符在编辑器中调试显示
Debug.LogFormat("{0}--{1}--{2}", Num1, Num2, Num3);
}
//方向演示方法
private void MathDemo2()
{
Vector3 V3 = this.transform.position;
//求向量的方向--方案1:直接套公式:V / | V | (向量除以向量的模长!)
Vector3 FX1 = V3 / V3.magnitude;
//求向量的方向:(归一化、标准化)--方案2:调用Vector3实例的normalized方法即可。--一般求向量的方向使用方案2!
//结果FX2就是单位向量
Vector3 FX2 = V3.normalized;
//Debug.DrawLine是调试的时候,根据两点距离,画出两点间的一条线,在游戏发布后不会显示。最后形参可以加颜色区分
//以下举例:显示从零点到此单位向量的直线
//调试得知:单位向量永远都是只有1米,和单位大小的直线(Debug.DrawLine(Vector3.zero, V3))空间方向重合
Debug.DrawLine(Vector3.zero, FX2,Color.red);
}
}
//向量计算方法--重点课程
private void XLJSFF()
{
Vector3 relativeDirection = XLVar1.position - XLVar2.position;
//相减后方向:指向被减向量(前面的(XLVar1.position))
//相减后大小:两点间距
//实际向量的位置要平移到世界坐标的原点!
//按键按下,XLVar3沿着relativeDirection的方向移动
if (Input.GetKey(KeyCode.W))
{
//向量的变量只给方向的值,不给大小,通俗说就是不受距离影响,每次移动都是1米
//求向量的方向:(归一化、标准化),调用Vector3实例(XLVar3)的normalized方法即可。
//XLVar3.Translate(relativeDirection.normalized);
//Translate的原理公式,向量相加,用原来的实例position加上向量相减的方向
XLVar3.position = XLVar3.position + relativeDirection.normalized;
//向量相加减图
}
Debug.DrawLine(Vector3.zero, relativeDirection);
}
|