Unity3D - Shader - 矩阵和变换
2017-12-15 18:12
393 查看
矩阵
一个m×n的矩阵是一个由m行n列元素排列成的矩形阵列。关于矩阵的更详细信息与计算在这里。变换
基本概念
变换(transform)是把一些数据(点、矢量、颜色)通过某种方式进行转换的过程。线性变换(Linear transform),是指可以保留矢量加和标量乘的变换。其数学公式是:
f(x)+f(y)=f(x+y)kf(x)=f(kx)
缩放(scale) 以及旋转(rotation)都是最普通的线性变换。
线性变换都包括:旋转、缩放、错切(Shear)、镜像(Mirroring)、正交投影(orthographic projection)。
仿射变换(affine transform)可以合并线性变换和平移变换,将仿射变换扩展到4维空间下用4x4的矩阵来表示,它就是齐次坐标空间(homogeneous space)。
齐次坐标
齐次坐标就是将3x3矩阵(其不能表示平移操作),扩展到4x4的矩阵。4x4的矩阵可以表示平移、缩放、变换,可以将4x4的就很分解成4个部分:
M3x301x3t3x11
其中,左上角的矩阵M3x3用于表示旋转和缩放,t3x1用于表示平移,01x3是零矩阵,右下角的是标量1。
平移矩阵
⎡⎣⎢⎢⎢⎢100001000010txtytz1⎤⎦⎥⎥⎥⎥⎡⎣⎢⎢⎢⎢xyz1⎤⎦⎥⎥⎥⎥=⎡⎣⎢⎢⎢⎢x+txy+tyz+tz1⎤⎦⎥⎥⎥⎥结果x、y、z分量分别增加了一个位置的偏移,在3D中的可视化效果就是把(x,y,z)在空间中平移了(tx,ty,tz)个单位。
缩放矩阵
⎡⎣⎢⎢⎢⎢kx0000ky0000kz00001⎤⎦⎥⎥⎥⎥⎡⎣⎢⎢⎢⎢xyz1⎤⎦⎥⎥⎥⎥=⎡⎣⎢⎢⎢⎢kxxkyykzz1⎤⎦⎥⎥⎥⎥对模型空间沿着x轴、y轴、z轴进行缩放。若kx=ky=kz,这样的缩放是统一缩放,否则是非统一缩放。
其逆矩阵是:
⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢1kx00001ky00001kz00001⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥
旋转矩阵
绕x轴旋转a度:Rx(a)=⎡⎣⎢⎢⎢⎢10000cos(a)sin(a)00−sin(a)cos(a)00001⎤⎦⎥⎥⎥⎥
绕y轴旋转a度:
Ry(a)=⎡⎣⎢⎢⎢⎢cos(a)0−sin(a)00100sin(a)0)cos(a)00001⎤⎦⎥⎥⎥⎥
绕z轴旋转a度:
Rz(a)=⎡⎣⎢⎢⎢⎢cos(a)sin(a)00sin(a)cos(a)0000100001⎤⎦⎥⎥⎥⎥
复合变换
顺序是右乘且先缩放再旋转,最后平移。Pnew=MtranslationMrotationMscalePold
相关文章推荐
- Unity3D shader(6)——vertex shader(顶点颜色变换)
- 三言两语说shader(三)矩阵变换
- Opengl_20 _复习变换矩阵+复习光源+两个模型使用不同的shader
- 结合透视投影变换,分析unity3d shader 中的 ComputeScreenPos这个内置函数
- Unity3d 空间变换中齐次矩阵的w小秘密
- Unity3D - Shader - 坐标空间变换
- Unity3D shader(16)——“Queue”、“IgnoreProjector”、"RenderType"、Ztest、Zwrite、cull
- Unity3D Shader官方教程翻译(十二)----Shader语法:Pass的标记
- Unity3D Shader 入门
- [Unity3D]Shader编程之扫描显示2
- 矩阵及变换,以及矩阵在DirectX和OpenGL中的运用问题:左乘/右乘,行优先/列优先,...
- Unity3D Shader编程】之七 静谧之秋篇: 表面着色器的写法(二)—— 自定义光照模式
- Unity3D Shader官方教程翻译(十一)----Shader语法:Pass的Blending(混合)
- Unity3D Shader官方教程翻译(七)----Shader语法:Pass的Culling & Depth Testing
- Unity3D - 创建自己的Shader
- Unity3D change standard shader rendering mode in runtime
- Silverlight实用窍门系列:54.详解Silverlight中的矩阵变换MatrixTransform,实现其余各种变换【附带实例源码】
- Unity3d shader之SWAP Force Depth-of-Field Shader
- unity3d移动平台性能优化专题(8):shader优化
- 变换后矩阵右上三角元素和与左下三角元素和可能的最大差值