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 弹道计算是游戏里常见的问题,其中关于击中移动目标的自动计算提前量的话题,看似简单,其实还是挺 ...
随机推荐
- .net编程扫盲(*)
http://www.cnblogs.com/edisonchou/p/4787775.html
- MySQL——事务
核心知识: 1.什么是事务?一组原子性的SQL查询语句 2.事务的四种属性:ACID 3.四种隔离级别:读取未提交内容.读取提交内容.重复读.串行化. 4.什么是幻读?幻读有那些解决办法?连续读取同一 ...
- linux下更改文件夹名
mv 旧文件夹名 新文件夹名 mv /usr/bin/python_old /usr/bin/python_new
- okhttp 特点 module版本冲突 集成module到项目
特点适合大小文件上传.下载,但对图片不会执行缓存是一个缺点 集成module到项目 右上角添加 lib和module版本冲突问题,删除lib下的即可
- 《程序员代码面试指南》第八章 数组和矩阵问题 在数组中找到出现次数大于N/K 的数
题目 在数组中找到出现次数大于N/K 的数 java代码 package com.lizhouwei.chapter8; import java.util.ArrayList; import java ...
- Android Studio 代码混淆(你真的会混淆吗)
一.前言 今天要打包新产品,突然忘了混淆的参数是怎么写的了,虽然之前也混淆过,可是具体配置的参数代码有些记不起来了,因此决定花点时间写篇博客记录一下,方便以后查找和自己的记忆. 二.Android S ...
- BZOJ 3016 [Usaco2012 Nov]Clumsy Cows:贪心
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3016 题意: 给你一个括号序列,问你至少修改多少个括号,才能使这个括号序列合法. 题解: ...
- javascript(9)
var a=[890,10]; window.alert(a.valueOf()); window.alert(a); //个人觉得,输出a.valueOf()和a没有什么区别 //使用valueOf ...
- 插件_热部署_JRebel
一.License Server 1.运行反向代理 GitHub地址:https://github.com/ilanyu/ReverseProxy 下载地址:ReverseProxy_windows_ ...
- L94
Early-morning births are genetically programmed THE notion that nothing good happens after midnight ...
