移植不知道三维物体的旋转平移缩放和矩阵的关系。找到这篇文章借鉴一下。

转自:https://blog.csdn.net/ALLENJIAO/article/details/80348362

怎么平移一个三维空间中的点

我们应该怎么平移一个三维空间中的点呢?答案很简单,我们只需要对这个点的坐标中的每个分量(x,y,z)和对应轴上的平移距离相加即可。 
例如,点p1(x1,y1,z1)在X轴Y轴以及Z轴上分别平移Δx,Δy,Δz到新的点p2(x2,y2,z2),那么我们只需在坐标对应的分量上加上这些增量就可以确定点p2的坐标了。 
x2 = x1 + Δx 
y2 = y1 + Δy 
z2 = z1 + Δz

很简单是吗?那么接下来再让我们来看一看另一种变换:旋转。

再来旋转一个点

旋转相比较平移来说,会略显复杂一些。因为我们需要指明以下几个方面来描述一个旋转: 
旋转轴 
旋转方向 
旋转角度

在这里,我们假设点p需要绕Z轴顺时针旋转β度。如这个很难看的图所示,我们的点P1(x1,y1,z1)以Z轴位轴顺时针旋转β度之后来到了点P2(x2,y2,z2)。接下来,让我们假设原点到P1的距离位L,且P1和Y轴之间的夹角位α,那么根据三角函数公式我们就可以计算出P1点的具体坐标了: 
x1 = L·sinα 
y1 = L·cosα

由于是绕Z轴旋转,因此z坐标不变,因此此处不考虑。 
同样根据三角函数公式,我们可以继续计算出P2的具体坐标: 
x2 = L·sin(α + β) 
y2 = L·cos(α + β)

再让我们回忆一下中学时代的几何数学的内容,对青春的回忆又把我们带回了课堂上老师声嘶力竭向我们传授的内容——两角和与差: 
cos(α+β)=cosα·cosβ-sinα·sinβcos(α-β)=cosα·cosβ+sinα·sinβsin(α+β)=sinα·cosβ+cosα·sinβsin(α-β)=sinα·cosβ-cosα·sinβ

回忆起老师传授给我们的知识之后,接下来结合P1的坐标表示形式我们就可以把P2的坐标换一个表示形式了。 
x2 = L·(sinα·cosβ+cosα·sinβ) = cosβ·x1 + sinβ·y1 
y2 = L·(cosα·cosβ-sinα·sinβ) = cosβ·y1 - sinβ·x1 
z2 = z1

因此,在已知P1点坐标以及旋转角度β的情况下,我们就可以根据以上公式分别求出P2点坐标的各个分量。如果再结合上一小节中平移一个点的公式来看,我们可以发现似乎并不需要矩阵,而仅仅通过两组表达式就能实现坐标的变换。但是……

带来便捷的矩阵

当然,从理论上讲我们的确可以只通过数学公式就能实现变换,但实际的情况却是在变换十分复杂时,直接使用数学表达式来进行运算也是相当繁复的。因此,在现实中常常使用矩阵(由m × n个标量组成的长方形数组)来表示诸如平移、旋转以及缩放等线性变换。而另一个更有趣的事实是,当两个变换矩阵A和B的积为P=AB时,则变换矩阵P相当于A和B所代表的变换。举一个例子,若A为旋转矩阵,B为平移矩阵,则矩阵P就能够实现旋转和平移变换。不过需要注意的是,矩阵乘法不符合交换律,因此AB和BA并不相等。说了这么多,我们似乎还是没有回答为什么三维空间需要一个4×4矩阵来实现变换呢?下面我们就带着这个问题,分别看看3×3矩阵和4×4矩阵的使用吧。

矩阵和旋转

首先,我们先来看一个矩阵乘以一个三维矢量的算式:可以看到该矩阵为一个3×3的矩阵,矩阵的右侧是点P1的坐标,而矩阵的左侧则是点P2的坐标。根据这个表达式,我们可以求出x2、y2、z2的值: 
x2 = a·x1 + b·y1 + c·z1 
y2 = d·x1 + e·y1 + f·z1 
z2 = g·x1 + h·y1 + i·z1

为了将矩阵等式和之前小节的数学表达式联系起来,下面我们就将旋转表达式和该矩阵等式做一个对比。 
x2 = a·x1 + b·y1 + c·z1x2 = cosβ·x1 + sinβ·y1 
y2 = d·x1 + e·y1 + f·z1y2 = cosβ·y1 - sinβ·x1 
z2 = g·x1 + h·y1 + i·z1z2 = z1

通过对比x2,我们可以发现a=cosβ,b=sinβ,c=0;对比y2,也可以发现d=-sinβ,e=cosβ,f=0;最后对比z2,可以确定g=0,h=0,i=1;将这个结果带入到之前的矩阵中,我们的等式就可以变成下面这个样子:也就是说,通过这个3×3的变换矩阵,我们就已经实现了三维空间的旋转变换。那么为什么还需要使用4×4矩阵呢?

搞不定的平移,4×4矩阵来救场

我们已经通过一个3×3矩阵搞定了旋转变换,显然如果这个3×3矩阵真的是完美的解决变换的方案的话,那么它显然也必须要适合于其他的变换,例如平移。但是它到底能否满足平移的需求呢?下面我们还是通过对比矩阵等式和数学表达式的方式,来寻找答案。 
x2 = a·x1 + b·y1 + c·z1x2 = x1 + Δx 
y2 = d·x1 + e·y1 + f·z1y2 = y1 + Δy 
z2 = g·x1 + h·y1 + i·z1z2 = z1 + Δz

通过对比,我们发现平移和旋转之间很有趣的一个区别,那就是平移的表达式中带有常量Δx,而无论是旋转的表达式还是矩阵等式中都不存在这样一个常量能够与之对应。那么问题就来,我们没有办法使用3×3的矩阵来表示平移。这个问题该如何解决呢?答案其实很简单,那就是使用4×4矩阵来实现。但是随之而来的一个问题就是如何让一个三维坐标和一个4×4的矩阵相乘呢?

齐次坐标

为了解决三维矢量和4×4矩阵相乘的问题,我们机智的为三维矢量添加了第四个分量,这样之前的三维矢量(x,y,z)就变成了四维的(x,y,z,w),这样由4个分量组成的矢量便被称为齐次坐标。需要说明的是,齐次坐标(x,y,z,w)等价于三维坐标(x/w,y/w,z/w),因此只要w分量的值是1,那么这个齐次坐标就可以被当作三维坐标来使用,而且所表示的坐标就是以x,y,z这3个值为坐标值的点。因此,为了和4×4矩阵相乘,我们的P1点坐标就变成了(x1,y1,z1,1)。而矩阵等式也变成了下面这个样子:我们再将这个新的矩阵等式和平移的数学表达式做一番对比: 
x2 = a·x1 + b·y1 + c·z1 + dx2 = x1 + Δx 
y2 = e·x1 + f·y1 + g·z1 + hy2 = y1 + Δy 
z2 = i·x1 + j·y1 + k·z1 + lz2 = z1 + Δz 
1 = m·x1 + n·y1 + o·z1 + p

通过对比x2,我们可以发现a=1,b=0,c=0,d=Δx;对比y2,也可以发现e=0,f=1,g=0,h=Δy;再对比z2,可以确定i=0,j=0,k=1,l=Δz;最后还可以根据表达式求出m=0,n=0,o=0,p=1;这样,我们就求出了我们的4×4的平移矩阵:

总结

写到这里,不知各位是否还记得之前在介绍矩阵乘法的时候我有提到过两个变换矩阵A和B的积P=AB,相当于A和B所代表的变换。事实上在游戏编程中,常常需要把一连串的变换预先通过计算成为单一矩阵,所以就不能即存在3×3的矩阵又存在4×4的矩阵。而将3×3矩阵拓展成4×4矩阵还是相对更加容易的。这样,就通过一个4×4矩阵整合了平移矩阵、旋转矩阵。

三维坐标要建一个4*4的矩阵?平移 旋转 缩放相关推荐

  1. 三维坐标要建一个4*4的矩阵?

    怎么平移一个三维空间中的点 我们应该怎么平移一个三维空间中的点呢?答案很简单,我们只需要对这个点的坐标中的每个分量(x,y,z)和对应轴上的平移距离相加即可.  例如,点p1(x1,y1,z1)在X轴 ...

  2. 三维坐标 偏转_三维坐标变换原理-平移, 旋转, 缩放

    给定一个二维点(x, y),那么形如(kx, ky, k)的所有三元组就都是等价的,它们就是这个点的齐次坐标(homogeneous).齐次坐标就是将一个原本是n维的向量用一个n+1维向量来表示,是指 ...

  3. python运用三角学通过方位角仰角与距离计算三维坐标

    00:本文目录 01:概念辨析 01.01:方位角.仰角与距离 01.02:三维坐标 02:目标 03:资源 03.01:准备 03.02:文献参考 04:开始编程 05:尾声 05.01: 05.0 ...

  4. matlab怎么画三维坐标的二维图,excel怎么画二维坐标表格图(如何在excel中绘制三维坐标系?)...

    在excle中怎么把二维图形变成三维图形 你说的是图表吗,如果是的话就这样操作 excel2007以上版本:选中图表-点击设计选项卡-最左面有更改图表类型-选择合适的类型-确定 excel2003也是 ...

  5. 静止的单摄像机无法得到像点的三维坐标详解

    我们知道在机器视觉中通常要使用的搭建的视觉测量系统对一个物体的尺寸.形变.以及三维形貌进行测量.一般按照摄像机的个数以及组成部分分为三类测量方法.分别为单目测量.双目(大于2为多目)测量.以及结构光测 ...

  6. 三维坐标转经纬度_Three.js 地理坐标和三维空间坐标的转换

    编者按:本文作者高峰,360奇舞团前端工程师,W3C性能工作组/WOT工作组成员. 一.引言 在实现3D地球时,球面是通过地理贴图渲染的.所以我们所说的地理坐标和三维空间坐标的转换,是指将地理贴图上的 ...

  7. OpenGL 获取当前屏幕坐标对应的三维坐标

    转自原文 OpenGL 获取当前屏幕坐标对应的三维坐标,使用很简单glu库中的一个函数 #include <GL/glut.h> #include <stdlib.h> #in ...

  8. 利用双目摄像头来进行空间点的三维坐标定位

    一.三维重建概述 三维重建主要是研究如何从得到的匹配点中计算出相机的投影矩阵(如果是外部标定的话,就是求出相机的外部参数)以及如何计算出匹配点的三维坐标. 目前研究的进展与之还相差较远.研究人员为了能 ...

  9. 三点法求三维坐标精度误差评估实验

    1. 实验目的 1) 对实验做一个系统性的误差评价. 2) 验证本实验的精度能否达到测量空间角的要求. 2.  实验原理 参考论文[1]进行误差评估实验,但是由于论文中的评定指标并不都适合本次实验,所 ...

最新文章

  1. 产品经理怎么样用图表传达数据信息(多图)
  2. 重磅!2020 中国高校毕业生月薪排名:清华第一,24所高校过万
  3. java获取文件的所有者_java获取文件夹下所有文件的名称 | 星尘
  4. jquery and event
  5. C语言实现段树segment tree(附完整源码)
  6. 如何用Java代码解析json
  7. 开发技术--设计模式
  8. iOS上传图片和视频(base64和file)
  9. WPF e.Systemkey的一个坑
  10. 基于模型与不基于模型的深度增强学习_CVPR2018: 基于时空模型无监督迁移学习的行人重识别...
  11. IBM计划收购Resilient Systems以扩大安全事件响应能力
  12. Ruby / Rails代码气味基础01
  13. 公式编辑器中如何修改字体?
  14. IOC在墨者革离中的理解
  15. SEO关键词排名优化做到百度首页的核心操作
  16. 图像的平均梯度AG,信息熵IE,峰值信噪比PSNR,平均值,SSIM(matlab)
  17. D-OJ刷题日记:将十进制数转换成八进制数 题目编号:545
  18. 微软rdp服务器,微软远程桌面 UWP 版本重写:使用 RDP 引擎,支持 ARM64
  19. 理解Fourier变换,Laplace变换和Z变换的几个基本点
  20. one-hot和Embedding

热门文章

  1. 根据交谈和3D面部表情判断抑郁症
  2. linux jnlp显示异常,Web启动异常 JNLP
  3. 论hr面试问题:离职原因
  4. 安卓miracast花屏_手机投屏电视频繁断开的解决办法
  5. 室内外地图切换(室内基于ibeacons三点定位)
  6. 开涛的博客 spring
  7. NLP学习-1--语料预处理与向量空间,语料格式
  8. 基因组+转录组助力油菜种子油含量自然变异的遗传研究
  9. Python是什么意思?一篇文章给你讲清楚!
  10. 你的独立思考能力正在被它吞噬掉