基本的2D图形变换&变换矩阵推导
平时开发程序,免不了要对图像做各种变换处理。有的时候变换可能比较复杂,比如平移之后又旋转,旋转之后又平移,又缩放。
直接用公式计算,不但复杂,而且效率低下。这时可以借助变换矩阵和矩阵乘法,将多个变换合成一个。 最后只要用一个矩阵对每个点做一次处理就可以得到想要的结果。
另外,矩阵乘法一般有硬件支持,比如3D 图形加速卡,处理3D变换中的大量矩阵运算,比普通CPU 要快上1000倍。
下面是3类基本的2D图形变换。
平移:
设某点向x方向移动 dx, y方向移动 dy ,[x,y]为变换前坐标, [X,Y]为变换后坐标。
则 X = x+dx; Y = y+dy;
以矩阵表示:
1 0 0
[X, Y, 1] = [x, y, 1][ 0 1 0 ] ;
dx dy 1
1 0 0
0 1 0 即平移变换矩阵。
dx dy 1
旋转:
旋转相比平移稍稍复杂:
设某点与原点连线和X轴夹角为b度,以原点为圆心,逆时针转过a度 , 原点与该点连线长度为R, [x,y]为变换前坐标, [X,Y]为变换后坐标。
x = Rcos(b) ; y = Rsin(b);
X = Rcos(a+b) = Rcosacosb - Rsinasinb = xcosa - ysina; (合角公式)
Y = Rsin(a+b) = Rsinacosb + Rcosasinb = xsina + ycosa ;
用矩阵表示:
cosa sina 0
[X, Y, 1] = [x, y, 1][-sina cosa 0 ]
0 0 1
cosa sina 0
-sina cosa 0 为旋转变换矩阵。
0 0 1
缩放
设某点坐标,在x轴方向扩大 sx倍,y轴方向扩大 sy倍,[x,y]为变换前坐标, [X,Y]为变换后坐标。
X = sx*x; Y = sy*y;
则用矩阵表示:
sx 0 0
[X, Y, 1] = [x, y, 1][ 0 sy 0 ] ;
0 0 1
sx 0 0
0 sy 0 即为缩放矩阵。
0 0 1
2D基本的模型视图变换,就只有上面这3种,所有的复杂2D模型视图变换,都可以分解成上述3个。
比如某个变换,先经过平移,对应平移矩阵A, 再旋转, 对应旋转矩阵B,再经过缩放,对应缩放矩阵C.
则最终变换矩阵 T = ABC. 即3个矩阵按变换先后顺序依次相乘(矩阵乘法不满足交换律,因此先后顺序一定要讲究)。
最近在学习OpenGL,并准备深入学习一下计算机图形学,接下去,会写一些OpenGL的入门和Tips。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端