using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _3D数学基础及坐标系统
{
class Program
{
static void Main(string[] args)
{
}
#region 一:3D数学基础及坐标系统
private void mathBase()
{
#region 1:向量
#region 1.1:向量的定义
//•一个数字列表,表示各个维度上的有向位移。例Vector(3,4,0)表示该物体位置在x=3,y=4,z=0的位置。
//•一个有大小有方向的物理量。
//-- 大小就是向量的模长。即坐标轴原点到该物体向量的位置(magnitude)
//-- 方向描述了空间中向量的指向。即坐标原点指向该物体向量位置的方向(象限)(direction)
//•向量可以表示物体的位置和方向。
#endregion
#region 1.2:向量大小方向的计算
//大小:向量各分量平方和的平方根。
//公式 ? ² +Y ² +Z ²开平方
//API:float dis=vector.magnitude; dis为此目标向量的长度
//--模的平方vector.sqrMagnitude 因为平方根的计算耗时长,
//所以效率高于magnitude。直接计算向量的平方会省去开平方的步骤
//方向:获取向量方向也称“标准化向量”,或“归一化向量” ;即获取该向量的单位向量。
//•单位向量:大小为1的向量。
//•公式:V / |V|
//•几何意义:将该向量拉长或者缩短,使模长等于1。
//•API:Vector3 vector2=vector1.normalized; --vector2为vector1的单位向量,
//--vector1.Normalize(); 将vector1自身设置为单位向量
#endregion
#region 1.3:向量的运算
#region 1.3.1:相减
//•等于各分量相加减;
//•公式:[x1,y1,z1] -[x2,y2,z2] = [x1-x2,y1-y2,z1-z2]
//•几何意义:向量a与向量b相减,结果理解为以b的终点为始点,以a的终点为终点的向量。方向由b指向a。
//两向量相减的结果向量为从减数终点指向被减数终点的向量;
//例:Vector Z=Vector3 X-Vector3 Y 向量Z为从Y终点指向X终点的向量。长度为X到Y的距离,方向是Y指向X
//作用:计算两点之间的距离和相对方向。
#endregion
#region 1.3.2:相加
//•等于各分量相加和。
//•公式:[x1,y1,z1] + [x2,y2,z2] = [x1+x2,y1+y2,z1+z2]
//•几何意义: 向量a与向量b相加,平移使b的始点与a的终点重 合,结果为以a的始点为始点,以b的终点为终点的向量
//•应用:物体移动
//例:Vector Z=Vector3 X+Vector3 Y 以X与Y向量做一个四边形。向量Z为对角线,长度为x+y,方向为从坐标原点
// 出发,指向X与Y的四边形对角方向
#endregion
#region 1.3.3:向量与标量的乘除
//•乘法:该向量的各分量与标量相乘k[x,y,z] = [xk,yk,zk]。例Vector x=Vector Y*2;X与Y方向相同,X的长度是Y的两倍
//•除法:该向量的各分量与标量相除[x,y,z]/k = [x/k,y/k,z/k]。例Vector x=Vector Y/2;X与Y方向相同,X的长度是Y的二分之一
//•几何意义:缩放向量长度。
#endregion
#endregion
#endregion
#region 2:三角函数
#region 2.1:角与弧度
//PI=180° 1弧度=180°/PI 1角度=PI/180°
//角度==>弧度:弧度=角度数*PI/180°
//API:弧度=角度*Mathf.Deg2Rad
//弧度==>角度:角度=弧度*180/PI
//API:角度=弧度数*Mathf.Rad2Deg
#endregion
#region 2.2:三角函数与反三角函数
#region 2.2.1 三角函数Sin(关系:一角,对边,斜边)
//sin x=x的对边/x的斜边
//API:Mathf.Sin(float 角度)
//例:已知一个三角形中的一角a及其对边x,求其斜边y
// y=sinx*a
// 斜边y=Mathf.Deg2Rad*(Mathf.sin(x*a))
// 知a的对边x及斜边y,求a的度数
// a=Mathf.Rad2Deg*(Mathf.sin(x/y))
#endregion
#region 2.2.2 三角函数Cos(关系:一角,临边,斜边)
//cos x=x的临边/x的斜边
//API:Mathf.Cos(flota 角度)
#endregion
#region 2.2.3 三角函数tan(关系:一角,对边,临边)
//tan x=x的对边/x的临边
//API:Mathf.tan(flota 角度)
#endregion
#region 2.2.4 反三角函数arcsin(关系:知两边求一角,对边,斜边)
//角度x=arcsin(x的对边/x的临边)
//API:Mathf.ASin(flota 角度)
//例:已知一三角形中a的对边为x,临边为y,求x的角度
// x=arcsin(x/y)
// x=(Mathf.Asin(x/y))*Mathf.Deg2Red
#endregion
#region 2.2.5 反三角函数arccos(关系:临边,斜边)
//x=x的临边/x的斜边
//API:x=Mathf.ACos(float 角度)
#endregion
#region 2.2.5 反三角函数arctan(关系:临边,对边)
//x=x的对边/x的临边
//API:Mathf.Atan(角度)
#endregion
#endregion
#endregion
#region 3:向量的点乘(点积,内积)与叉乘(叉积,外积)
#region 3.1:点乘
//公式:各分量乘积和
//几何意义:a·b=|a| · |b| cos<a,b> 两个向量的单位向量相乘后再乘以二者夹角的余弦值。
//API:float dot=Vector3.Dot(va, vb);
//例:ab为点a至点b的向量。ac为点a至点c的向量。x为ab与ac的点乘,
// y为以ab和ac的夹角弧 度,z为ab和ac形成的角度。
//ab = a - b;
//ac = a - c;
//x=Vector3.Dot(ab,ac)
//y = Vector3.Dot(ab.normalized, ac.normalized);
//z = Mathf.Rad2Deg * Mathf.Acos(x);
#endregion
#region 3.2叉乘
//公式:[x1,y1,z1] x [x2,y2,z2] =[y1 * z2 -z1 * y2, z1 * x2 -x1 * z2, x1 * y2 -y1 * x2]
//几何意义:结果为两个向量所组成面的垂直向量,模长为两 向量模长乘积再乘夹角的正弦值。
//API:Vector vector=Vector3. Cross (a, b);
//例:ab和ac为以a,b,c三个向量组成的面,向量x为ab和ac的叉乘。从a点画线到a-x的距离,垂直于a,b,c三个点的面
//ab = a - b;
//ac = a - c;
//x = Vector3.Cross(ab, ac);
//x = a - x;
//Debug.DrawLine(a, x, Color.green);
#endregion
#endregion
#region 4:欧拉角与四元数
#region 4.1:欧拉角
//定义:使用三个角度来保存方位。X与Z沿自身坐标系旋转,Y沿世界坐标系旋转。
//简单来说就是Unity中物体的rotation
//优点:x,y,z 三个轴的三个角度,很方便,而且便于理解,例如:沿x轴旋转30度,只需将X改为30即可
//缺点:因为为Unity中的内置角度问题,一个物体可以有任何方向的任何度数,为了使任何方向的度数
// 都是独一无二的,所以欧拉角的三个方向的度数范围是被规定的。
//万向节死锁:简单来说就是两条轴转到一个地方一个方向了。
//API:Vector3 eulerAngle= this.transform.eulerAngles;
#endregion
#region 4.2:四元数
//API:Quaternionqt=this.transform.rotation;
//定义:四元数在3D图形学中表示旋转,由一个三维向量(X/Y/Z)和一个标量(W)组成
// (个人理解xyz为三个方向的角度,而标量则为标准角度转换而来的)
//计算 1:左乘向量,代表该向量照其四元数的角度旋转
//例: newPpint沿Y轴旋转30度
// Vector3 point = new Vector3(0,0,10);
// Vector3 newPoint = Quaternion.Euler(0, 30, 0) * point;
//计算 2:两个四元数相乘可做组合旋转方法,其结果为各个方向的角度相加
//例:
// Quaternion.Euler(0, 30, 0)*Quaternion.Euler(0, 30, 0)==Quaternion.Euler(0, 60, 0)
//优点:可使物体沿自身Y轴旋转。用物体自身的rotation乘上要旋转的角度,内部就是两个四元数相乘,
// 避免万向节锁死
// 例:this.transform.rotation*=Quaternion.Euler(0, 1, 0);
//缺点:难于使用,不建议单独修改四元数中的某个元素,存在不合法的四元数
#endregion
#endregion
}
#endregion
#region 二:坐标系
#region 1:Unity坐标系(世界,自身,屏幕,摄像机)
//World Space:世界(全局)坐标系&&父坐标系:整个场景的固定坐标
//作用:在游戏场景中表示每个游戏对象的位置和方向
//Local Space:物体(局部)坐标系&&自身坐标系:每个物体独立的坐标系,
// 原点为模型轴心 点,随物体移动或旋转而改变
//作用:表示物体间相对位置与方向
//Screen Space:屏幕坐标系:以像素为单位,屏幕左下角为原(0,0)点,右 上角为屏幕宽,
// 高度(Screen.width,Screen.height),Z为 到相机的距离。
//作用:表示物体在屏幕中的位置。
//Viewport Space:视口(摄像机)坐标系:屏幕左下角为原(0,0)点,右上角为 (1,1),Z为到相机的距离。
//作用:表示物体在摄像机中的位置
#endregion
#region 2:坐标系转换
#region 2.1:Local Space --> World Space(自身到世界 )
// transform.forward在世界坐标系中表示物体正前方。
// •transform.right在世界坐标系中表示物体正右方。
// •transform.up在世界坐标系中表示物体正上方。
// •transform.TransformPoint转换点,受变换组件位置、旋转和缩放影响。
// •transform.TransformDirection转换方向,受变换组件旋转影响。
// •transform.TransformVector转换向量,受变换组件旋转和缩放影响。
#endregion
#region 2.2:World Space -->Local Space(世界到自身)
//transform.InverseTransformPoint:转换点,受变换组件位置、旋转和缩放影响。
//transform.InverseTransformDirection:转换方向,受变换组件旋转影响。
//transform.InverseTransformVector:转换向量,受变换组件旋转和缩放影响。
#endregion
#region 2.3:World Space <--> ScreenSpace(世界到屏幕,屏幕到世界)
//Camera.main.WorldToScreenPoint:将点从世界坐标系转换到屏幕坐标系中
//Camera.main.ScreenToWorldPoint:将点从屏幕坐标系转换到世界坐标系中
#endregion
#region 2.4:WorldSpace <--> Viewport Space(世界到摄像机。摄像机到世界)
//Camera.main.WorldToViewportPoint:将点从世界坐标系转换到视口坐标系中
//Camera.main.ViewportToWorldPoint:将点从屏幕坐标系转换到世界坐标系中
#endregion
#endregion
#endregion
}
}
3D数学基础及坐标系统
最新推荐文章于 2022-07-20 16:07:59 发布