【OpenGL】平移、旋转和缩放矩阵推导
【OpenGL】平移、旋转和缩放矩阵推导
平移
将点p(x,y,z)平移到p’(x’,y’,z’),在X轴、Y轴、Z轴三个方向上平移的距离分别为Tx,Ty,Tz,其中Tz为0(二维平面的平移),如图3.19所示。那么在坐标的对应分量上,直接加上这些T值,就可以确定p’的坐标了,如等式3.1所示。
比较等式3.5和等式3.1
这里第二个等式的右侧有常量项Tx,第一个等式没有,这意味着我们无法通过使用一个3X3的矩阵来表示平移。为了解决这个问题,我们可以使用一个4X4的矩阵,以及具有第四个分量(通常被设为1.0)的矢量。也就是说,我们假设点p的坐标为(x,y,z,1),平移以后的点p’的坐标为(x’,y’,z’,1),如等式3.8所示:
根据最后一个式子1=mx+ny+oz+p,很容易求出系数m=0,n=0,o=0,p=1。这些方程都有常数项d、h、l和p,看上去比较适合等式3.1(因为等式3.1中也有常数项)。等式3.1(平移)如下所示,我们将它与等式3.9进行比较:
比较x’,可知a=1,b=0,c=0,d=Tx;类似地,比较y’,可知e=0,f=1,g=0,h=Ty;比较z’,可知i=0,j=0,k=1,l=Tz。这样,你就可以写出来表示平移的矩阵,如等式3.10所示:
旋转
假设点p(x,y,z)绕Z轴旋转β角度以后变为了点p’(x’,y’,z’):首选旋转是绕Z轴进行的,所以z坐标不会变;在图3.22中,r是从原点到点p的距离,而α是X轴旋转到点p的角度。用这两个变量计算出点p的坐标,如等式3.2所示。
类似地,你可以使用r,α,β来表示点p’的坐标:
通过三角函数两角和公式
可得:
最后,将等式3.2代入上式,消除r和α,可得等式3.3。
通过等式3.4可得等式3.5
将等式3.5与等式3.3进行比较:
这样的话,如果设a=cosβ,b=-sinβ,c=0,那么这两个等式就完全相同了。在看y’:
这样的话,设d=sinβ,e=cosβ,f=0,这两个等式也就完全相同了。最后关于z’的等式更简单,设g=0,h=0,i=1即可。
将这些结果带入等式3.4中,得到等式3.7:
将旋转矩阵从一个3X3矩阵变为一个4X4矩阵,只需要将方程3.3和方程3.9比较一下即可。
例如,当你通过比较x’=xcosβ-ysinβ与x’=ax+by+cz+d时,可知a=cosβ,b=-sinβ,c=0,d=0。以此类推,求得y’和z’等式中的系数,最终得到4X4的旋转矩阵,如等式3.11所示:
缩放
仍然假设最初点p,经过缩放操作以后变成了p’。
假设在三个方向X轴,Y轴,Z轴的缩放因子Sx,Sy,Sz不相关,那么有:
将上式与等式3.9比较,可知缩放操作的变换矩阵:
【OpenGL】平移、旋转和缩放矩阵推导相关推荐
- 平移、旋转和缩放矩阵推导
平移 将点p(x,y,z)平移到p'(x',y',z'),在X轴.Y轴.Z轴三个方向上平移的距离分别为Tx,Ty,Tz,其中Tz为0(二维平面的平移),如图3.19所示.那么在坐标的对应分量上,直接加 ...
- 坐标的平移,旋转,缩放矩阵
1.二维坐标的平移,旋转.缩放矩阵 平移矩阵M: 1 0 0 0 1 0 dx dy 1 D2 = D1*M 旋转矩阵M 设某点与原点连线和X轴夹角为b度,以原点为圆心, ...
- 3D坐标系中 点 的 平移、旋转和缩放
基础概念 矩阵 一个m*n矩阵 是 一个m行.n列的矩形数组. 如果一个矩阵只包含单行 或 单列, 这样的矩阵 为 行矩阵或 列矩阵,又叫行向量或列向量 矩阵的乘法: 点 空间中的点,我们通常用一个 ...
- 三维空间中的几何变换-平移旋转缩放
前言 前段时间由于项目需要,深入学习了下图形几何变换,主要是绕任意轴旋转部分(其他的已有一定基础),现记录学习笔记. 文章内容部分引用并参考了下面的博客: http://netclass.csu.ed ...
- Qt quick基础2(包含平移旋转放缩以及qml控件大写开头啊)
Qt quick基础2(包含平移旋转放缩以及qml控件大写开头啊) 目录 Qt quick基础2(包含平移旋转放缩以及qml控件大写开头啊) 前言 简单的平移.旋转和放缩 其他元素的一些基本使用 qm ...
- 二维图形学的变换-平移、旋转、缩放 OpenGL
这里实现的是多点画多边形,然后把这个多边形进行二维的变换. 首先,多点画多边形,为了方便起见,我直接调用了Opengl的库函数.其次,就是如何进行多边形的二维变换.在这里我有两种方法.第一种是直接根据 ...
- 三维坐标要建一个4*4的矩阵?平移 旋转 缩放
移植不知道三维物体的旋转平移缩放和矩阵的关系.找到这篇文章借鉴一下. 转自:https://blog.csdn.net/ALLENJIAO/article/details/80348362 怎么平移一 ...
- 【计算机图形学】c++ OpenGL 二维变换(包括多边形绘制、平移、旋转及缩放)
运行结果演示 源代码 // 二维变换.cpp : 定义控制台应用程序的入口点. //#include "stdafx.h" #include<GL/glut.h> #i ...
- 计算机图形与OpenGL学习五(二维几何变换1.平移、旋转、缩放)
二维几何变换(平移.旋转.缩放) 本章涉及数学变换比较多,代码是次要的,数学理论可自己推导一下. [二维平移] 通过将二维量加到一个点的坐标上来生成一个新的坐标位置,可以实现一次平移.将平移距离加到原 ...
最新文章
- 3D视觉创新应用(三维重建)竞赛作品系列——多楼层室内环境下的三维几何重建
- Keras Bug 解决方法 Exception ignored in: bound method BaseSession.__del__ of
- 从PPT到Word,用Python轻松实现办公自动化
- 鸿蒙开发板能干什么,【鸿蒙开发板试用报告】用OLED板实现FlappyBird小游戏(中)...
- spring事务管理-xml配置aop事务(重点)
- mysql 随机update_MySQL随机查询数据与随机更新数据
- vue里实现同步执行方法_vue中的watch方法 实时同步存储数据
- 好看的UI商城源码已扫码无后门无加密
- ubuntu16.04下在TensorFlow中实现快速风格迁移
- ionic 幻灯指令 ion-slide-box
- tp3.2 URL模式
- EasyExcel导入Excel和导出Excel教程
- C4D中常用材质的创建与赋予
- GitHub上14个屌炸天的Java进阶教程、面试真题项目,建议收藏!
- 什么是智能DNS云解析?云解析如何实现智能解析效果?
- neo4j java 模糊搜索,Neo4j 使用cypher语言进行查询
- (附源码)计算机毕业设计SSM基于的楼盘销售系统的设计与实现
- Chrome HackBar工具下载
- 操作系统第五章——进程同步
- Maven安装与配置详解、多镜像节点的配置