说明:
注意几点:
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”
- }
图4、shader中本地坐标系的x、y、z方向
可以看到vertex的x、y、z方向和editor中显示的坐标轴向一致,且更仔细的观察的话,会发现原点位置也一致。因此我们可以得出结论:shader中的本地坐标系,就是在editor中看到的本地坐标系。
2、本地坐标系:左手坐标系
这里需要注意的是,本地坐标系是一个左手坐标系系统。
图5、左手坐标系和右手坐标系
这里不展开讨论左右手坐标系的问题,在后面会再探讨这个东西。
三、世界坐标系
1、世界坐标系的形态
图6、位于原点的正方体
2、从本地坐标系转换到世界坐标系
1)不移动原点的坐标系变换
2)不移动原点的坐标系变换——举例
3)仿射变换——考虑原点的移动
4)在unity中获得这个转换矩阵
5)转换法线
6)获取逆转置矩阵的捷径——mul的秘密
四、观察坐标系
1、观察坐标系的形态
2、左手坐标系和右手坐标系的互相转换——数学运算的独立性
1)线性变换定理与左右手无关
2)矩阵乘法 mul 与左右手无关
3)点积与左右手无关
4)叉乘与左右手规则的关系
3、从世界坐标系变换到观察坐标系
五、投影坐标系
1、投影坐标系的形态
2、正投影
3、透视投影
4、从观察坐标系到投影坐标系——获取变换矩阵
5、值得注意的w分量
六、切线空间
1、切线空间的形态
- X轴——切线 tangent
- Y轴——副切线 biTangent
- Z轴——法线 normal
2、在unity中获得和使用切空间变换矩阵
3、这是个什么样的矩阵?
- 点P在坐标系V下的坐标,相当于其在坐标系U下的坐标,左乘矩阵T,其中T为 坐标系U的三个基(列向量)在坐标系V下的坐标构成的矩阵。
4、转置与逆矩阵
5、左手坐标系?右手坐标系?
说明:
注意几点:
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”
- }
图4、shader中本地坐标系的x、y、z方向
可以看到vertex的x、y、z方向和editor中显示的坐标轴向一致,且更仔细的观察的话,会发现原点位置也一致。因此我们可以得出结论:shader中的本地坐标系,就是在editor中看到的本地坐标系。
2、本地坐标系:左手坐标系
这里需要注意的是,本地坐标系是一个左手坐标系系统。
图5、左手坐标系和右手坐标系
这里不展开讨论左右手坐标系的问题,在后面会再探讨这个东西。
三、世界坐标系
1、世界坐标系的形态
图6、位于原点的正方体
2、从本地坐标系转换到世界坐标系
1)不移动原点的坐标系变换
2)不移动原点的坐标系变换——举例
3)仿射变换——考虑原点的移动
4)在unity中获得这个转换矩阵
5)转换法线
6)获取逆转置矩阵的捷径——mul的秘密
四、观察坐标系
1、观察坐标系的形态
2、左手坐标系和右手坐标系的互相转换——数学运算的独立性
1)线性变换定理与左右手无关
2)矩阵乘法 mul 与左右手无关
3)点积与左右手无关
4)叉乘与左右手规则的关系
3、从世界坐标系变换到观察坐标系
五、投影坐标系
1、投影坐标系的形态
2、正投影
3、透视投影
4、从观察坐标系到投影坐标系——获取变换矩阵
5、值得注意的w分量
六、切线空间
1、切线空间的形态
- X轴——切线 tangent
- Y轴——副切线 biTangent
- Z轴——法线 normal
2、在unity中获得和使用切空间变换矩阵
3、这是个什么样的矩阵?
- 点P在坐标系V下的坐标,相当于其在坐标系U下的坐标,左乘矩阵T,其中T为 坐标系U的三个基(列向量)在坐标系V下的坐标构成的矩阵。