Unity-坐标空间

渲染游戏的过程可以理解为是把一个个顶点经过层层处理最终转化到屏幕上的过程
就像顶点着色器最基本的功能就是把模型的顶点坐标从模型空间转换到齐次剪裁坐标空间中

Unity中有很多种坐标空间大概包括:
模型空间 世界空间 观察空间 剪裁空间 屏幕空间
还有一些其他空间例如:切线空间

如果我们要了解各个空间的意义与变换情况就需要先了解坐标空间的变换

坐标空间的变换

我们要做的就是怎么把一个点或矢量从一个坐标空间转换到另一个坐标空间中
想要定义一个空间 必须指明其原点位置和坐标轴方向
其实每一个坐标空间都有一个父坐标空间这些都是相对的,对坐标空间的变换就是父子空间对点和矢量进行变换
假如现在有父坐标空间P 和子坐标空间C ,我们要做的就是把矢量或点(A B)对他们进行转换
Ap=Mc->pAc
Bc=Mp->cBp
其中Mc->p表示的是从子坐标空间变换到父坐标空间中的变换矩阵,而Mp->c是他的逆矩阵
下面我们就来求Mc->p
当给定坐标空间中的原点和某一点(a,b,c)时我们可以通过四个步骤确定他的位置

  1. 从坐标空间的原点开始
  2. 向x轴方向移动a个单位
  3. 向y轴方向移动b个单位
  4. 向z轴方向移动c个单位

所以根据这四个步骤 如果我们已经知道了子坐标空间C的3个坐标轴在父坐标空间P下的表示 xc,yc,zc 以及原点位置Oc
当给定坐标空间的一点Ac=(a,b,c)我们即可以求得他在父坐标空间下的位置Ap;
Ap=axc+byc+czc
我们可以通过变换得到一个矩阵
。。
还可以继续变换得到
在这里插入图片描述
所以矩阵可以表示成
在这里插入图片描述

当我们进行是矢量的变换的时候 由于矢量是没有位置的所以坐标空间的原点变换就可以忽略
那么对适量的坐标空间变换就可以使用3x3的矩阵表示
在这里插入图片描述
这就是为什么在Shader中会常常看到截取变换矩阵的前3行前3列队法线方向,光照方向进行空间变换

坐标空间

模型空间

模型空间又叫对象空间或者局部空间,每一个模型都有自己独立的坐标空间 有一些方向的概念“前 后 左 右 上 下” Unity中在模型空间中使用的是左手坐标系 因此在模型空间中 +x,+y,+z轴分别对应的模型的右 上 前 ,模型空间的原点坐标通常由美术人员在建模时确定好的,我们可以在顶点着色器中访问到模型的顶点信息,其实模型空间就是相对自己的某个点为原点。

世界空间

世界空间其实就是我们在Unity中使Scene视图中看到的空间,通常世界空间的原点位置会放置在游戏空间的中心,Unity中世界空间使用的是左手坐标系 ,Unity中一个没有父物体的物体的Transform组件上显示的位置其实就是世界空间的位置。
顶点变换的第一步,就是讲顶点坐标从模型空间变换到世界空间中,这个变换叫做模型变换
例如一个模型上的顶点的模型坐标为(0,2,4,1) 这个模型在Unity中进行了(2,2,2)的缩放,(0,150,0)的旋转,(5,0,25)的平移 ,这里的变换顺序不能改变,可以理解为我们约定的变换顺序就是先缩放,在旋转,最后平移,不同顺序得到的结果也是不一样的,
所以先构造变换矩阵:
在这里插入图片描述
之后变换的结果为
在这里插入图片描述

观察空间

观察空间也被称为摄像机空间,观察空间可以认为是模型空间的一个特例,观察空间的原点就是摄像机的位置Unity中观察空间的坐标轴选择是:+x指向右方,+y指向上方,+z指向摄像机后方,因为Unity中观察空间使用的右手坐标系 符合OpenGL的传统,观察空间是一个三维空间。
顶点变换的第二步,就是将顶点坐标从世界空间变换到观察空间中,通常叫做观察变换
为了得到顶点在观察空间的位置,大概有两种方法 一种是计算观察空间三个坐标轴在世界空间中的表示然后求出变换矩阵 在求逆矩阵 ,第二个方法是 想想平移整个观察空间 让摄像机处于世界坐标的原地位置坐标轴与世界坐标的坐标轴重合,使用第二种方法:观察摄像机的Transform组件知道摄像机先按(30,0,0)进行旋转,然后按(0,10,-10)进行平移
在这里插入图片描述
所以我们要逆向变换 先按(0,-10,10)进行平移再按(-30,0,0)进行旋转 所以变换矩阵为
在这里插入图片描述
由于观察空间使用的右手坐标系,因此对z分量进行取反操作
在这里插入图片描述
所以我们对(9,4,18.072,1)进行了顶点变换为(9,8.84,-27.31,1)
在这里插入图片描述

剪裁空间

也被称为齐次剪裁空间,用于变换的矩阵也被叫做剪裁矩阵,也被称为投影矩阵
有一块空间,完全处于这块空间的内部的图元将会被保留,完全处于这块空间外的图元将会被剔除,处于相交的图元会被剪裁 这块空间就是由视锥体决定的
视锥体由六个面组成 有两种投影类型 一种是正交投影另一种是透视投影
正交投影区域就是一个长方体 如果地面上有网格看到的网格的大小是完全一样的
透视投影区域类似一个 棱台 地面上里摄像机越近网格越大 越远网格越小 通常使用在3D模式中
正交投影的矩阵和透视投影矩阵请看书P80

屏幕空间

就是屏幕的二维空间 完成剪裁后我们需要把视锥体投影到屏幕空间中,经过这一步变化那会得到真正的像素位置 而不是虚拟的三维坐标 使用的左手坐标系
首先要进行的是标准齐次除法 实际就是用齐次坐标系w分量去除xyz分量,OpenGL中把这一步的坐标叫做归一化的设备坐标
Unity中,屏幕空间左下角的像素坐标是(0,0)右上角像素坐标是(piexlWidth,piexHeight)
映射的过程就是缩放的过程 公式为
在这里插入图片描述

总结

在这里插入图片描述
在这里插入图片描述

这个是对Unity Shader入门精要第四章坐标空间的一个总结 图片都是书中的

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值