3D数学基础及坐标系统

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
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值