几何变换详解

2023-10-29

几何变换详解

在三维图形学中,几何变换大致分为三种,平移变换(Translation),缩放变换(Scaling),旋转变换(Rotation)。以下讨论皆针对DirectX,所以使用左手坐标系。

平移变换

将三维空间中的一个点[x, y, z, 1]移动到另外一个点[x', y', z', 1],三个坐标轴的移动分量分别为dx=Tx, dy=Ty, dz=Tz, 即

x' = x + Tx

y' = y + Ty

z' = z + Tz

平移变换的矩阵如下。

缩放变换

将模型放大或者缩小,本质也是对模型上每个顶点进行放大和缩小(顶点坐标值变大或变小),假设变换前的点是[x, y, z, 1],变换后的点是[x', y', z', 1],那么

x' = x * Sx

y' = y * Sy

z' = z * Sz

缩放变换的矩阵如下。

旋转变换

这是三种变换中最复杂的变换,这里只讨论最简单的情况,绕坐标轴旋转,关于绕任意轴旋转,在后续的随笔中介绍。

绕X轴旋转

绕X轴旋转时,顶点的x坐标不发生变化,y坐标和z坐标绕X轴旋转θ度,旋转的正方向为顺时针方向(沿着旋转轴负方向向原点看)。[x, y, z, 1]表示变换前的点,[x', y', z', 1]表示变换后的点。变换矩阵如下。

关于旋转的正方向,OpenGL与多数图形学书籍规定旋转正方向为逆时针方向(沿着坐标轴负方向向原点看),比如Computer Graphics C Version,p409。

绕Y轴旋转

绕Y轴旋转时,顶点的y坐标不发生变化,x坐标和z坐标绕Y轴旋转θ度。[x, y, z, 1]表示变换前的点,[x', y', z', 1]表示变换后的点。变换矩阵如下。

绕Z轴旋转

绕Z轴旋转时,顶点的z坐标不发生变化,x坐标和y坐标绕Z轴旋转θ度。[x, y, z, 1]表示变换前的点,[x', y', z', 1]表示变换后的点。变换矩阵如下。

绕坐标轴旋转的矩阵推导

上面三个旋转矩阵是如何得来的呢?我们推导一下,首先看一下二维的情况,再扩展到三维即可。实际上上面三种绕坐标轴旋转的情况属于特殊的二维旋转,比如绕Z轴旋转,相当于在与XOY平面上绕原点做二维旋转。

假设点P(x, y)是平面直角坐标系内一点,其到原点的距离为r,其与X轴的夹角为A,现将点P绕原点旋转θ度,得到点P'(x', y'),P'与X轴的夹角为B,则A = B - θ。(注意,在二维坐标中,逆时针旋转时角度为正,顺时针旋转时角度为负,下图中由P旋转到P',角度为θ,若是由P'转到P,则角度为-θ)。

 

于是可得下面的转换方程

(式一)

写成矩阵的形式就是

求得旋转矩阵为

由于这里使用齐次坐标,所以还需加上一维,最终变成如下形式

绕Z轴旋转矩阵

和前面给出的绕Z轴旋转矩阵完全吻合。

对于绕X轴旋转的情况,我们只需将式一中的x用y替换,y用z替换,z用x替换即可。替换后得到

(式二)

对应的旋转矩阵为

绕X轴旋转矩阵

对于绕Y轴旋转的情况,只需对式二做一次同样的替换即可,的到的变换方程为

对应的变换矩阵为

绕Y轴旋转矩阵

逆矩阵

平移变换矩阵的逆矩阵与原来的平移量相同,但是方向相反。

旋转变换矩阵的逆矩阵与原来的旋转轴相同但是角度相反。

缩放变换的逆矩阵正好和原来的效果相反,如果原来是放大,则逆矩阵是缩小,如果原来是缩小,则逆矩阵是放大。

== Happy Coding ==

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

几何变换详解 的相关文章

  • 我的绘图存在坐标/glortho 问题

    I have made a bit of a change to my code in the last couple of hours as everything was messy with my grid so I made it i
  • 使用 Qt 在 xoverlay 之上绘制

    我希望在使用 Xoverlay 渲染的视频流之上绘制一些 UI 我正在使用 gstreamer 播放视频并使用 xoverlay 在 xvimagesink 上渲染它 我的小部件继承自 QGLWidget 我希望使用 QPainter 绘制
  • 使用 glDrawElements 时在 OpenGL 核心配置文件中选取三角形

    我正在使用 glDrawElements 绘制三角形网格 并且希望能够使用鼠标单击来拾取 选择三角形 三角形的网格可以很大 在固定功能 OpenGL 中 可以使用 GL SELECT http content gpwiki org inde
  • 为什么我的 FPS 相机一劳永逸地滚动?

    如果我忽略四元数代数的肮脏细节 我想我理解了旋转和平移变换背后的数学 但仍然不明白我做错了什么 为什么我的相机一劳永逸地滚动 更具体地说 我应该如何从相机的方向 旋转矩阵 计算相机视图矩阵 我正在用 Python 编写一个简约的 3d 引擎
  • glEnableVertexAttribArray 中“index”参数的含义以及(可能)OS X OpenGL 实现中的错误

    1 我是否正确理解 要使用顶点数组或VBO进行绘制 我需要所有属性在着色器程序链接之前调用glBindAttribLocation 或者在着色器程序成功链接后调用glGetAttribLocation 然后使用glVertexAttribP
  • 不理解 gluOrtho2D 函数

    我不能做什么gluOrtho2D 函数是做什么的 是否将原点固定在 OpenGL 窗口上的某个特定点或其他位置 这是因为gluOrtho2D 1 1 1 1 将原点固定在窗口的中间 如果它在某个时刻没有修复原点 那么有什么方法可以修复原点
  • lnk1104:无法打开“LIBC.lib”链接

    使用 GLee 将着色器写入我的 OpenGL 项目并编译后 我收到了错误LNK1104 cannot open file LIBC lib 我尝试按照其他人的建议添加它并忽略它 但没有解决问题 有没有其他方法可以解决我错过的这个问题 以下
  • OpenGL 与 Eclipse CDT + MinGW + GLEW + GLFW:未定义的参考

    Edit 与此同时 我已经弄清楚了这一点 并在下面写了详细的答案 我刚刚尝试在 Win7 上从 Express 版本的 MSVC 10 切换到 Eclipse CDT 在配置时遇到了以下简单 OpenGL 代码的问题 在 Visual St
  • NV_path_rendering替代方案[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我刚刚观看了 Siggraph 2012 的一个非常令人印象深刻的演示 http nvidia fullviewmedia com sig
  • 如果我用opengl绘图的话SDL Renderer就没用了吗?

    我正在学习 SDL2 但我也在使用使用 OpenGL 调用的 imgui 库 从我在网上各种博客上读到的内容来看 我无法轻松混合 SDL2 渲染器和 opengl 调用 我要么使用其中之一 要么使用另一个 我读过的大多数教程都使用渲染器 所
  • 无法在 WSL2 上运行 OpenGL

    我尝试在 WSL2 上运行 OpenGL 代码 但在尝试运行可执行文件时出现以下错误 GLFW error 65543 GLX Failed to create context GLXBadFBConfig Unable to create
  • 在 Linux 上运行我自己的程序的权限被拒绝? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有Ubuntu 9 4 我已经构建了程序 一些基本的 OpenGL 该程序只是制作一个旋转的正方形 然后运行它并 sh blabla p
  • gldrawarrays 不绘制任何东西

    我正在尝试用 VBO 绘制一个三角形 我在窗口上没有看到任何像素 我也没有看到任何 GL ERROR 这是我尝试运行的代码 include
  • OpenGL:伽玛校正图像看起来不线性

    我使用 OpenGL 进行渲染 当我将线性值写入默认帧缓冲区 没有任何伽玛校正 时 它们在我的显示器上显示为线性 这违背了我认为我所知道的关于伽马校正的一切 如下所述 http gamedevelopment tutsplus com ar
  • glDrawElements 只绘制半个四边形

    这是我的功能 void Object draw2 if mIsInitialised return Tell OpenGL about our vertex and normal data glEnableClientState GL VE
  • 不明确的 OpenGL 默认相机位置

    在我的Opengl程序中 在我应用透视投影矩阵之前 每当我绘制一些对象时 我都会在世界坐标系的原点处绘制它 但是几乎所有Opengl教程都指出相机 我的投影视图 位于原点朝向正 z 轴 这取决于您稍后如何处理投影矩阵中的 z 值 但是如果这
  • 纹理的内部格式

    看下面的OpenGL函数 void glTexImage2D GLenum target GLint level GLint internalFormat GLsizei width GLsizei height GLint border
  • 帧缓冲区和在 opengl 中使用着色器

    我对帧缓冲区有点困惑 我想要做的是使用附加了多个纹理的帧缓冲区 填充每个纹理 然后使用着色器组合 混合 所有纹理以创建新的输出 听起来很容易 是的 我也是这么想的 但我不明白 如何将当前绑定的纹理传递给着色器 您需要的是将纹理放入特定的槽中
  • OpenGL:顶点越多,性能越慢

    我正在开发一个程序的一部分 其中给定 xyz 坐标集合 制作 3D 模型 我已经完成了这张图片所需的所有功能 即平移 旋转 缩放 但是给出的 xyz 坐标越多 程序运行速度就越慢 我的程序在处理 29 000 个坐标时运行得非常流畅 但当我
  • 如何使用现代 OpenGL 在透视投影中绘制对象的正交轴? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我有带有透视投影的 3D 场景 我还可以选择场景中的一个对象 我需要为选定的对象绘制轴 问题是轴不会在透视投影中保存其大小 如果物体远离眼睛

随机推荐

  • verdaccio + docker搭建私有npm仓库(有手就行)

    一 环境准备 docker 二 步骤 运行verdaccio docker run d name verdaccio p 4873 4873 restart always verdaccio verdaccio 该命令执行完 一个本地的np
  • 连休8天!关于2020年国庆节、中秋节放假安排的通知!!!

    关于2020年国庆节 中秋节放假安排的通知 根据国务院办公厅通知精神 现将2020年国庆节 中秋节放假安排通知如下 10月1日 星期四 至8日 星期四 放假调休 共8天 9月27日 星期日 10月10日 星期六 上班 请广大市民提前安排好工
  • springcloud微服务实战:(一)微服务重点内容

    微服务重点内容就是两大特性和三大功能 两大特性 高可用性 高扩展性 三大功能 服务间通信 服务容错 异常排查 分布式能力建设 三大功能是指微服务核心组件的功能维度 由浅入深层次递进 而两大特性是构建在每个服务组件之上的高可用性和高可扩展性
  • Windows 11 将使 AMD 芯片性能下降 15%!

    整理 孙胜 出品 CSDN ID CSDNnews 10月5日 微软终于发布了Windows 11正式版本 尽管Windows 11被微软称为 10年以来最重要的版本更新之一 说实话Windows 11还是有点令人失望 暂且不论Window
  • 基于CC2530的串口通信(可用与STM32通信)

    材料准备 CC2530芯片与底板一个 方便调试与下载 这是我淘宝买的一个小小的zigbee开发板 CC2530 配置串口的一般步骤 1 配置 IO 使用外部设备功能 此处配置 P0 2 和 P0 3 用作串口 UART0 2 配置相应串口的
  • 解决:error: ‘XXX’ is not a class template

    解决方法 首先去写 普通类模板 然后再实现 全特化 此问题在测试 模板全特化 的时候发现 如果首先去写 全特化 然后再实现 普通类模板 编译器就会提醒 error XXX is not a class template 全特化 templa
  • IDEA好用的插件推荐

    目录 1 Translation 2 GsonFormat 3 VisualVM Launcher 4 CodeGlance Pro 5 Key Promoter X 6 GenerateAllSetter 7 ignore 8 MyBat
  • 大白话Vue之publicPath

    1 下看一下publicPath字段出现的位置 vue config js webpack config js 2 官网中的解释 可以忽略 3 用人话解释publicPath 场景说明 每次打包build完后 都单独生成一个 dist文件夹
  • HTML基于mvc的项目实例,一个简单MVC5 + EF6示例分享

    本文所使用的软件及环境 Visual Studio Ultimate 2013 MVC5 EF6 NET Framework 4 5 LocalDB Windows 7 x64 Professional 说明 1 在EF Entity Fr
  • android的消息处理机制(图+源码分析)——Looper,Handler,Message

    http www cnblogs com codingmyworld archive 2011 09 14 2174255 html
  • 2019下半年上午题

    2019下半年上午题 b 选a c 最后统一单位 计算需要多少片芯片 流水线 也就是 对于这一道题 c ssl 安全套接层 https 安全通道 PGP 电子邮件加密 d b a b b 受委托方和委托方 c d 试题是考试系统中的一部分
  • 软件测试分享15个适合练手的项目【金融/银行/商城/电商/医药......】

    还愁没有练手的项目 我已经给你准备好了 需要评论区留下你的想法吧 1 引言 1 1 文档版本 版本 作者 审批 备注 V1 0 XXXX 创建测试方案文档 1 2 项目情况 项目名称 XXX 项目版本 V1 0 项目经理 XX 测试人员 X
  • 安川机器人io对照表_安川机器人信号

    逻辑编号针号 名称 信号 逻辑编号 针号 名称 信号 20010 B1 外部启动 in 20024 B1 in 20011 A1 in 20025 A1 in 20012 B2 调出主程序 in 20026 B2 抓手 搬运防碰撞 in 2
  • SVD实现数字水印

    SVD方法的基本原理是将水印嵌入到原始图像的奇异值中 具体流程如下 1 设输入图像为mxn矩阵A 对其进行SVD分解 2 设水印图像为mxn矩阵W 嵌入到到原图像奇异值中S aW a为加权系数 对其进行SVD分解的到含有水印的奇异值 3 用
  • Nginx SSL模块配置提供HTTPS支持(Ngx_http_ssl_module)

    Ngx http ssl module 此模块为Nginx提供HTTPS支持 官方文档 http nginx org en docs http ngx http ssl module html 相关指令 ssl on off SSL功能启用
  • 作为一个上班族,靠Python副业兼职,也能月入1W+

    不知道大家从事的是IT行业还是其他行业 想通过Python兼职首先就需要掌握这项专业技能 如果有Python技术基础 那能兼职的项目可就多了 我靠Python做兼职已经有三四年了 见过身边很多朋友同事陆续学Python 有学成的 也有中途放
  • python错误与异常、调试

    错误 语法错误 逻辑错误 系统错误 异常 程序执行过程中出现的未知错误 语法和逻辑都是正常的 程序业务逻辑不完善引起的程序漏洞 错误 与 异常的区别 异常可以被捕获和处理 错误一般是编码错误 逻辑错误 系统错误 常见的异常类型 除零类型 名
  • vue环境配置文件

    配置文件 在vue项目目录下 我们可以看到诸如package json gitignore package lock json等等能配置项目的结构 引用的库 运行的方式 版本控制等等的都称为配置文件 2 环境配置文件就是能根据项目运行的环境
  • MATLAB数字图像处理(三)——图像轮廓提取与边缘检测

    文章目录 二值图像轮廓提取 灰度图像边缘检测 含噪图像边缘检测 均值滤波函数 二值图像轮廓提取 根据掏空内部点算法 运用Matlab编程实现二值图像的轮廓提取 以二值图像circles为例 I imread circles png subp
  • 几何变换详解

    几何变换详解 在三维图形学中 几何变换大致分为三种 平移变换 Translation 缩放变换 Scaling 旋转变换 Rotation 以下讨论皆针对DirectX 所以使用左手坐标系 平移变换 将三维空间中的一个点 x y z 1 移