响应式网站建设准备,湖南大型网站建设公司排名,网站建设课件,如何做网页游戏文章目录 一、变换矩阵1.1 齐次坐标1.2 平移矩阵1.3 旋转矩阵1.4 缩放矩阵1.5 复合变换 二、世界空间变换三、观察空间变换四、裁剪空间变换4.1 视椎体4.2 齐次裁剪空间4.3 视椎体投影方式 五、屏幕空间变换 在 Shader 开发中存在不同的坐标空间#xff0c;包括#xff1a… 文章目录 一、变换矩阵1.1 齐次坐标1.2 平移矩阵1.3 旋转矩阵1.4 缩放矩阵1.5 复合变换 二、世界空间变换三、观察空间变换四、裁剪空间变换4.1 视椎体4.2 齐次裁剪空间4.3 视椎体投影方式 五、屏幕空间变换 在 Shader 开发中存在不同的坐标空间包括 模型空间。世界空间。观察空间。裁剪空间。屏幕空间。
在渲染管线中需要将坐标数据在这些空间中进行变换计算。
在设计模型时使用模型空间。模型导入 Unity 后最终显示在屏幕上依次经历了如下空间的坐标变换
模型空间 - 世界空间 - 观察空间 - 裁剪空间 - 屏幕空间。
一、变换矩阵
1.1 齐次坐标
齐次坐标是一种在计算机图形学中常用的表示坐标的方式通过引入一个额外的维度来扩展传统的笛卡尔坐标系将 n n n 维的向量或矩阵用 n 1 n 1 n1 维来表示以便进行几何变换和矩阵运算。
1举例
三维空间中有一个向量或点 ( x , y , z ) (x , y , z) (x,y,z)对应的齐次坐标为 ( x , y , z , w ) (x , y , z , w) (x,y,z,w)其中 w w w 值的改变可以让它有具有不同的含义。
2原因 通过齐次坐标可以明确的区分向量和点。 w 1 w 1 w1 时代表一个点。 w 0 w 0 w0 时代表一个向量。 3 × 3 3\times 3 3×3 矩阵不能直接表示平移变换只能表示线性变换。 即只能描述对象的旋转、缩放等线性变换而不能描述对象的平移。
平移涉及到改变对象在空间中的位置包括移动对象的原点。因此需要引入一个额外的维度
来表示平移操作用齐次坐标来将 3 × 3 3\times 3 3×3 矩阵加一个维度变为 4 × 4 4\times 4 4×4 的矩阵 3 × 3 3\times 3 3×3 矩阵一般称为线性矩阵主要处理线性变换主要进行旋转、缩放等线性变换。 4 × 4 4\times 4 4×4 矩阵一般称为仿射矩阵主要处理仿射变换线性变换 平移变换。
4 × 4 4\times 4 4×4 矩阵的基本构成规则为 M 3 × 3 M^{3\times3} M3×3 部分用于表示旋转和缩放变换。 t 3 × 1 t^{3\times1} t3×1 部分用于表示平移。 0 1 × 3 0^{1\times3} 01×3 部分始终为零矩阵。右下角元素始终为 1。
1.2 平移矩阵 平移矩阵的构成规则为 M 3 × 3 M^{3\times3} M3×3 部分为 3 × 3 3\times 3 3×3 单位矩阵。 t 3 × 1 t^{3\times1} t3×1 部分用于表示 x , y , z x,y,z x,y,z 平移多少单位。
1与点的计算 点的 x , y , z x,y,z x,y,z 分量分别增加了一个位置偏移。即点 ( x , y , z ) (x,y,z) (x,y,z) 在 3D 空间中平移了 ( t x , t y , t z ) (tx,ty,tz) (tx,ty,tz) 个单位。
2与向量的计算 向量的平移结果不会有任何变化原因是向量没有位置属性。
对向量进行平移变换不会改变向量。
1.3 旋转矩阵
旋转操作需要指定一个旋转轴不一定是空间中的坐标轴。 旋转矩阵主要由基础变换矩阵的构成规则当中的 3 × 3 3\times 3 3×3 矩阵决定因此平移部分的 3 × 1 3\times 1 3×1 矩阵都为 0并不影响计算。点 w 1 w1 w1和向量 w 0 w0 w0与旋转矩阵进行计算都会发生改变。几何意义是点或 向量围绕某一个轴进行旋转得到一个新的点和向量。旋转矩阵是正交矩阵可以利用旋转矩阵的逆矩阵来还原旋转。
1.4 缩放矩阵
缩放矩阵的构成为以下矩阵结构 k x 、 k y 、 k z kx、ky、kz kx、ky、kz 分别代表 x 、 y 、 z x、y、z x、y、z 轴的缩放因子 注意 k x k y k z kx ky kz kxkykz 时称为统一缩放否则称为非统一缩放。
点 w 1 w1 w1和向量 w 0 w0 w0与缩放矩阵进行计算都会发生改变。几何意义是 对点的缩放一般是构成模型的顶点相当于缩放模型大小。对向量的缩放统一缩放时只会改变向量的大小模长不会改变向量的方向非统一缩放时不仅会改变大小可能还会改变向量的方向。
1.5 复合变换 在进行平移、旋转、缩放的复合运算时 绝大多数情况下我们约定的变换顺序为先缩放、再旋转、后平移。 P n e w M 平移 M 旋转 M 缩放 P o l d P_{new}M_{平移}M_{旋转}M_{缩放}P_{old} PnewM平移M旋转M缩放Pold 在进行 x x x 轴、 y y y 轴、 z z z 轴旋转的复合运算时 绝大多数情况下我们约定的变换顺序为 z → x → y z\rightarrow x\rightarrow y z→x→y。
二、世界空间变换
模型空间Model Space也被成为对象空间Object Space或局部空间Local Space一般指 3D 模型的局部坐标系每个模型都有自己独立的坐标空间模型空间的主要意义是便于建模模型的顶点等数据都是基于模型空间表达的。
注意
在 Unity 中当模型移动或旋转时模型空间坐标系也会随着变换因为模型坐标空间是世界坐标空间的子空间。
世界空间变换指的主要是将模型空间中的点或向量通过矩阵乘法计算变换为相对于世界坐标空间下数据。
假设机器人模型的手掌红点位置处于模型坐标空间下的:0.63, 0.84, -0.04点。当模型在 Unity 中没有任何父对象那么该模型空间的坐标系相对于世界坐标空间下。 将模型进行 2 倍缩放进行0, 45, 0的旋转然后再进行5, 0, 5的平移模型坐标空间下的红点0.63, 0.84, -0.04相对世界空间坐标是多少呢 相对世界坐标系的位置 / 向量 平移矩阵 × 旋转矩阵 × 缩放矩阵 × 模型空间下的点 / 向量 相对世界坐标系的位置/向量 平移矩阵 \times 旋转矩阵 \times 缩放矩阵 \times 模型空间下的点/向量 相对世界坐标系的位置/向量平移矩阵×旋转矩阵×缩放矩阵×模型空间下的点/向量
三、观察空间变换
观察空间View Space也被成为摄像机空间Camera Space。观察空间是一个特殊的模型即摄像机空间摄像机可认为是特殊的模型不可见但决定屏幕上显示的内容。观察空间的主要意义是决定渲染的视角和视野。 在模型空间中我们讲过模型空间的 x 、 y 、 z x、y、z x、y、z 轴对应模型的右、上、前三个方向因为 Unity 中的模型空间遵循左手坐标系原则。
但在 Unity 的观察空间中观察空间遵循右手坐标系原则因此观察空间中的 x 、 y 、 z x、y、z x、y、z 轴的正方向分别对应摄像机的 右、上、后方。 观察空间变换指将模型空间中的点或向量从世界空间中变换到观察空间中是顶点变换的第二步将数据从世界空间 - 观察空间进行变换。观察空间变换也可以称为观察变换View Transform。
方法一坐标空间变换。方法二变换观察空间使观察空间和世界坐标空间重合。
四、裁剪空间变换
4.1 视椎体
摄像机的视锥体是在三维空间中表示摄像机可见区域的虚拟体积类似一个六面体的形状根据摄像机的属性和投影方式而定。
视锥体定义了摄像机在场景中能够看到的物体区域超出这个区域的物体将在渲染时被裁减掉从而提高渲染性能。 视锥体主要包含 2 部分
远近裁剪平面。左、右、上、下裁剪平面。
透视投影中视锥体类似一个金字塔形状远裁剪面比近裁剪面大所以产生透视效果。
正交投影中视锥体类似于长方体的形状远近裁剪平面大小一致不会产生透视效果。 由于裁剪需要判断顶点是否在视椎体范围内相对较麻烦因此需要将观察空间摄像机空间中的数据转换到齐次裁剪空间中。
4.2 齐次裁剪空间
齐次裁剪空间裁剪空间是一个三维空间在计算机图形学中用于在图形渲染过程中进行裁剪和投影。
它的坐标范围为-1,-1,-1到1,1,1超出这个范围的坐标在渲染时会被裁减掉只会保留范围内的坐标。
齐次裁剪空间通过将摄像机的视锥体投影到一个规范化的立方体而转换来这个立方体就是齐次裁剪空间。 4.3 视椎体投影方式
1透视投影
视锥体内顶点和原点连接在近裁剪面的交点为投影点。 将视锥体中心位移到观察空间原点中心。 将长方体视锥体的 xyz 坐标范围映射到 (-1,1) 长宽高为 2 的正方体中。
2正交投影
视锥体内顶点向近裁剪面做左右裁剪面平行线在近裁剪面交点为投影点。 将透视视锥体变成一个长方体。将视锥体中心位移到观察空间原点中心。将长方体视锥体的 xyz 坐标范围映射到 (-1,1) 长宽高为 2 的正方体中。
五、屏幕空间变换
屏幕空间Screen Space指渲染结果在屏幕上显示的坐标空间三维坐标经过一系列转换后会转换到最终的二维屏幕坐标空间中使得图像可以在屏幕上进行展示。
屏幕空间的主要意义是屏幕空间中对应的位置信息是真正的像素位置而不是虚拟的三维坐标。有了相对屏幕空间的坐标位置才能准确的控制屏幕上像素点的显示效果。
在 Unity 中屏幕空间左下角为像素坐标0,0点屏幕空间右上角为像素坐标分辨率宽分辨率高。
屏幕空间变换主要指将三维坐标 (x, y, z) 中的 x, y 分量映射到屏幕上而 z 分量一般会被用于深度缓冲之后用于深度测试等决定是否被遮挡等。