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)


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


版权声明:本文为博主原创文章,未经博主允许不得转载。

OpenGL学习总结(三)

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

glm

GLM和MVP矩阵操作速记 连续工作15小时,累了,睡觉。 #include "glm/glm.hpp" #include "glm/gtc/matrix_tra...
  • asfdasfdsf
  • asfdasfdsf
  • 2014年06月11日 13:03
  • 2493

OpenGL 矩阵变换GLM库的使用

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

OpenGL Mathematics(GLM) - 几何数学库

OpenGL Mathematics(GLM) - 几何数学库 2012-05-23 09:53:56 标签:glm c++  由于C/C++标准库中没有几何数学库,这样造成在开...
  • oMingZi12345678
  • oMingZi12345678
  • 2014年12月30日 23:29
  • 1668

OPENGL 矩阵坐标系变换

主要内容总结自文章http://www.opengl-tutorial.org/cn/beginners-tutorials/tutorial-3-matrices/ 所谓的坐标系变换就是调用某个函...
  • hyszyl
  • hyszyl
  • 2016年02月02日 21:37
  • 1666

opengl 矩阵变换

opengl 矩阵变换
  • cloud95
  • cloud95
  • 2014年07月16日 14:31
  • 8182

【Modern OpenGL】转换 Transformations

我们已经学会了怎样创建对象,并且学会利用着色或者纹理使他们呈现出表面细节,但是它们还并不是十分有趣,因为它们只是静止的对象。我们虽然可以通过在每帧中改变它们的顶点坐标值挥着通过重新配置他们的缓存区使它...
  • aganlengzi
  • aganlengzi
  • 2015年12月28日 20:09
  • 1434

OpenGL学习总结(三)

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

【Modern OpenGL】摄像机系统 Camera

在前面的教程中,我们讨论了视口矩阵和我们可以怎样利用视口矩阵让绘制的场景移动(我们在上次教程中成功将那个二维平面稍稍向后移动了一点)。OpenGL本身对摄像机这个概念并不熟悉,但是我们可以通过移动场景...
  • aganlengzi
  • aganlengzi
  • 2016年01月02日 15:23
  • 2224

孙其功陪你学之——OpenGL加载OBJ文件库glm.c和glm.h

1。OBJ文件 OBJ文件中包含丰富的3D对象类型,而且文档 的说明很详细。因此熟悉OBJ文件的格式对于 理解其他3D文件的格式也是很有用的。 下面我们举例说明OBJ文件的格式: 例1...
  • a350203223
  • a350203223
  • 2013年08月18日 14:29
  • 5576
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MFC Opengl 使用glm数学库进行空间坐标系矩阵变换
举报原因:
原因补充:

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