当前位置: 首页 > news >正文

图形学:Transform矩阵(3维 2维) 平移,旋转,缩放

0. 简介

在图形学领域中,Transform矩阵(变换矩阵)是一种表示图形对象在二维或三维空间中的位置、方向和大小变化的数学工具。它们用于执行各种图形变换,如平移、旋转、缩放。Transform矩阵通常表示为一个二维或三维矩阵,具体形式取决于空间的维度。

0.1 二维变换矩阵

  • 在二维图形学中,通常使用3x3的矩阵表示变换,其中最后一行通常是[0, 0, 1],因为二维变换不影响z轴。这个矩阵可以表示平移、旋转、缩放和剪切。
  • 例如,一个简单的二维平移矩阵可以写成:
   [ 1  0  tx ][ 0  1  ty ][ 0  0  1  ]

其中txty是平移的水平和垂直距离。

0.2 三维变换矩阵

  • 在三维图形学中,通常使用4x4的矩阵表示变换,其中最后一列通常是[0, 0, 0, 1]。这种矩阵可以表示平移、旋转、缩放以及更复杂的变换。
  • 一个简单的三维平移矩阵可以写成:
   [ 1  0  0  tx ][ 0  1  0  ty ][ 0  0  1  tz ][ 0  0  0  1  ]

其中txtytz是平移的xyz轴距离。

不管是二维变换矩阵还是三维变换矩阵,它的最后一行都是齐次坐标,通常是[0, ... , 1]用于处理齐次坐标,使得可以用矩阵乘法来同时处理旋转和平移。

1. 举个例子

1.1 平移

给定的初始 Transform 矩阵如下:

[ 1  0  0  tx ]
[ 0  1  0  ty ]
[ 0  0  1  tz ]
[ 0  0  0  1  ]

希望在 x 轴增加 2 个单位,y 轴增加 1 个单位,z 轴减小 3 个单位。

1.1.1 计算过程

  1. 对 x 轴进行增加 2 个单位: 可以将 tx(原始平移量)增加 2 个单位。
  2. 对 y 轴进行增加 1 个单位: 将 ty(原始平移量)增加 1 个单位。
  3. 对 z 轴进行减小 3 个单位: 要使物体沿 z 轴负方向移动,需要将 tz 减小 3 个单位。

1.1.2 计算结果

[ 1  0  0  tx + 2 ]
[ 0  1  0  ty + 1 ]
[ 0  0  1  tz - 3 ]
[ 0  0  0     1   ]

这个新的矩阵表示了对原始物体进行了所需的平移操作。

1.2 旋转

1.2.1 2维旋转矩阵

```css
[ cos(θ)   -sin(θ) ]
[ sin(θ)    cos(θ) ]

1.2.1 3维旋转矩阵

  • 绕x轴旋转矩阵
[ 1     0        0      0 ]
[ 0  cos(θ)   -sin(θ)   0 ]
[ 0  sin(θ)    cos(θ)   0 ]
[ 0     0        0      1 ]
  • z轴旋转
[ cos(θ)  -sin(θ)   0   0 ]
[ sin(θ)   cos(θ)   0   0 ]
[    0       0      1   0 ]
[    0       0      0   1 ]
  • 绕y轴旋转
[ cos(θ)   0   sin(θ)   0 ]
[    0     1      0     0 ]
[-sin(θ)   0   cos(θ)   0 ]
[    0     0      0     1 ]

原始的Transform矩阵T与旋转矩阵R相乘,得到新的Transform矩阵 T'
T' = T * R

1.3 缩放

1.3.1 缩放矩阵

[ sx  0   0   0 ]
[ 0   sy  0   0 ]
[ 0   0   sz  0 ]
[ 0   0   0   1 ]

原始的Transform矩阵T与缩放矩阵S相乘,得到新的Transform矩阵 T'
T' = T * S

http://www.lryc.cn/news/297808.html

相关文章:

  • Docker学习历程
  • Android:Volley框架使用
  • 前端修炼手册(uniapp的api篇)
  • JAVA面试题16
  • P1044 [NOIP2003 普及组] 栈题解
  • 【DSP】数字信号处理发展里程碑(AI【文心一言】 辅助生成)
  • 【JavaScript 】finally() 方法和Filter() 方法
  • 假期作业8
  • 基于vue+node.js的校园跳蚤市场系统多商家
  • Linux操作系统基础(六):Linux常见命令(一)
  • 【Android-Compose】Material3 新版下拉刷新 PullRefresh
  • FANUC机器人外部远程启动的相关参数设置示例
  • 供货商、品牌方、供应链如何对接快团团头部大团长?这三个关键点你一定要记住
  • LLMs之Llama2 70B:《Self-Rewarding Language Models自我奖励语言模型》翻译与解读
  • 电商小程序06用户审核
  • vue3跨组件(多组件)通信:事件总线【Event Bus】
  • 教材管理系统
  • PV、UV、IP
  • ZigBee学习——在官方例程上实现串口通信
  • nginx添加lua模块
  • Csapp-chapter3-压栈和弹栈
  • Rust入门1——HelloWorld
  • android中使用Bitmp对象绘制图形
  • Linux操作系统基础(八):Linux的vi/vim编辑器
  • nginx限制网段访问
  • Linux开机自动执行自定义脚本或命令
  • 【Linux】 网络编程套接字
  • MATLAB矩阵的操作(第二部分)
  • 基础面试题整理6之Redis
  • MySQL基础查询篇(7)-常用的字符串函数