MFC Opengl 使用glm数学库进行空间坐标系矩阵变换

原创 2016年11月24日 22:47:24

       求一个空间坐标系的点在另一个坐标系中的点一直是比较麻烦的一件事情,最近做项目时,恰好需要实现这样一个功能,也是想了挺久,最后实现了点在不同空间坐标系中的转换。功能是通过矩阵进行实现的,数学库用的是glm库。

       问题:已知局部坐标系Local中的一个点A的坐标为Pt_local(X,Y,Z),那么,如何才能求得这个点A在世界坐标系World中的坐标表示Pt_world(X',Y',Z')。

       解决方案:我们求得一个从世界坐标系World转换到局部坐标系Local的转化矩阵M,满足M*Pt_world = Pt_local,然后Pt_world = inverse(M)*Pt_local,其中 inverse(M)为M的逆矩阵。

      其实就是说:我们对世界坐标系World求两个旋转矩阵,第一个旋转矩阵M1为World的Z轴向量转到新的坐标系Local的Z轴向量的矩阵,第二个旋转矩阵M2为World的Y轴向量转到新的坐标系Local的Y轴向量的矩阵。M = M2*M1,(注意:矩阵左乘),然后对M求逆,即可得到同一个点在不同坐标系中的坐标表示。


       下面的代码为:局部坐标系Local(X轴(-1,-1,2),Y轴(-1,1,0),Z轴(1,1,1)<注意:这里Local的坐标系表示是在世界坐标系中>中的点(0, 0, sqrt(3))<注意:这个点表示的是局部坐标系中的坐标>转换到世界坐标系World(X轴(1,0,0),Y轴(0,1,0),Z轴(0,0,1))中的点的测试过程:


        glm::mat4 M1 = glm::orientation(glm::normalize(glm::vec3(0, 0, 1)), glm::normalize(glm::vec3(1, 1, 1)));、

         //M1:从glm::vec3(0, 0, 1)旋转到glm::normalize(glm::vec3(1, 1, 1)的旋转矩阵
glm::mat4 M2 = glm::orientation(glm::normalize(glm::vec3(0, 1, 0)), glm::normalize(glm::vec3(-1, 1, 0)));

         //M2:从glm::vec3(0, 1, 0)旋转到glm::vec3(-1, 1, 0)的旋转矩阵
glm::mat4 M = M2*M1;//最终的旋转矩阵

        glm::vec4 Pt_local = glm::vec4(0, 0, sqrt(3), 1);//注意:Pt_local (0, 0, sqrt(3))代表的是局部坐标系的表示
glm::vec4 Pt_result = glm::inverse(M)*Pt_local ;//求旋转矩阵的逆矩阵,左乘向量
glm::vec3 Pt_world = glm::vec3(Pt_result .x, Pt_result .y, Pt_result .z);

         //理论测试结果:世界坐标系中的表示Pt_world (1,1,1)


       希望对大家有所帮助,有什么问题可以给我留言,大家共同进步。


版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011450490/article/details/53326953

用VC++编制FTP客户端应用程序

用VC++编制FTP客户端应用程序  FTP协议将使用两条单独的TCP连接,一条专用于发送FTP命令,另一条则专用于传递数据。初始建立连接时,服务器在21号端口上接收来自客户端的命令连接。当需要传送数...
  • ghj1976
  • ghj1976
  • 2001-08-20 11:36:00
  • 1508

OpenGL 矩阵变换(讲的太好了~!)

Overview 几何数据——顶点位置,和标准向量(normal vectors),在OpenGL 管道raterization 处理过程之前可通过顶点操作(Vertex Operation)和基本...
  • lyx2007825
  • lyx2007825
  • 2013-04-12 15:39:59
  • 87214

OpenGL学习总结(三)

构造摄像机/观察矩阵1、摄像机与观察空间 在总结二中曾经提到过,局部空间要经过模型矩阵、观察矩阵、投影矩阵这三个变换矩阵后才能到达裁剪空间,而模型矩阵和投影矩阵都已经介绍过了,只有观察矩阵没有被提及...
  • xiewenzhao123
  • xiewenzhao123
  • 2017-01-18 11:51:03
  • 767

OpenGL视角LooAt及Perspective理解

在: http://blog.csdn.net/yulinxx/article/details/59538755 的基础上,修改 main.cpp理解 glm::perspective 和 ...
  • yulinxx
  • yulinxx
  • 2017-09-13 01:26:30
  • 485

OpenGL学习脚印: 坐标变换过程(vertex transformation)

写在前面 前面几节分别介绍了模型变换,视变换,以及给出了投影矩阵和视口变换矩阵的推导,本节从全局把握一遍OpenGL坐标转换的过程,从整体上认识坐标变换过程。相关矩阵的数学推导过程请参考前面几...
  • ziyuanxiazai123
  • ziyuanxiazai123
  • 2016-06-06 15:27:59
  • 10320

OpenGL 矩阵变换GLM库的使用

GLM和MVP矩阵操作速记 连续工作15小时,累了,睡觉。include “glm/glm.hpp”include “glm/gtc/matrix_transform.hpp”若未特别说明,以下示例...
  • qq_23225317
  • qq_23225317
  • 2017-03-25 16:03:25
  • 5002

opengl 矩阵变换

opengl 矩阵变换
  • cloud95
  • cloud95
  • 2014-07-16 14:31:23
  • 8708

数学基础 —— 向量旋转到另一个向量

如上图 已知V,U向量,如何求V逆时针旋转到U的角度? U逆时针旋转到V的度数? (1)单位化V,U (2)U,V点乘获取到一个值A (3)通过反三角函数ACos 获取到弧度值,然后在转为角度值B...
  • keng_s
  • keng_s
  • 2016-08-07 18:46:38
  • 2087

计算两向量的旋转角

向量的点乘和叉乘都是很有用的数学工具,不过他们也有局限性。关键是向量点乘可以得到两个向量之间的夹角, 而不是旋转角,这个角度是没有方向的,范围是[0-pi], 而这往往不是我们想要的, 实际问题中我们...
  • tanmengwen
  • tanmengwen
  • 2012-09-21 13:54:38
  • 1780

OPENGL 矩阵坐标系变换

主要内容总结自文章http://www.opengl-tutorial.org/cn/beginners-tutorials/tutorial-3-matrices/ 所谓的坐标系变换就是调用某个函...
  • hyszyl
  • hyszyl
  • 2016-02-02 21:37:26
  • 2079
收藏助手
不良信息举报
您举报文章:MFC Opengl 使用glm数学库进行空间坐标系矩阵变换
举报原因:
原因补充:

(最多只允许输入30个字)