#1.基本概念
两个向量的点乘(Dot),就是我们说的数量级 a·b=|a|·|b|cosθ 结果是一个标量,如果==0,则两个向量夹角等于90度,垂直关系 小于0,则两个向量夹角大于90度 大于0,则两个向量夹角小于90度 如果cosθ 等于-1,则两个向量相反,等于1则两个向量同向 如果两个向量a,b均 为单位 向量 ,那么a.b等于向量b在向量a方向上的投影的长度
两个向量的叉乘,得到的是一个向量,是一个矢量,垂直于原来两个向量组成的平面,有两个方向。 c = a x b,其中a b c均为向量 模长|c| = |a||b| sinθ 在unity里面当敌人在你身后的时候,叉乘可以判断你是往左转还是往右转更好的转向敌人, 点乘得到你当前的面朝向的方向和你到敌人的方向的所成的角度大小
点乘因为计算的是角度,所以在计算的过程中需要格式化向量 叉乘计算的是垂直于2个计算向量的一个向量,计算过程中不需要格式化
transform.forward默认就是已经格式化了(单位向量=1以内的向量)
public Vector3 forward
{
get => this.rotation * Vector3.forward;
set => this.rotation = Quaternion.LookRotation(value);
}
#2.功能演示
#3.演示代码
public class TestVector : MonoBehaviour
{
public Transform target;
private float rightOrLeft;
void Update()
{
var direction = target.position - transform.position;
transform.Translate(direction.normalized * Time.deltaTime * 3f, Space.World);
var dotF = Vector3.Dot(transform.forward, direction.normalized);
var degree = Mathf.Rad2Deg * Mathf.Acos(dotF);
var crossV3 = Vector3.Cross(transform.forward, direction);
var dot = Vector3.Dot(crossV3.normalized, Vector3.up);
if (dot > 0)
{
rightOrLeft = 1.0f;
Debug.Log("同向,往右转");
}
else
{
rightOrLeft = -1.0f;
Debug.Log("反向,往左转");
}
Debug.Log("degree:" + degree) ;
Debug.Log("dotF:" + dotF);
if (degree > 3)
{
transform.Rotate(Vector3.up, Time.deltaTime * 500f * rightOrLeft, Space.World);
}
}
}
|