给定一个二维点(x, y),那么形如(kx, ky, k)的所有三元组就都是等价的,它们就是这个点的齐次坐标(homogeneous)。齐次坐标就是将一个原本是n维的向量用一个n+1维向量来表示,是指一个用于投影几何里的坐标系统,如同用于欧氏几何里的笛卡儿坐标一般

矩阵的乘法

矩阵的乘法运算,阮一峰老师写的比较清楚,具体可以看 这里

矩阵的线性变换

矩阵的线性变换就是从一个线性空间

 的某一个点跃迁到另一个线性空间

 的另一个点的运动。也就是说是一个点不仅可以变换到同一个线性空间中的另一个点,而且可以变换到另一个线性空间中的另一个点去

矩阵和线性变换之间的关系: 矩阵本身描述了一个坐标系,矩阵与矩阵的乘法描述了一个运动。换句话说:如果矩阵仅仅自己出现,那么他描述了一个坐标系,如果他和另一个矩阵或向量同时出现,而且做乘法运算,那么它表示运动(线性变换)

数学表述为:

, 即矩阵 M 描述了向量

 到向量

 的运动

如将三维坐标D1经过矩阵M变换到坐标D2, 就可以表达为:

坐标变换

平移

假设在三维空间坐标系中, 点

(x, y, z)在x方向移动了dx, y方向移动dy, z方向移动了dz。到达点

(X, Y, Z), 则X = x + dx

Y = y + dy

Z = z + dz复制代码

如上所述, 则存在一个平移矩阵M,使得

,但是在纯粹的三维矩阵中,我们永远也找不到这样一个矩阵M使条件成立。此时可以借助齐次坐标。齐次坐标规定用一个n+1维度的向量来表示原来的n维向量. 此时将

(x, y, z) 表示为(x, y, z, 1), 则可以得到矩阵M

验证: 假设

(4, 8, 2), x方向移动了dx, y方向移动dy, z方向移动了dz, 则

(4+dx, 8+dy , 2+dz)

缩放

假设在三维空间坐标系中, 点

(x, y, z)在x方向缩放了Sx, y方向缩放了Sy, z方向缩放了Sz。到达点

(X, Y, Z), 则X = x * Sx

Y = y * Sy

Z = z * Sz复制代码

同理,缩放矩阵为

旋转

矩阵的旋转比较复杂,需要涉及到三角函数。 点

(x, y, z)绕X轴旋转θ度时, 到达点

(X, Y, Z), 则X = X

Y = y*cosθ - y*sinθ

z = z*sinθ + z*cosθ复制代码

矩阵M为

绕Y轴旋转时

绕Z轴旋转时

欧拉变换是绕3个旋转轴的旋转矩阵的乘积

示例分析

在webgl中, 在矩阵变换常用的库glmatrix中有计算平移矩阵的translate方法/**

* Translate a mat4 by the given vector

*

* @param {mat4} out the receiving matrix

* @param {mat4} a the matrix to translate

* @param {vec3} v vector to translate by

* @returns {mat4} out

*/function translate(out, a, v) {

var x = v[0],

y = v[1],

z = v[2];

var a00 = void 0,

a01 = void 0,

a02 = void 0,

a03 = void 0;

var a10 = void 0,

a11 = void 0,

a12 = void 0,

a13 = void 0;

var a20 = void 0,

a21 = void 0,

a22 = void 0,

a23 = void 0; if (a === out) {

out[12] = a[0] * x + a[4] * y + a[8] * z + a[12];

out[13] = a[1] * x + a[5] * y + a[9] * z + a[13];

out[14] = a[2] * x + a[6] * y + a[10] * z + a[14];

out[15] = a[3] * x + a[7] * y + a[11] * z + a[15];

} else {

a00 = a[0];a01 = a[1];a02 = a[2];a03 = a[3];

a10 = a[4];a11 = a[5];a12 = a[6];a13 = a[7];

a20 = a[8];a21 = a[9];a22 = a[10];a23 = a[11];

out[0] = a00;out[1] = a01;out[2] = a02;out[3] = a03;

out[4] = a10;out[5] = a11;out[6] = a12;out[7] = a13;

out[8] = a20;out[9] = a21;out[10] = a22;out[11] = a23;

out[12] = a00 * x + a10 * y + a20 * z + a[12];

out[13] = a01 * x + a11 * y + a21 * z + a[13];

out[14] = a02 * x + a12 * y + a22 * z + a[14];

out[15] = a03 * x + a13 * y + a23 * z + a[15];

} return out;

}复制代码

通常使用translate方法来创建一个平移矩阵, 之后再shader中便可以通过这个平移矩阵来计算gl_Position的值。 通过上面的结果我们知道平移矩阵由最后四位数决定, 所以只需要计算数组的最后四位数即可。 根据矩阵的运算法则, 即可得到结果。

通常如果在webgl想创建一个平移矩阵, 可以使用下面的方式。var translateMatrix = mat4.create(); //创建单位矩阵

mat4.translate(translateMatrix, translateMatrix, vec3.fromValues(dx, dy, dz));复制代码

得到平移矩阵后,传递到顶点shader中与需要计算的点相乘即可得到目标点的坐标。

三维坐标 偏转_三维坐标变换原理-平移, 旋转, 缩放相关推荐

  1. 三维坐标 偏转_三维坐标下的旋转

    三维坐标的旋转有以下几种常见的表示形式:旋转向量,旋转矩阵,欧拉角,四元数,下面对这四种表示形式及其之间的转换进行介绍 旋转向量 通常为3x1的列向量,向量方向即为旋转轴,向量的模表示绕轴逆时针旋转的 ...

  2. 三维坐标 偏转_三维坐标系旋转

    在做单目三维位姿估计(即估计目标物相对相机的姿态或相机相对目标物的姿态)时会用到solvepnp函数, 函数原型为:cv2.solvePnP(objectPoints, imagePoints, ca ...

  3. 三维坐标 偏转_什么是激光三维扫描?

    激光三维扫描是指通过激光三维扫描仪进行扫描,也就是激光三维扫描技术.它也被称为实景复制技术,是今年来新兴的科技. 其最主要的就是通过三维扫描仪来进行扫描,得到与实景比例1:1的点云数据,出现在电脑中, ...

  4. Unity 触屏手势控制Camera平移旋转缩放

    Unity 触屏手势控制Camera平移旋转缩放 实现思路 单点触屏,位移增量控制相机平移: 两点触屏,两点位移控制相机前后移动(缩放):两点中一点不位移控制相机绕点旋转: 实现需要的API Touc ...

  5. 三维坐标要建一个4*4的矩阵?平移 旋转 缩放

    移植不知道三维物体的旋转平移缩放和矩阵的关系.找到这篇文章借鉴一下. 转自:https://blog.csdn.net/ALLENJIAO/article/details/80348362 怎么平移一 ...

  6. python画三维坐标图像_由RGB-D图像获取三维坐标(相机坐标) Python

    由RGB-D图像获取三维坐标(相机坐标) Python 由RGB-D图像获取三维坐标(相机坐标) Python 图像数据 获取相机坐标(本处是在深度摄像头下) 相信大家最感兴趣的 肯定是代码啦 由RG ...

  7. python画三维坐标_Python中三维坐标空间绘制的实现

    在三维空间绘制点,线,面 1.绘制点 用scatter()散点绘制三维坐标点 from matplotlib import pyplot as plt from mpl_toolkits.mplot3 ...

  8. 三维空间中的几何变换-平移旋转缩放

    前言 前段时间由于项目需要,深入学习了下图形几何变换,主要是绕任意轴旋转部分(其他的已有一定基础),现记录学习笔记. 文章内容部分引用并参考了下面的博客: http://netclass.csu.ed ...

  9. osg中使用MatrixTransform来实现模型的平移/旋转/缩放

    MatrixTransform是从Transform - Group继承而来,因此可以在它的下面挂接Node对象. 通过设置其矩阵,来实现其下子节点的模型变换. -- 用局部坐标系来理解(局部坐标系又 ...

最新文章

  1. 我室友拿到了字节50万年薪,太牛逼了
  2. Android获取的状态栏高度,Android中获取状态栏高度的两种方法分享
  3. IOS高级开发 runtime(一)
  4. 使用Silverlight for Embedded开发绚丽的界面(2)
  5. FindBugs工具常见问题
  6. 第十八期:网页禁止复制粘贴怎么办?教你六招轻松搞定
  7. thinkphp-无限分类下根据任意部门获取顶级部门ID
  8. Mobile如何通过重定向来定制主页
  9. Java NIO框架 Mina、Netty、Grizzly
  10. 微型计算机原理及应用是啥,微型计算机原理及应用技术(第3版)
  11. 网络编程-在线英英词典项目
  12. 基于esp32的物联网设计
  13. 华为防火墙配置IPSEC实现二个站点间网络互通 隧道模式 CLI配置 (三)
  14. Java学习----习题练习
  15. php的implode函数的作用是,PHP函数implode介绍
  16. Windows上python读取grib2文件(不用Linux)
  17. PCB设计软件-入门
  18. 计算机无法连接网络显示错误651,电脑连接路由器提示错误651解决办法
  19. Mac上好用的连接服务器的工具(Termius)
  20. 《论语》原文及其全文翻译 学而篇13

热门文章

  1. 详解数据中心灾备切换技术
  2. 【转】【分享】5G核心网基础知识
  3. 区块链 2.0:下一个计算范式
  4. 《计算机网络》第二章:物理层(The Physical Layer)
  5. scala定义函数(六)
  6. Hadoop(五)HBase基础
  7. json 转换 java odl_JSON与JAVA数据的转换
  8. 在PowerShell中批量卸载设备
  9. Vue 3 最新进展
  10. 简单事务:.NET Core应用程序的微服务示例体系结构