3D 数学基础
前言
本身对这方面其实不是很会,没办法,那天写了个功能用到这块了,临时抱佛脚学一学/(ㄒoㄒ)/~~,记录下来别回来又忘了
学习视频B站上的达内教程
https://www.bilibili.com/video/BV1Jt411974P?p=15&spm_id_from=pageDriver
向量
向量是一个数字列表(比如:(1,2,3)或者(1,2)),
他表示的是各个维度上的有向(有方向)位移。
向量是由大小(模长)和方向组成的
大小和模长是一个意思
方向空间中向量的指向
描述物体的位置和方向
如何获取大小和方向
通过数学公式
大小
private void Update()
{
Demo01();
}
//模长
private void Demo01()
{
Vector3 pos = this.transform.position;
//求模长
//1.套公式
//Mathf.Pow平方
//Mathf.Sqrt开平方
float m01 = Mathf.Sqrt(Mathf.Pow(pos.x,2) + Mathf.Pow(pos.y,2) + Mathf.Pow(pos.z,2));
//2.调API 获取向量模长
float m02 = pos.magnitude;
//3.两点间距
float m03 = Vector3.Distance(Vector3.zero,pos)
//编译器下画线段 从世界原点画到当前物体
Debug.DrawLine(Vector3.zero,pos);
}
方向
private void Update()
{
Demo02();
}
//方向
private void Demo02()
{
Vector3 pos = this.transform.position;
//求模长
//1.套公式
Vector3 n01 = pos/pos.magnitude;
//2.调API 获取向量方向 计算单位向量(长度为1)
Vector3 n02 = pos.normalized;
Debug.DrawLine(Vector3.zero,pos);
Debug.DrawLine(Vector3.zero,n02,Color.red);
}
向量计算
public Transform t1,t2;
private void Update()
{
Demo03();
}
//向量计算
private void Demo03()
{
//向量相减 减完后还是向量 a - b 箭头朝a b - a 箭头朝b (减号前面的)
Vector3 relativeDirection = t1.position - t2.position
//方向:只向被减向量 (举例子:比如敌人朝玩家开枪,从敌人的枪口射出子弹,用玩家的位置减敌人的位置,这就是箭头指向玩家)
//大小:两点间距 (举例子:比如子弹朝着某个方向飞,如果不拿单位向量,距离远会直接飞过去,距离近会慢慢飞过去,点normalized把他归一,因为如果移动的话给的向量包含方向和大小,现在只要方向不要大小)
//注意:实际位置平移到原点
Debug.DrawLine(Vector3.zero,relativeDirection);
}
三角函数
private void Update()
{
Demo01();
}
private void Demo01()
{
//角度转弧度
float jiaoDu = 60;
//1.套公式
float huDu = jiaoDu * Mathf.PI / 180;
//2.API
float huDu2 = jiaoDu * Mathf.Deg2Rad;
//弧度转角度
float huDu3 = 3;
//1.套公式
float jiaoDu = huDu3 * 180 / Mathf.PI;
//2.API
float jiaoDu = huDu3 * Mathf.Rad2Deg;
}
什么时候用三角函数什么时候用反三角函数
private void Update()
{
Demo01();
}
private void Demo01()
{
//练习:计算物体右前方30°,10m远坐标
float x = Mathf.Sin(30 * Mathf.Deg2Rad) * 10;
float z = Mathf.Cos(30 * Mathf.Deg2Rad) * 10;
Vector3 worldPoint = transform.TransformPoint(x,0,z);
Debug.DrawLine(this.transform.position,worldPoint);
}
向量的运算都有哪些
向量 和 向量 + -
向量 和 数字 * /
向量 和 向量 点乘Dot叉乘Cross
点乘
private void Update()
{
Demo01();
}
private void Demo01()
{
Debug.DrawLine(Vector3.zero,t1.position);
Debug.DrawLine(Vector3.zero,t2.position);
//余弦值
float dot = Vector3.Dot(t1.position.normalized,t2.position.normalized);
//反余弦 转角度
float angle = Mathf.Acos(dot) * Mathf.Rad2Deg;
//这样算出来的分不清180°以上角度 永远算的是最小的角度,所以这个度数一定在180以内
}
叉乘
private void Update()
{
Demo01();
}
private void Demo01()
{
Vector3 cross = Vector3.Cross(t1.position,t2.position);
//判断他的y值是大于0还是小于0,如果是小于0说明在三四象限,超过了180°,又因为点乘计算的是最小的夹角,需要用360减去这个最小的夹角,才能求出来实际需要的度数
if(cross.y < 0)
{
angle = 360 - angle;
}
Debug.DrawLine(Vector3.zero,cross);
}
欧拉角
优点
这里说表达方位的有三种 一个是欧拉角 3个数 一个是四元数 4个数 还有一个是矩阵 16个数
缺点
private void Update()
{
Demo01();
}
private void Demo01()
{
//这个向量有大小(当前位置到世界原点)和方向(世界原点只想当前位置)
Vector3 pos = this.transform.position;
//这个欧拉角没有大小和方向 只包含x y z
Vector3 euler = this.transform.eulerAngles;
}
万向节死锁