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数学基础及坐标系统相关推荐

  1. 《3D数学基础》1.8 混合积

    理解数学,理解代码! 大家好,我是老G! 今天为大家带来<3D数学基础>系列视频. 主要讲解:游戏开发中用到的3D数学知识,包括:定义,定理,推论. 也包括他们的推导过程,以及应用举例. ...

  2. 《3D数学基础》系列视频 1.5 向量的夹角

    理解数学,理解代码! 大家好,我是老G! 今天为大家带来<3D数学基础>系列视频. 主要讲解:游戏开发中用到的3D数学知识,包括:定义,定理,推论. 也包括他们的推导过程,以及应用举例. ...

  3. 《3D数学基础系列视频》1.1向量基本概念

    今天带来的是系列最新视频,关于向量的内容 本次视频,主要讲解一下向量的基本概念. 国内网盘: http://pan.baidu.com/s/1c0ldm5U 苹果iTunes U注册代码: 1班:EF ...

  4. 3d数学基础学习总结

    3d数学基础目录 第1章 简介 1.1 什么是3D数学 1.2 为什么选择本书 1.3 阅读本书需要的基础知识 1.4 概览 第2章 笛卡尔坐标系统 2.1 1D数学 2.2 2D笛卡尔数学 2.3 ...

  5. 《3D数学基础》实践1 向量类代码分析

    理解数学,理解代码! 大家好,我是老G! 今天为大家带来<3D数学基础>系列视频. 主要讲解:游戏开发中用到的3D数学知识,包括:定义,定理,推论. 也包括他们的推导过程,以及应用举例. ...

  6. 3D Math Primer for Graphics and Game Development -- 图形与游戏开发(3D数学基础) (简介)...

    3D Math Primer for Graphics and Game Development //z 2014-04-28 13:18:20 L.247'38500 BG57IV3@XCL T20 ...

  7. 3d数学基础:图形和游戏开发(第2版)_游戏引擎编程需要哪些基本数学知识?

    现今,想要从头写一个功能强大的3D引擎,个人的力量恐怕难以胜任,即使能力足够,时间恐怕也不允许.在这个美好的开源时代,你只需具备修改各种引擎的能力便足以满足开发游戏的各项需求.现代游戏引擎的复杂级别已 ...

  8. 3D数学基础——Rotator类的C++实现

    Rotator类的C++实现 FRotator类用来以欧拉角形式保存方位,使用pitch-yaw-roll进行约定,类的定义如下: #pragma once #include "FVecto ...

  9. 3D数学基础——矩阵、欧拉角和四元数的相互转换与比较

    矩阵.欧拉角和四元数的相互转换与比较 相互转换 这里只展示最终的转换结果,推导过程请参考<3D数学基础:图形与游戏开发> 欧拉角转换到矩阵 欧拉角描述了一个旋转序列,分别计算出给每个旋转的 ...

最新文章

  1. npm install 提示权限不足 Error: EPERM: operation not permitted, unlink XXX
  2. 18 款顶级代码生成器平台!
  3. python读取excel-Python Pandas读取修改excel操作攻略
  4. 转载:frameset 使用心得
  5. 安装orb_slam 的坑解决方法
  6. 文曲星猜数游戏的非TDD实现
  7. 【电路原理】学习笔记(0):电路与电路模型
  8. wamp无法访问php,wamp无法访问phpmyadmin怎么办
  9. Python Flask教程
  10. Mac 10.12使用free命令(fish)
  11. 图解物联网---物联网基础知识
  12. ARPR软件破解带密码rar格式文件
  13. C# DevExpress控件安装使用教程
  14. 升级后如何从Windows.old文件夹还原文件
  15. jde多目标_CVPR 2020 多目标跟踪算法JDE 训练
  16. java身份认证_WEB应用中的基本身份验证和表单身份验证(中文)
  17. 微信小程序开发案例2---省市区信息选择
  18. 舅妈的计算机课第2部,名著课 | 题:《简·爱》(二)
  19. Internet Download Manager v6.41Build 2简体中文版
  20. Python Matplotlib绘制柱状图(bar和barh函数)详解

热门文章

  1. 惠众和环宇计算机专业,计算机一级Office
  2. 拼多多活动主图尺寸多少?企立方来告诉你!
  3. 罗升阳对安卓2.3系统的总结
  4. matlab读取excel数据
  5. PHP汉字转拼音的两种方法+PHP提取汉字(中文)方法
  6. 【dva】dva使用与实现(三)
  7. PDF删除水印怎么在PDF编辑软件内执行
  8. 下载 JDK LTS 版本安装
  9. Linux密码破解(非远程爆破)
  10. html表格去除间距,table 去掉 td之间间距