Unity3D 数学知识 (向量,坐标系转换,欧拉角,四元数)
向量:
Unity中Vector3 既能表示坐标点又能表示向量。
向量的概念:有大小有方向的箭头叫向量,没有位置。
坐标点的相减得到一个向量,由减数指向被减数的。
A到B的方向=B(被减数)-A(减数)
B到A的方向=A(被减数)-B(减数)
零向量:(0,0,0) //没有方向
负向量:让原向量乘以-1得到了相当于原向量来说的负向量
单位向量:长度为1的向量叫单位向量(1,1,1) //各个分量分别除以magnitude模长就等于单位向量
计算公式: Vector v1= new Vector(2,2,3);
v1= new Vector(v1.x/v1.magnitude,v1.y/v1.magnitude,v1.z/v1.magnitude); //单位化向量之后
Unity API: Vector.normalized
向量的模(向量的长度):
计算公式:向量的长度=sqr(x^2+y^2+z^2) //各向量的平方相加,再开方。
Unity API: Vector.magnitude
向量相加:
计算公式:a向量+b向量=c向量 a(x,y,z)+b(x,y,z)=c(ax+bx,ay+by,az+bz) //各分量分别相加
几何意义:两个向量相加得到新的向量
向量相减:
计算公式:a向量-b向量=c向量 a(x,y,z)-b(x,y,z)=c(ax-bx,ay-by,az-bz) //各分量分别相减
几何意义:两个向量相减得到新的向量。a向量-b向量,得到一个新的向量,从b向量的终点指向a向量的终点。
向量的乘法:
点乘:
计算公式:a(ax,ay,az) b(bx,by,bz)
a点乘b=ax乘bx+ay乘by+az乘bz =|a||b|cos<a,b>(a的模乘b的模,再乘以两个向量夹角的余弦值cosΘ)
Unity API:Vector.Dot(a,b); //a b向量点乘
几何意义:a向量在b向量方向上投影的长度。
变种1:如果b向量为单位向量,意义为a向量在b向量方向上投影的长度
变种2:如果a向量和b向量都为单位向量,意义为a向量和b向量夹角的余弦值。
叉乘:
计算公式:a(x1,y1,z1) 叉乘 b(x2,y2,z2)=(y1*z2-z1*y2, z1*x2-x1*z2, x1*y2-y1*x2 ) //交叉相乘再相减
Unity API:Vector.Cross(A,B); //a b向量叉乘
几何意义:两个向量叉乘,得到的结果也是一个向量,结果的向量同事垂直于a b向量,也就是说垂直于 a b向量所在的平面。
图示: a向量为红线,b蓝线,黄线是a叉乘b之后得到的向量
a向量为红线,b蓝线,黄线是b叉乘 a之后得到的向量
坐标系转换:
世界坐标转换为屏幕坐标
Unity API:Camera.main.WorldToScreenPoint(Vector3 position);
如图所示:
世界坐标转换为屏幕坐标,z轴为10,而不是0。屏幕坐标只有x,y轴,而没有z轴。
这里面的z轴就是相机与需要转换的坐标点,也就是WorldToScreenPoint(Vector3 position),这个API中的括号内的Vector3 position参数的景深,深度,不是距离。
把Cube当做坐标点,转换成屏幕坐标
Cube位置偏移之后,z轴还是10,如果是距离,这个时候应该比10大。
相对坐标
相对于某一个物体的局部坐标(某个物体的子节点)
Unity API :Vector3.InverseTransformPoint(transform.position);
从世界空间到局部空间的位置转换
如图所示:
Cube 相对于Sphere的局部坐标
Sphere.InverseTransformPoint(Cube.position);
Cube挂载到Sphere的子节点,位置对比
游戏物体的旋转在3D引擎中,有三种方式:1、欧拉角 2、四元数 3、矩阵
欧拉角:
Unity API:Transform.eulerAngles=new Vector3(0,45,0); //绕着y轴旋转45度
欧拉角,x轴旋转正负90度就会发生万向节死锁
x轴旋转90之后,旋转y轴,实际上旋转的是z轴。
四元数:
概念:用四维空间表示三维中的旋转,它有四个分量x,y,z,w
w+ax+by+cz
x^2=y^2=z^2=-1
超复数:一个实部w,三个虚部x,y,z
复数:由实部和虚部组成的数 3(实数)+4i(虚数)
实数 :有理数和无理数的集合
有理数:有限小数,无限循环小数,和整数,都叫做有理数(有道理的数)
无理数: e π
i^2=-1 //任何数的平方都不等于-1,这是i就叫做 虚数单位
虚数的例子:5i(前提是i^2=-1),那么5i就是虚数
虚数部分为0,复数就变成了实数
四元数存储的是轴角对(一个轴,一个角,绕着某个轴旋转多少度角)
计算公式:
n(nx,ny,nz) //绕着哪个轴 thetaΘ
x=nx*Sin(theta/2);
y=ny*Sin(theta/2);
z=nz*Sin(theta/2);
w=Cos(theta/2);
绕着y轴(0,1,0)旋转90度
//===用公式计算=====
//Unity API , Mathf.Sin(float f),Mathf.Cos(float f)传的是一个弧度,Mathf.Deg2Rad把角度转换成弧度
Quaternion q = new Quaternion(0, Mathf.Sin(45 * Mathf.Deg2Rad), 0, Mathf.Cos(45 * Mathf.Deg2Rad)); //90 / 2(theta / 2) == 45;
transform.rotation = q; //打印出来的q值(0,0.7,0,0.7)
//===欧拉角转换成四元数===
Quaternion q = Quaternion.Euler(0, 90,0); //打印出来的q值(0,0.7,0,0.7)
//===AngleAxis===
Quaternion q = Quaternion.AngleAxis(45, Vector3.up); //绕着y轴旋转45度
transform.rotation = q* q; //四元数相乘,得到旋转量的叠加(90度)
四元数的乘法:代表旋转量的叠加
四元数的模: l=sqrt(x^2+y^2+z^2+w^2); //各分量的平方相加再开方
单位四元数:(0,0,0,1)代表无旋转
共轭四元数:代表和原四元数方向相反的旋转
四元数的转置:原四元数的共轭四元数/四元数的模(在标准四元数中,四元数的转置==四元数的共轭)
标准四元数:模长为1的四元数就叫标准四元数(表示旋转的四元数一定是标准四元数)
单位四元数一定是标准四元数,标准四元数不一定是单位四元数
四元数和欧拉角的对比:
四元数:
优点: 1、没有方向锁
2、可以绕着任意轴转
缺点:1、同一时间只能绕着一根轴转
2、难理解
3、多个分量,多占内存
欧拉角:
优点:1、容易理解
2、省内存
3、可以三根轴一起旋转
缺点:1、有万向锁
数据来源:ABOUTCG网站https://www.aboutcg.org/courseDetails/494/introduce
Unity3D 数学知识 (向量,坐标系转换,欧拉角,四元数)相关推荐
- Shader入门数学知识-向量基础
首先明确以下名词: 向量:在数学中,向量(也称为欧几里得向量.几何向量.矢量),指具有大小(magnitude)和方向的量.它可以形象化地表示为带箭头的线段.箭头代表向量的方向:线段长度,代表向量的大 ...
- 无人机运动学控制中的坐标系,及惯性坐标系与机体坐标系之间的矩阵转换 欧拉角
一.无人机控制中的坐标系 无人机运动学中,有三种需要了解的坐标系 1.1.地球中心坐标系(ECEF) 地球中心坐标系,即坐标系原点位于地心.X轴通过格林尼治线和赤道线的交点,正方向为原点指向交点方向. ...
- 游戏开发的数学知识(一)三维向量绕某一向量旋转
最近在b站看到的某up主搬运了youtube大佬的游戏开发数学知识所以这里总结一下每一节讲的游戏开发中的数学问题 原视频链接 https://www.bilibili.com/video/BV1Yt4 ...
- 两向量叉乘的计算公式_高中数学知识背景下对向量叉乘运算的探讨(向东来)
c b a θ 高中数学知识背景下对向量叉乘运算的探 讨 在高中数学的学习中,同学们接触到向量的概念,并了解其性质.线性运算.坐标表 示.数量积以及在实际问题中的应用.在此基础上,可进一步深化,引入向 ...
- 如何将一个向量投影到一个平面上_如何在黎曼流形上避开鞍点?本文带你了解优化背后的数学知识...
机器之心原创 作者:Joshua Chou 编辑:Joni Zhong翻译:魔王 在一篇名为<Escaping from saddle points on Riemannian manifold ...
- unity3d 数学的数学基础和辅助类
转载注明smartdot:http://my.oschina.net/u/243648/blog/67193 1. 数学(点乘/叉乘)/unity3d的数学辅助类 2. 坐标系统(本地/世界/屏幕 ...
- 3d数学基础:图形和游戏开发(第2版)_游戏引擎编程需要哪些基本数学知识?
现今,想要从头写一个功能强大的3D引擎,个人的力量恐怕难以胜任,即使能力足够,时间恐怕也不允许.在这个美好的开源时代,你只需具备修改各种引擎的能力便足以满足开发游戏的各项需求.现代游戏引擎的复杂级别已 ...
- 游戏引擎编程需要哪些基本数学知识?
现今,想要从头写一个功能强大的3D引擎,个人的力量恐怕难以胜任,即使能力足够,时间恐怕也不允许.在这个美好的开源时代,你只需具备修改各种引擎的能力便足以满足开发游戏的各项需求.现代游戏引擎的复杂级别已 ...
- ROS中的坐标与坐标系转换
ROS中的TF 官网建议新工作直接使用tf2,因为它有一个更清洁的界面,和更好的使用体验.(自ROS Hydro以来,tf第一代已被"弃用",转而支持tf2) TF介绍 TF(Tr ...
最新文章
- 【周末阅读】工业互联网的发展历程及实现路径
- 简单汇编----输入密码判断正否
- {转}maven+continuum安装与配置
- vs2005 vc++ 生成非托管的 不需要.net运行环境的exe程序方法
- 【Web应用-FTP】FTP 容量显示说明
- PHP 正则表达式(PCRE)
- uniapp对象怎么获取值_原理 | 怎么获取PMSM电机转子位置Offset值
- 动态(静态)加载DLL注意
- 数据之路 - Python爬虫 - Requests库
- 【目标跟踪】基于matlab红外图像弱小目标检测与跟踪【含Matlab源码 374期】
- Ubuntu下PHP开发环境LAMP搭建
- 5-5 多边形周长计算(继承)
- Windows常用运行库--VC++、DirectX、.NET
- AutoCAD-线型
- exe打包工具,封装exe安装程序--Inno Setup
- JavaScript 页面跳转、页面重定向
- 抄书——最优化的理论与方法(5)——数学基础(凸集和凸函数)
- 什么叫嵌入式开发 嵌入式开发的要求
- 八皇后问题----Java实现
- Python爬虫,爬取2020年软科中国大学排名并进行数据清洗与可视化输出
热门文章
- 过山车java,杭电 acm 2063 ( 过山车 )
- [DirectX12学习笔记] 光照
- 还记得面试时被算法支配的恐惧吗?
- 【python中break、continue 、pass终止循环的区别】
- BSP学习Day11 C语言基础 宏定义和宏函数 函数调用 类型转换 数组
- JavaScript:onscroll函数
- 产品经理视角+意志力+大创视角:外卖第二次被偷后我发现了隐藏的“新大陆”
- vue 中生成带logo的二维码vue-qr(可换背景) 利用qrcode生成二维码
- 打印时显示预服务器,Win7打印时提示Active Directory域服务当前不可用怎么办
- 星环科技TDH多模型统一架构VS CDH架构