齐次坐标系下的变换矩阵

news2025/4/23 17:45:20

理解齐次坐标系下的变换矩阵

文章目录

  • 理解齐次坐标系下的变换矩阵
    • 1 引言
    • 2 齐次坐标系的简要介绍
      • 2.1 齐次坐标系的定义
      • 2.2 为什么需要齐次坐标系?
      • 2.3 齐次坐标系的特殊性质
        • 2.3.1 点和向量的区分
        • 2.3.2 投影变换
    • 3 齐次坐标系下的变换矩阵
      • 3.1 二维变换矩阵
        • 平移变换
        • 缩放变换
        • 旋转变换(逆时针旋转θ角度)
        • 复合变换
      • 3.2 三维变换矩阵
        • 平移变换
        • 缩放变换
        • 绕X轴旋转
        • 绕Y轴旋转
        • 绕Z轴旋转
    • 4 齐次坐标系下的变换矩阵的实际应用示例
    • 5 总结
    • 参考文献

1 引言

在计算机图形学、计算机视觉和机器人学等领域,齐次坐标系是一个极其重要的数学工具。它不仅能够统一表示平移、旋转、缩放等变换,还能够处理投影变换,使得各种几何变换可以通过矩阵乘法优雅地表示和计算。本文将深入介绍齐次坐标系的概念以及在此基础上的变换矩阵。

2 齐次坐标系的简要介绍

关于齐次坐标系及其作用的介绍,可以参考我的这一篇文章:齐次坐标系统:什么是齐次坐标?为什么要引入齐次坐标?。

2.1 齐次坐标系的定义

齐次坐标系是将n维空间映射到n+1维空间的一种方法:

  • 二维空间中的点 ( x , y ) (x, y) (x,y)在齐次坐标系中表示为 ( x , y , w ) (x, y, w) (x,y,w),其中 w ≠ 0 w \neq 0 w=0,对应的笛卡尔坐标为 ( x / w , y / w ) (x/w, y/w) (x/w,y/w)
  • 三维空间中的点 ( x , y , z ) (x, y, z) (x,y,z)在齐次坐标系中表示为 ( x , y , z , w ) (x, y, z, w) (x,y,z,w),其中 w ≠ 0 w \neq 0 w=0,对应的笛卡尔坐标为 ( x / w , y / w , z / w ) (x/w, y/w, z/w) (x/w,y/w,z/w)

通常,我们令 w = 1 w=1 w=1,即二维点表示为 ( x , y , 1 ) (x, y, 1) (x,y,1),三维点表示为 ( x , y , z , 1 ) (x, y, z, 1) (x,y,z,1)

2.2 为什么需要齐次坐标系?

在传统的笛卡尔坐标系中,我们用 ( x , y ) (x, y) (x,y)表示二维平面上的点,用 ( x , y , z ) (x, y, z) (x,y,z)表示三维空间中的点。然而,当我们需要表示平移变换时,会遇到一个问题:平移不能用线性变换(即矩阵乘法)表示。

例如,在二维空间中,点 ( x , y ) (x, y) (x,y)沿向量 ( t x , t y ) (t_x, t_y) (tx,ty)平移后的坐标为:
x ′ = x + t x y ′ = y + t y x' = x + t_x \\ y' = y + t_y x=x+txy=y+ty

这个变换包含加法操作,无法用矩阵乘法表示。为了解决这个问题,齐次坐标系应运而生。

2.3 齐次坐标系的特殊性质

2.3.1 点和向量的区分

在齐次坐标系中,点和向量可以明确区分:

  • 点: ( x , y , z , 1 ) (x, y, z, 1) (x,y,z,1)
  • 向量: ( x , y , z , 0 ) (x, y, z, 0) (x,y,z,0)

这种区分在几何计算中非常有用,因为点可以平移,而向量只能旋转和缩放。

2.3.2 投影变换

齐次坐标系最强大的特性之一是能够表示投影变换。通过适当设置 4 × 4 4 \times 4 4×4矩阵,我们可以实现透视投影、正交投影等。

例如,一个简单的透视投影矩阵可以表示为:
( 1 0 0 0 0 1 0 0 0 0 1 0 0 0 − 1 / d 0 ) \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & -1/d & 0 \end{pmatrix} 100001000011/d0000
其中d是视点到投影平面的距离。

3 齐次坐标系下的变换矩阵

注:这些变换矩阵的使用方式(对应的矩阵乘法)如下:

以在二维空间中,逆时针旋转θ角度的旋转矩阵为例:

R ( θ ) = ( cos ⁡ ( θ ) − sin ⁡ ( θ ) 0 sin ⁡ ( θ ) cos ⁡ ( θ ) 0 0 0 1 ) R(\theta) = \begin{pmatrix} \cos(\theta) & -\sin(\theta) & 0 \\ \sin(\theta) & \cos(\theta) & 0 \\ 0 & 0 & 1 \end{pmatrix} R(θ)= cos(θ)sin(θ)0sin(θ)cos(θ)0001

对于点 P = ( x , y , 1 ) T P = (x, y, 1)^T P=(x,y,1)T,旋转后的点 P ′ P' P 可以通过以下矩阵乘法计算(注意此时的 P P P矩阵是列向量):

P ′ = R ( θ ) ⋅ P = ( cos ⁡ ( θ ) − sin ⁡ ( θ ) 0 sin ⁡ ( θ ) cos ⁡ ( θ ) 0 0 0 1 ) ( x y 1 ) = ( x cos ⁡ ( θ ) − y sin ⁡ ( θ ) x sin ⁡ ( θ ) + y cos ⁡ ( θ ) 1 ) P' = R(\theta) \cdot P = \begin{pmatrix} \cos(\theta) & -\sin(\theta) & 0 \\ \sin(\theta) & \cos(\theta) & 0 \\ 0 & 0 & 1 \end{pmatrix} \begin{pmatrix} x \\ y \\ 1 \end{pmatrix} = \begin{pmatrix} x\cos(\theta) - y\sin(\theta) \\ x\sin(\theta) + y\cos(\theta) \\ 1 \end{pmatrix} P=R(θ)P= cos(θ)sin(θ)0sin(θ)cos(θ)0001 xy1 = xcos(θ)ysin(θ)xsin(θ)+ycos(θ)1

也可以写成(注意此时的 P P P矩阵是列向量(x, y, 1)):

P ′ = P ⋅ R ( θ ) = ( x y 1 ) ( cos ⁡ ( θ ) sin ⁡ ( θ ) 0 − sin ⁡ ( θ ) cos ⁡ ( θ ) 0 0 0 1 ) = ( x cos ⁡ ( θ ) − y sin ⁡ ( θ ) x sin ⁡ ( θ ) + y cos ⁡ ( θ ) 1 ) P' = P \cdot R(\theta) = \begin{pmatrix} x & y & 1 \end{pmatrix} \begin{pmatrix} \cos(\theta) & \sin(\theta) & 0 \\ -\sin(\theta) & \cos(\theta) & 0 \\ 0 & 0 & 1 \end{pmatrix} = \begin{pmatrix} x\cos(\theta) - y\sin(\theta) & x\sin(\theta) + y\cos(\theta) & 1 \end{pmatrix} P=PR(θ)=(xy1) cos(θ)sin(θ)0sin(θ)cos(θ)0001 =(xcos(θ)ysin(θ)xsin(θ)+ycos(θ)1)

下文中的变换矩阵均以前一种方法(即表示点的坐标的 P P P矩阵是行向量,与变换矩阵依次左乘)为例。如果采用后一种方法,即表示点的坐标的 P P P矩阵是列向量,那么变换矩阵应该转置,并且这个表示点的坐标的列向量 P P P矩阵与变换矩阵应依次右乘

3.1 二维变换矩阵

在二维齐次坐标系下,变换矩阵是 3 × 3 3 \times 3 3×3的:

平移变换

( 1 0 t x 0 1 t y 0 0 1 ) \begin{pmatrix} 1 & 0 & t_x \\ 0 & 1 & t_y \\ 0 & 0 & 1 \end{pmatrix} 100010txty1

缩放变换

( s x 0 0 0 s y 0 0 0 1 ) \begin{pmatrix} s_x & 0 & 0 \\ 0 & s_y & 0 \\ 0 & 0 & 1 \end{pmatrix} sx000sy0001

旋转变换(逆时针旋转θ角度)

( cos ⁡ ( θ ) − sin ⁡ ( θ ) 0 sin ⁡ ( θ ) cos ⁡ ( θ ) 0 0 0 1 ) \begin{pmatrix} \cos(\theta) & -\sin(\theta) & 0 \\ \sin(\theta) & \cos(\theta) & 0 \\ 0 & 0 & 1 \end{pmatrix} cos(θ)sin(θ)0sin(θ)cos(θ)0001

复合变换

多个变换可以通过矩阵乘法组合在一起。例如,先旋转后平移的变换矩阵为:
( 1 0 t x 0 1 t y 0 0 1 ) × ( cos ⁡ ( θ ) − sin ⁡ ( θ ) 0 sin ⁡ ( θ ) cos ⁡ ( θ ) 0 0 0 1 ) = ( cos ⁡ ( θ ) − sin ⁡ ( θ ) t x sin ⁡ ( θ ) cos ⁡ ( θ ) t y 0 0 1 ) \begin{pmatrix} 1 & 0 & t_x \\ 0 & 1 & t_y \\ 0 & 0 & 1 \end{pmatrix} \times \begin{pmatrix} \cos(\theta) & -\sin(\theta) & 0 \\ \sin(\theta) & \cos(\theta) & 0 \\ 0 & 0 & 1 \end{pmatrix} = \begin{pmatrix} \cos(\theta) & -\sin(\theta) & t_x \\ \sin(\theta) & \cos(\theta) & t_y \\ 0 & 0 & 1 \end{pmatrix} 100010txty1 × cos(θ)sin(θ)0sin(θ)cos(θ)0001 = cos(θ)sin(θ)0sin(θ)cos(θ)0txty1

3.2 三维变换矩阵

在三维齐次坐标系下,变换矩阵是 4 × 4 4 \times 4 4×4的:

平移变换

( 1 0 0 t x 0 1 0 t y 0 0 1 t z 0 0 0 1 ) \begin{pmatrix} 1 & 0 & 0 & t_x \\ 0 & 1 & 0 & t_y \\ 0 & 0 & 1 & t_z \\ 0 & 0 & 0 & 1 \end{pmatrix} 100001000010txtytz1

缩放变换

( s x 0 0 0 0 s y 0 0 0 0 s z 0 0 0 0 1 ) \begin{pmatrix} s_x & 0 & 0 & 0 \\ 0 & s_y & 0 & 0 \\ 0 & 0 & s_z & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix} sx0000sy0000sz00001

绕X轴旋转

( 1 0 0 0 0 cos ⁡ ( θ ) − sin ⁡ ( θ ) 0 0 sin ⁡ ( θ ) cos ⁡ ( θ ) 0 0 0 0 1 ) \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & \cos(\theta) & -\sin(\theta) & 0 \\ 0 & \sin(\theta) & \cos(\theta) & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix} 10000cos(θ)sin(θ)00sin(θ)cos(θ)00001

绕Y轴旋转

( cos ⁡ ( θ ) 0 sin ⁡ ( θ ) 0 0 1 0 0 − sin ⁡ ( θ ) 0 cos ⁡ ( θ ) 0 0 0 0 1 ) \begin{pmatrix} \cos(\theta) & 0 & \sin(\theta) & 0 \\ 0 & 1 & 0 & 0 \\ -\sin(\theta) & 0 & \cos(\theta) & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix} cos(θ)0sin(θ)00100sin(θ)0cos(θ)00001

绕Z轴旋转

( cos ⁡ ( θ ) − sin ⁡ ( θ ) 0 0 sin ⁡ ( θ ) cos ⁡ ( θ ) 0 0 0 0 1 0 0 0 0 1 ) \begin{pmatrix} \cos(\theta) & -\sin(\theta) & 0 & 0 \\ \sin(\theta) & \cos(\theta) & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix} cos(θ)sin(θ)00sin(θ)cos(θ)0000100001

4 齐次坐标系下的变换矩阵的实际应用示例

下面是一个使用Python和NumPy实现齐次坐标变换的简单示例:

import numpy as np
import matplotlib.pyplot as plt

# 定义一个2D点
point = np.array([1, 2, 1])  # 齐次坐标 (x, y, 1)

# 定义变换矩阵
# 1. 平移变换 (x+2, y+3)
translation = np.array([
    [1, 0, 2],
    [0, 1, 3],
    [0, 0, 1]
])

# 2. 旋转变换 (45度)
theta = np.radians(45)
rotation = np.array([
    [np.cos(theta), -np.sin(theta), 0],
    [np.sin(theta), np.cos(theta), 0],
    [0, 0, 1]
])

# 3. 缩放变换 (x*2, y*2)
scaling = np.array([
    [2, 0, 0],
    [0, 2, 0],
    [0, 0, 1]
])

# 应用变换
translated_point = translation.dot(point)
rotated_point = rotation.dot(point)
scaled_point = scaling.dot(point)

# 组合变换 (先旋转,再平移)
combined = translation.dot(rotation)
combined_point = combined.dot(point)

# 打印结果
print(f"原始点: ({point[0]}, {point[1]})")
print(f"平移后: ({translated_point[0]}, {translated_point[1]})")
print(f"旋转后: ({rotated_point[0]:.2f}, {rotated_point[1]:.2f})")
print(f"缩放后: ({scaled_point[0]}, {scaled_point[1]})")
print(f"组合变换后: ({combined_point[0]:.2f}, {combined_point[1]:.2f})")

5 总结

齐次坐标系是计算机图形学中的基础工具,它通过增加一个维度,使得各种变换(包括平移、旋转、缩放和投影)都可以用矩阵乘法统一表示。这种表示方法不仅数学上优雅,而且在计算上高效,特别是在需要连续应用多种变换的场景中。

理解齐次坐标系及其变换矩阵,对于从事计算机图形学、计算机视觉、机器人学等领域的开发和研究工作至关重要。通过本文的介绍,希望读者能够掌握这一强大工具的基本原理和应用方法。

参考文献

  1. Foley, J. D., Van Dam, A., Feiner, S. K., & Hughes, J. F. (1995). Computer Graphics: Principles and Practice. Addison-Wesley.
  2. Shirley, P., & Marschner, S. (2009). Fundamentals of Computer Graphics. A K Peters/CRC Press.
  3. Craig, J. J. (2004). Introduction to Robotics: Mechanics and Control. Pearson Education.

如有问题或建议,欢迎在评论区留言交流!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2340944.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

开源Midjourney替代方案:企业级AI绘画+PPT生成系统+AI源码

「AI取代设计师?」开源Midjourney替代方案:企业级AI绘画PPT生成系统 ——零代码私有化部署,5倍速出图100%版权合规 设计师行业的危机与机遇 1. 传统设计流程的致命短板 痛点 人工设计 AI系统 单张海报耗时 3小时(含反复修改…

2025.04.20【Lollipop】| Lollipop图绘制命令简介

Customize markers See the different options allowing to customize the marker on top of the stem. Customize stems See the different options allowing to customize the stems. 文章目录 Customize markersCustomize stems Lollipop图简介R语言中的Lollipop图使用ggp…

【Harmony】常用工具类封装

文章目录 一,简介二,网络请求工具类2.1、鸿蒙原生http封装2.2、第三方axios封装(需提前下载依赖) 三、录音笔相关工具类3.1、录音封装(录入)3.2、录音封装(放音/渲染)3.3、文件写入封装(针对录音/放音功能) 四、RDB关系型数据库4.1、relationalStore简答…

DCDC芯片,boost升压电路设计,MT3608 芯片深度解析:从架构到设计的全维度技术手册

一、硬件架构解析:电流模式升压 converter 的核心设计 (一)电路拓扑与核心组件 MT3608 采用恒定频率峰值电流模式升压(Boost)转换器架构,核心由以下模块构成: 集成功率 MOSFET 内置 80mΩ 导通电阻的 N 沟道 MOSFET,漏极(Drain)对应引脚 SW,源极(Source)内部接…

Cline 之Plan和Act模式

Cline 提供了 "Plan & Act"双模式开发框架。适用在不同的场景。 一、核心模式理念 通过结构化开发流程提升AI编程效率,采用"先规划后执行"的核心理念。 该框架旨在帮助开发者构建更易维护、准确性更高的代码,同时显著缩短开发…

【中级软件设计师】程序设计语言基础成分

【中级软件设计师】程序设计语言基础成分 目录 【中级软件设计师】程序设计语言基础成分一、历年真题二、考点:程序设计语言基础成分1、基本成分2、数据成分3、控制成分 三、真题的答案与解析答案解析 复习技巧: 若已掌握【程序设计语言基础成分】相关知…

C++项目 —— 基于多设计模式下的同步异步日志系统(3)(日志器类)

C项目 —— 基于多设计模式下的同步&异步日志系统(3)(日志器类) 整体思想设计日志消息的构造C语言式的不定参函数的作用函数的具体实现逻辑1. 日志等级检查2. 初始化可变参数列表3. 格式化日志消息4. 释放参数列表5. 序列化和…

【数学建模】随机森林算法详解:原理、优缺点及应用

随机森林算法详解:原理、优缺点及应用 文章目录 随机森林算法详解:原理、优缺点及应用引言随机森林的基本原理随机森林算法步骤随机森林的优点随机森林的缺点随机森林的应用场景Python实现示例超参数调优结论参考文献 引言 随机森林是机器学习领域中一种…

蓝桥杯 19.合根植物

合根植物 原题目链接 题目描述 W 星球的一个种植园被分成 m n 个小格子(东西方向 m 行,南北方向 n 列)。每个格子里种了一株合根植物。 这种植物有个特点,它的根可能会沿着南北或东西方向伸展,从而与另一个格子的…

Linux环境MySQL出现无法启动的问题解决 [InnoDB] InnoDB initialization has started.

目录 起因 强制启用恢复模式 备份数据 起因 服务器重启了,然后服务器启动完成之后我发现MySQL程序没有启动,错误信息如下: 2025-04-19T12:46:47.648559Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started. 2025-04-1…

高性能服务器配置经验指南1——刚配置好服务器应该做哪些事

文章目录 安装ubuntu安装必要软件设置用户远程连接安全问题ClamAV安装教程步骤 1:更新系统软件源步骤 2:升级系统(可选但推荐)步骤 3:安装 ClamAV步骤 4:更新病毒库步骤 5:验证安装ClamAV 常用命…

Centos7安装Jenkins(图文教程)

本章教程,主要记录在centos7安装部署Jenkins 的详细过程。 [root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) 一、基础环境安装 内存大小要求:256 MB 内存以上 硬盘大小要求:10 GB 及以上 安装基础java环境:Java 17 ( JRE 或者 JDK 都可…

【JAVA】十三、基础知识“接口”精细讲解!(二)(新手友好版~)

哈喽大家好呀qvq,这里是乎里陈,接口这一知识点博主分为三篇博客为大家进行讲解,今天为大家讲解第二篇java中实现多个接口,接口间的继承,抽象类和接口的区别知识点,更适合新手宝宝们阅读~更多内容持续更新中…

边缘计算盒子是什么?

边缘计算盒子是一种小型的硬件设备,通常集成了处理器、存储器和网络接口等关键组件,具备一定的计算能力和存储资源,并能够连接到网络。它与传统的云计算不同,数据处理和分析直接在设备本地完成,而不是上传到云端&#…

大数据系列 | 详解基于Zookeeper或ClickHouse Keeper的ClickHouse集群部署--完结

大数据系列 | 详解基于Zookeeper或ClickHouse Keeper的ClickHouse集群部署 1. ClickHouse与MySQL的区别2. 在群集的所有机器上安装ClickHouse服务端2.1. 在线安装clickhouse2.2. 离线安装clickhouse 3. ClickHouse Keeper/Zookeeper集群安装4. 在配置文件中设置集群配置5. 在每…

19Linux自带按键驱动程序的使用_csdn

1、自带按键驱动程序源码简析 2、自带按键驱动程序的使用 设备节点信息&#xff1a; gpio-keys {compatible "gpio-keys";pinctrl-names "default";pinctrl-0 <&key_pins_a>;autorepeat;key0 {label "GPIO Key L";linux,code &l…

用银河麒麟 LiveCD 快速查看原系统 IP 和打印机配置

原文链接&#xff1a;用银河麒麟 LiveCD 快速查看原系统 IP 和打印机配置 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇在银河麒麟操作系统的 LiveCD 或系统试用镜像环境下&#xff0c;如何查看原系统中电脑的 IP 地址与网络打印机 IP 地址的实用教程。在系统损坏…

.net core 项目快速接入Coze智能体-开箱即用-第2节

目录 一、Coze智能体的核心价值 二、开箱即用-效果如下 三 流程与交互设计 本节内容调用自有或第三方的服务 实现语音转文字 四&#xff1a;代码实现----自行实现 STT 【语音转文字】 五&#xff1a;代码实现--调用字节API实现语音转文字 .net core 项目快速接入Coze智能…

win10中打开python的交互模式

不是输入python3&#xff0c;输入python&#xff0c;不知道和安装python版本有没有关系。做个简单记录&#xff0c;不想记笔记了

时序逻辑电路——序列检测器

文章目录 一、序列检测二、牛客真题1. 输入序列连续的序列检测&#xff08;输入连续、重叠、不含无关项、串行输入&#xff09;写法一&#xff1a;移位寄存器写法二&#xff1a;Moore状态机写法三&#xff1a;Mealy状态机 一、序列检测 序列检测器指的就是将一个指定的序列&…