Unity 中的坐标系
说明:
注意几点:
0 行向量右乘矩阵与列向量左乘矩阵,两个矩阵互为逆矩阵
1 法线转换与mul,mul函数左乘矩阵当列矩阵计算,右乘当行矩阵计算
2 叉乘与左右手系,左手系用左手,右手系用右手,axb四指指向a,向b旋转(沿小与两个角度180的方向转),拇指的方向是叉乘方向
3 unity观察系的z方向,unity观察系是右手系,其他都是本地坐标,世界坐标,投影坐标都是左手系,所以观察系轴反向
4 投影系中w与uv伸展方向关系,w=1或-1 uv伸展正向或反向
http://blog.csdn.net/ronintao/article/details/52136673#t29
参考
3、矩阵理论 (这个是京东地址)
4、维基百科(文中的数学概念出处)
5、msdn mul
9、Computing
Tangent Space Basis Vectors for an Arbitrary Mesh
一、基础
坐标系的定义是:对于一个n维系统,能够使每一个点和一组(n个)标量构成一一对应的系统。
我们的出发点是三维欧几里得空间,或三维实内积空间。对于这样的三维空间,最常见的坐标系就是笛卡尔坐标系,指定了三个互相垂直的向量x、y、z,这样每个空间中的点就可以表示成
考虑原点的存在,则对点V有:
这里的x、y、z,就是三维实数空间的一组标准正交基。
原点和基,就唯一的定义了一个坐标系。
如果要展开讨论数学概念实在是太难懂,我们下面直接看unity中的各种坐标系来讨论各种情况。本文中讨论的unity坐标系有以下几个:
- 本地坐标系。local space
- 世界坐标系。world space
- 相机坐标系(观察坐标系)。view space
- 投影坐标系。projection space
- 切线坐标系。tangent space
这几个坐标系将在下面逐个讨论。
二、本地坐标系
1、shader中的本地坐标系,与 Editor中的本地坐标系
在unity中,有一个肉眼可见的本地坐标系,当你选中一个物体时,就会显示出其本地坐标系。
图1、Editor中的本地坐标系
那么问题来了,这个坐标系,是shader中的本地坐标系吗?
产生这样的疑问是自然的,3ds max中建立模型使用的坐标系是右手坐标系,而unity editor中显示的本地坐标系是左手坐标系,显然是不一样的:
图2、3ds Max 中的本地坐标系
我们这里不对3dmax中的轴做任何修改,并在导出时选择z向上(即和在3dmax中看到的一样),则导入到unity中,并将旋转等reset,看到的是这样的:
图3、导入unity后的本地坐标系
注意此时方向已经和在3dsmax中不一样了。
那么在shader中的坐标系到底是哪个坐标系呢?我们使用下面这样的shader来观察以下:
- Shader "Custom/TestCoordShader" {
- SubShader{
- Tags{ "RenderType" = "Opaque" }
- LOD 200
- Pass{
- CGPROGRAM
- #pragma vertex vert
- #pragma fragment frag
- #include "UnityCG.cginc"
- struct v2f {
- float4 pos : SV_POSITION;
- float4 col : COLOR;
- };
- v2f vert(appdata_base v) {
- v2f o;
- o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
- o.col = v.vertex;
- return o;
- }
- float4 frag(v2f i) : COLOR{
- return i.col.x; // i.col.y; //i.col.z;
- }
- ENDCG
- }
- }
- //FallBack "Diffuse"
- }
将 fragment 中的颜色值分别修改为 x y z,就可以得到下面的结果:
图4、shader中本地坐标系的x、y、z方向
可以看到vertex的x、y、z方向和editor中显示的坐标轴向一致,且更仔细的观察的话,会发现原点位置也一致。因此我们可以得出结论:shader中的本地坐标系,就是在editor中看到的本地坐标系。
2、本地坐标系:左手坐标系
这里需要注意的是,本地坐标系是一个左手坐标系系统。
图5、左手坐标系和右手坐标系
这里不展开讨论左右手坐标系的问题,在后面会再探讨这个东西。
三、世界坐标系
1、世界坐标系的形态
图6、位于原点的正方体
2、从本地坐标系转换到世界坐标系
1)不移动原点的坐标系变换
基 到 local 基的过渡矩阵。因此有:
2)不移动原点的坐标系变换——举例
3)仿射变换——考虑原点的移动
4)在unity中获得这个转换矩阵
- gameObject.transform.localToWorldMatrix
在shader中使用如下的矩阵:
- _Object2World
5)转换法线
6)获取逆转置矩阵的捷径——mul的秘密
- float4 worldPos = mul(_Object2World, v.vertex);
- float4 worldNorm = mul(transpose(_World2Object), v.normal);
但在实际使用中,常常见到这样的写法:
- float4 worldPos = mul(_Object2World, v.vertex);
- float4 worldNorm = mul(v.normal, _World2Object);
四、观察坐标系
1、观察坐标系的形态
Map 原理和改进》中可以看到,观察坐标系又与 editor 中看到的 camera 的本地坐标系有本质的区别:它是右手坐标系
2、左手坐标系和右手坐标系的互相转换——数学运算的独立性
1)线性变换定理与左右手无关
2)矩阵乘法 mul 与左右手无关
3)点积与左右手无关
4)叉乘与左右手规则的关系
3、从世界坐标系变换到观察坐标系
- Camera.worldToCameraMatrix
在shader中,这一步的单独的矩阵是:
- UNITY_MATRIX_V
五、投影坐标系
1、投影坐标系的形态
- OpenGL中的坐标系》),首先截取世界中,camera的平截体包含的部分,然后又再次变为一个左手坐标系(对透视投影来说,坐标系的概念可能已经拓展)
2、正投影
3、透视投影
4、从观察坐标系到投影坐标系——获取变换矩阵
- UNITY_MATRIX_P
- GL.GetGPUProjectionMatrix(c.projectionMatrix, false)
5、值得注意的w分量
六、切线空间
1、切线空间的形态
- X轴——切线 tangent
- Y轴——副切线 biTangent
- Z轴——法线 normal
2、在unity中获得和使用切空间变换矩阵
- #define TANGENT_SPACE_ROTATION \
- float3 binormal = cross( normalize(v.normal), normalize(v.tangent.xyz) ) * v.tangent.w; \
- float3x3 rotation = float3x3( v.tangent.xyz, binormal, v.normal )
- TANGENT_SPACE_ROTATION;
- o.viewDirForParallax = mul (rotation, ObjSpaceViewDir(v.vertex));
3、这是个什么样的矩阵?
- 点P在坐标系V下的坐标,相当于其在坐标系U下的坐标,左乘矩阵T,其中T为 坐标系U的三个基(列向量)在坐标系V下的坐标构成的矩阵。
4、转置与逆矩阵
5、左手坐标系?右手坐标系?
Unity 中的坐标系的更多相关文章
- maya和Unity中的坐标系旋转
maya软件是用的右手坐标系,默认旋转顺序是ZYX,即先绕Z轴旋转,再绕Y轴旋转,最后绕X轴旋转. 比如在maya软件中,右侧的旋转顺序是可选的,默认的选择是“XYZ”,其实物体旋转顺序是倒着念,即上 ...
- 解读Unity中的CG编写Shader系列八(镜面反射)
转自http://www.itnose.net/detail/6117378.html 讨论完漫反射之后,接下来肯定就是镜面反射了 在开始镜面反射shader的coding之前,要扩充一下前面提到的知 ...
- 解读Unity中的CG编写Shader系列三
转自http://www.itnose.net/detail/6096068.html 在上一个例子中,我们得到了由mesh组件传递的信息经过数学转换至合适的颜色区间以颜色的形式着色到物体上.这篇文章 ...
- unity中的欧拉角
unity中欧拉角用的是heading - pitch -bank系统(zxy惯性空间旋转系统):当认为旋转顺序是zxy时,是相对于惯性坐标系旋转.当认为旋转顺序是yxz时,是相对于物体坐标系旋转. ...
- 【Unity编程】Unity中的欧拉旋转
欧拉角的定义 在写这篇博客之前,我搜索了网上很多关于欧拉角的定义,发现大部分引用自维基百科的定义,我这里也引述一下: 维基百科定义 莱昂哈德·欧拉用欧拉角来描述刚体在三维欧几里得空间的取向.对于任何参 ...
- 骨骼动画的原理及在Unity中的使用
制作骨骼动画 我们看看这几步操作后,我们得到了那些数据: 1.每个皮肤顶点的初始世界坐标. 2.每个骨骼关节顶点的初始世界坐标. 3.每个顶点被骨骼顶点的影响信息. 4.骨骼如何移动. 骨骼动画原理 ...
- unity中camera摄像头控制详解
目录 1. 缘起 2. 开发 2.1. 建立项目 2.2. 旋转 2.2.1. 四元数 2.3. 移动 2.3.1. 向量操作 2.4. 镜头拉伸 2.5. 复位 2.6. 优化 1 缘起 我们的产品 ...
- 介绍Unity中相机的投影矩阵与剪切图像、投影概念
这篇作为上一篇的补充介绍,主要讲Unity里面的投影矩阵的问题: 上篇的链接写给VR手游开发小白的教程:(三)UnityVR插件CardboardSDKForUnity解析(二) 关于Unity中的C ...
- 游戏的物理和数学:Unity中的弹道和移动目标提前量计算
下载地址:https://www.jianguoyun.com/p/DZPN6ocQ2siRBhihnx8 弹道计算是游戏里常见的问题,其中关于击中移动目标的自动计算提前量的话题,看似简单,其实还是挺 ...
随机推荐
- Numpy数组的保存与读取方法
1. 数组以二进制格式保存 np.save和np.load是读写磁盘数组数据的两个主要函数.默认情况下,数组以未压缩的原始二进制格式保存在扩展名为npy的文件中,以数组a为例 np.save(&quo ...
- 设置ubuntu默认输入python进入python3
执行下面两条命令 sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 100 sudo update- ...
- iOS MVVM+RAC 从基础到demo
一.关于经典模式MVC的简介 MVC是构建iOS App的标准模式,是苹果推荐的一个用来组织代码的权威范式,市面上大部分App都是这样构建的,具体组建模式不细说,iOS入门者都比较了解(虽然不一定能完 ...
- Java一致性的实现
一致性 内存模型 每一个线程有一个工作内存和主存独立 工作内存存放主存中变量的值的拷贝 Happen Before 1.程序次序规则:在一个单独的线程中,按照程序代码的执行流顺序,(时 ...
- 在win7下使用git和gitlab进行code review
1.安装 Git-2.6.3-64-bit.exe 下载地址:http://pan.baidu.com/s/1hqGvwnq 2.根据收到的邮件进入gitlab网站,并修改密码登陆 3.新建一个文件 ...
- iOS 开发实践之 Auto Layout
原:http://xuexuefeng.com/autolayout/?utm_source=tuicool 本文是博主 iOS 开发实践系列中的一篇,主要讲述 iOS 中 Auto Layout(自 ...
- POJ 1330 Nearest Common Ancestors 【最近公共祖先LCA算法+Tarjan离线算法】
Nearest Common Ancestors Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 20715 Accept ...
- .net 常用的插件列表
1,.net 分布式Session 解决方案RedisSessionStateProvider 2,c# 表达式树查看工具 Expression Tree Visualizer 3,sqlbuilde ...
- python操作cad
from pyautocad import Autocad # 自動連接上cad,只要cad是開着的,就創建了一個<pyautocad.api.Autocad> 對象.這個對象連接最近打開 ...
- BZOJ 1202 [HNOI2005]狡猾的商人:并查集(维护距离)
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1202 题意: 有一个账本,记录了n个月的盈亏. 每个月的数值:正为盈,负为亏. 你知道m个 ...