齐次坐标系统:什么是齐次坐标?为什么要引入齐次坐标?

齐次坐标系统:计算机图形学的基础

在计算机图形学、计算机视觉、相机标定、三维建模等领域,齐次坐标是一个非常重要的数学工具。本文将介绍:齐次坐标的基本概念、数学原理、我们为什么要引入齐次坐标、及其在实际应用中的价值。

文章目录

  • 齐次坐标系统:计算机图形学的基础
    • 1. 什么是齐次坐标?
    • 2. 齐次坐标的数学原理
    • 3. 为什么要引入齐次坐标?——齐次坐标的优势
      • 3.1 统一表示变换
      • 3.2 处理无穷远点
      • 3.3 链式变换的简化
    • 4. 在计算机图形学中的应用
      • 4.1 3D渲染管线
      • 4.2 计算机视觉
      • 4.3 机器人学
    • 5. 齐次坐标的实际例子
      • 5.1 二维平移变换
      • 5.2 透视投影
    • 6. 结论
    • 参考资料

1. 什么是齐次坐标?

齐次坐标是一种表示几何点的方式,它通过添加一个额外的坐标分量,将 n n n维空间中的点表示为 n + 1 n+1 n+1维空间中的点。这种表示方法最早由德国数学家August Ferdinand Möbius在19世纪提出。

在二维空间中,点 ( x , y ) (x, y) (x,y)的齐次坐标表示为 ( x , y , w ) (x, y, w) (x,y,w),其中 w w w是一个非零值。实际的二维坐标可以通过除以w得到: ( x / w , y / w ) (x/w, y/w) (x/w,y/w)
例如,点 ( 1 , 2 ) (1,2) (1,2)的齐次坐标可以表示为 ( 1 , 2 , 1 ) (1,2,1) (1,2,1),也可以表示为 ( 2 , 4 , 2 ) (2,4,2) (2,4,2),也可以表示为 ( k , 2 k , k ) ( k ≠ 0 ) (k,2k,k) (k≠0) (k,2k,k)(k=0),等等,它们指的都是同一个点,即二位平面中平面直角坐标为 ( 1 , 2 ) (1,2) (1,2)的点。

在三维空间中,点(x, y, z)的齐次坐标表示为(x, y, z, w),原理和二维同理。

2. 齐次坐标的数学原理

齐次坐标的数学基础可以追溯到射影几何。在射影几何中,平行线在无穷远处相交。齐次坐标系统允许我们用代数方式处理这种情况。

当w=0时,齐次坐标(x, y, 0)表示无穷远处的点或方向向量。这使得我们可以在同一个代数框架内处理点和向量,又可以区分点和向量的形式

类似于欧拉积分定义的Gamma函数(Gamma函数是阶乘函数在复数域上的推广,在数学物理中有广泛应用。类似地,齐次坐标是欧几里得坐标在射影几何中的推广):

Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n1)!nN 是通过 Euler integral

Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=0tz1etdt.

齐次坐标也有其优雅的数学表达。

3. 为什么要引入齐次坐标?——齐次坐标的优势

3.1 统一表示变换

使用齐次坐标的最大优势之一是可以用单一的矩阵乘法操作来表示各种几何变换,包括:

  • 平移
  • 旋转
  • 缩放
  • 剪切
  • 透视投影

P.S. 这些变换的变换矩阵可以参考我的这一篇文章:【等我有时间再写一篇】

在非齐次坐标系统中,平移需要加法操作,而其他变换需要乘法操作。使用齐次坐标,所有这些变换都可以统一为矩阵乘法。

平移变换在几何学和计算机图形学中是常见的操作,但它并不属于线性变换。线性变换需要满足两个条件:可加性齐次性。具体来说,线性变换 f f f必须满足以下条件:

  • 可加性: f ( x + y ) = f ( x ) + f ( y ) f(x + y) = f(x) + f(y) f(x+y)=f(x)+f(y)
  • 齐次性: f ( k x ) = k f ( x ) f(kx) = kf(x) f(kx)=kf(x)

平移变换的数学形式为:
x ′ = x + t x x' = x + t_x x=x+tx y ′ = y + t y y' = y + t_y y=y+ty z ′ = z + t z z' = z + t_z z=z+tz

这种变换无法用一个矩阵 M M M来表示,使得 M v = w Mv = w Mv=w,因此不满足线性变换的定义。

正因如此,为了将平移变换与线性变换结合,引入了齐次坐标系。在齐次坐标系中,二维点 ( x , y ) (x, y) (x,y)可以表示为 ( x , y , 1 ) (x, y, 1) (x,y,1),三维点 ( x , y , z ) (x, y, z) (x,y,z)可以表示为 ( x , y , z , 1 ) (x, y, z, 1) (x,y,z,1)。通过引入齐次坐标,平移变换可以表示为矩阵乘法,从而与线性变换统一起来。
例如,三维空间中的平移变换可以表示为:
[ x ′ y ′ z ′ 1 ] = [ 1 0 0 t x 0 1 0 t y 0 0 1 t z 0 0 0 1 ] [ x y z 1 ] \begin{bmatrix} x' \\ y' \\ z' \\ 1 \end{bmatrix} = \begin{bmatrix} 1 & 0 & 0 & t_x \\ 0 & 1 & 0 & t_y \\ 0 & 0 & 1 & t_z \\ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \\ z \\ 1 \end{bmatrix} xyz1 = 100001000010txtytz1 xyz1

通过引入齐次坐标系统,能够将平移、旋转、缩放等变换统一成矩阵乘法的形式,保证了形式上的线性一致性,使得多次变换可以通过矩阵连乘来实现结合使用,形成更复杂的变换,从而简化计算和降低运算量。

3.2 处理无穷远点

齐次坐标允许我们表示和处理无穷远点,这在透视投影和计算机视觉中非常有用。

3.3 链式变换的简化

多个变换可以通过矩阵乘法链接在一起,大大简化了复杂变换的计算。

4. 在计算机图形学中的应用

4.1 3D渲染管线

在OpenGL和DirectX等图形API中,齐次坐标被广泛用于顶点变换和投影。

4.2 计算机视觉

在计算机视觉中,齐次坐标用于相机标定、立体视觉和三维重建。

4.3 机器人学

在机器人学中,齐次变换矩阵用于表示机器人各关节的位置和方向。

5. 齐次坐标的实际例子

5.1 二维平移变换

在二维空间中,点(x, y)的平移可以表示为:

[ x ′ y ′ 1 ] = [ 1 0 t x 0 1 t y 0 0 1 ] [ x y 1 ] \begin{bmatrix} x' \\ y' \\ 1 \end{bmatrix} = \begin{bmatrix} 1 & 0 & t_x \\ 0 & 1 & t_y \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} xy1 = 100010txty1 xy1

5.2 透视投影

透视投影可以通过齐次坐标优雅地表示,这是计算机图形学中的核心操作。

6. 结论

齐次坐标系统是计算机图形学和计算机视觉的基础工具。通过引入额外的坐标分量,它提供了一种统一和简化几何变换的强大方法。虽然初学者可能需要一些时间来适应这种表示方法,但掌握齐次坐标对于理解现代计算机图形学算法和技术至关重要。


参考资料

[1] 闫令琪. Lecture 03 Transformation: GAMES101-现代计算机图形学入门 第03讲 转型[EB/OL]. (2020-02-22)[2025-04-13]. https://www.bilibili.com/video/BV1X7411F744?p=3.

[2] 鸡米工程师. 图形学-变换(平移矩阵,旋转矩阵,缩放矩阵,线性变换,仿射变换,齐次坐标)[EB/OL]. (2022-10-19)[2025-04-13]. https://blog.csdn.net/weixin_46773434/article/details/127417579.

[3] 人狮子. 相机标定(一)—— 深入理解齐次坐标及其作用[EB/OL]. (2020-11-12)[2025-04-13]. https://blog.csdn.net/baidu_35536188/article/details/109735600.

[4] 花朝秋月夜6. 平移变换为什么不是线性变换[EB/OL]. (2019-12-08)[2025-04-13]. https://zhidao.baidu.com/question/1706534989170268900.html.

[5] 力博荣三维可视化. 001_图形学里的变换[EB/OL]. (2021-10-05)[2025-04-13]. https://blog.csdn.net/qq_21476953/article/details/120573356.

[6] hywmj. [计算机视觉] 什么是齐次坐标?为什么要引入齐次坐标?[EB/OL]. (2021-07-28)[2025-04-13]. https://blog.csdn.net/wangmj_hdu/article/details/119143771.

[7] 追求卓越583. 为什么要引入齐次坐标,齐次坐标的意义(一)[EB/OL]. (2019-07-11)[2025-04-13]. https://blog.csdn.net/zhuiqiuzhuoyue583/article/details/95228010.

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

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

相关文章

JS的大数运算(注意:原生的只支持整数计算!!!)

JS的大数运算(注意:原生的只支持整数计算!!!) 一、JS的大数运算(注意:原生的只支持整数计算!!!)1. 数字精度限制2. 大数解决方案2.1. …

Android 之美国关税问题导致 GitHub 403 无法正常访问,责任在谁?

这几天各国关税问题导致世界动荡不安,如今GitHub又无法正常访问,是不是Google到时候也无法正常使用了。

JAVA中正则表达式的入门与使用

JAVA中正则表达式的入门与使用 一,基础概念 正则表达式(Regex) 用于匹配字符串中的特定模式,Java 中通过 java.util.regex 包实现,核心类为: Pattern:编译后的正则表达式对象。 Matcher&#…

Prompt_Engineering提示词工程(一)

一、Prompt(提示词) Prompt(提示词)是给AI模型交互文本片段,用于指导模型生成符合预期输出结果,提示词的目的是为模型提供一个上下文的任务,以便模型能够更准确地理解用户的意图,并…

【设计模式】面向对象开发学习OOPC

PLOOC-裸机思维 PLOOC-git OOPC精要——撩开“对象”的神秘面纱 C/C面向对象编程之封装-KK 面向过程,本质是“顺序,循环,分支”面向对象,本质是“继承,封装,多态”参考的书籍:《UMLOOPC嵌入式…

软考高级--案例分析

架构风格 重点 交互方式数据结构控制结构扩展方法 分类 管道-过滤器风格 数据流 数据仓储风格 星型结构以数据为中心,其他构件围绕数据进行交互 企业服务总线esb 定义 以一个服务总线充当中间件的角色,把各方服务对接起来,所有服务…

01_背包问题

package org.josh; import java.util.*; public class Main { public static void main(String[] args) { Scanner scanner new Scanner(System.in); int n scanner.nextInt(); // 物品数量 long w scanner.nextLong(); // 背包容量,使用long防止溢出 int[] v …

esp32-idf Linux 环境安装教程

一、提前说明 1. 系统环境 Ubuntu22.04 2. 适配芯片 ESP32S3 3. idf版本 v5.4.1(截止2025年4月13日为最新版本) 二、安装步骤 1. 安装前置依赖 sudo apt-get install git wget flex bison gperf python3 python3-pip python3-venv cmake ninja-build ccache libffi-dev l…

JavaScript 输入输出语句

在JavaScript中,输入和输出是与用户交互的基础。无论是从用户那里获取信息还是向用户展示结果,正确使用输入输出语句都是至关重要的。本文将详细介绍JavaScript中常用的输入输出方法及其应用场景。 一、输出语句 (一)console.lo…

TCP 如何在网络 “江湖” 立威建交?

一、特点: (一)面向连接 在进行数据传输之前,TCP 需要在发送方和接收方之间建立一条逻辑连接。这一过程类似于打电话,双方在通话前需要先拨号建立连接。建立连接的过程通过三次握手来完成,确保通信双方都…

文章记单词 | 第29篇(六级)

一,单词释义 AI /ˌeɪ ˈaɪ/ abbr. 人工智能(Artificial Intelligence)inventory /ˈɪnvəntri/ n. 存货清单;财产清单;库存货物;存货;v. 编制目录;开列清单;盘存cha…

【C#】.NET 8适配器模式实战:用C#实现高可用系统集成与接口桥接艺术

系统集成挑战与适配器模式的价值 当需要整合不同架构或API的系统时,接口兼容性问题往往成为拦路虎。**适配器设计模式(Adapter Pattern)**通过转换接口形态,完美解决这种不兼容性问题。本文将通过C# .NET 8实战演示适配器模式的基…

Nginx基础到全面掌握高性能Web服务核心

目录 前言 第一部分:Nginx基础入门 1.1 什么是Nginx? 1.2 Nginx的典型应用场景 第二部分:Nginx安装与部署 2.1 在不同操作系统上安装Nginx 2.2 验证安装与基本操作 第三部分:Nginx配置详解 3.1 核心配置文件解析 3.2 虚…

C语言中while的相关题目

一、题目引入 以下程序中,while循环的循环次数是多少次? 二、代码分析 首先要明确的一点 while循环是当循环条件为真 就会一直循环 不会停止 while中i是小于10的 说明i可以取到0 1 2 3 4 5 6 7 8 9 进入第一个if判断i小于1为真时执行continue i0是为真的 执行continue 后…

idea 创建 maven-scala项目

文章目录 idea 创建 maven-scala项目1、创建普通maven项目并且配置pom.xml文件2、修改项目结构1)创建scala目录并标记成【源目录】2)导入scala环境3)测试环境 idea 创建 maven-scala项目 1、创建普通maven项目并且配置pom.xml文件 maven依赖…

微服务之间调用外键“翻译”的方法概述

写在前面的话&#xff1a;减少strean流操作&#xff0c;减少多层嵌套for循环。使用普通for循环和map的方式进行转换&#xff0c; 第一步查询数据 List<Student> findList studentDao.findList(findMap); 第二步准备遍历和赋值 if(CollectionUtil.isNotEmpty(findLis…

Spring Boot 中集成 Disruptor_高性能事件处理框架

1. 引言 1.1 什么是 Disruptor Disruptor 是一个高性能的事件处理框架,广泛应用于金融交易系统、日志记录、消息队列等领域。它通过无锁机制和环形缓冲区(Ring Buffer)实现高效的事件处理,具有极低的延迟和高吞吐量的特点。 1.2 为什么使用 Disruptor 高性能:通过无锁机…

Java中equals与 “==” 的区别

首先我们要掌握基本数据类型和引用类型的概念 基本数据类型&#xff1a; byte&#xff0c;short&#xff0c;int,long,float,double,boolean,char 基本的八大数据类型都各自封装着包装类&#xff0c;提供了更多的方法&#xff0c;并且都是引言类型 引用类型&#xff1a; 引…

青少年编程与数学 02-016 Python数据结构与算法 11课题、分治

青少年编程与数学 02-016 Python数据结构与算法 11课题、分治 一、分治算法的基本原理二、分治算法的实现步骤快速排序算法代码示例&#xff08;Python&#xff09; 三、分治算法的复杂度分析四、分治算法的优缺点优点&#xff1a;缺点&#xff1a; 五、分治算法的应用&#xf…

RFID技术概览

一、RFID技术定义 RFID&#xff08;Radio Frequency Identification&#xff0c;射频识别&#xff09; 是一种通过无线电信号识别目标对象并获取相关数据的非接触式自动识别技术。它利用射频信号的空间耦合&#xff08;电感或电磁耦合&#xff09;实现无物理接触的信息传递与目…