openGL坐标系包括旋转,平移,缩放被塞在一个矩阵里面。

坐标系之间的转换基础是矩阵的运算。

每个矩阵代表的坐标系,就是是原点坐标系通过旋转。平移,缩放得到的坐标系。

当一个矩阵右乘一个向量或是还有一个矩阵,意味着把右边的变换。变成相对于左边的矩阵坐标系之上。

假设把一个世界坐标的X转换到一个矩阵上,我们能够矩阵右乘这个坐标:

static float multiplyMX(Matrix4* matrix, float x) {return matrix->m[0] * x + matrix->m[4] + matrix->m[8] + matrix->m[12];
}

假设把一个世界坐标Y转换到一个矩阵上。我们能够矩阵右乘这个坐标:

static float multiplyMY(Matrix4* matrix, float y) {return matrix->m[1] + matrix->m[5] * y + matrix->m[9] + matrix->m[13];
}

假设把一个世界坐标点转换到一个矩阵上,我们能够矩阵右乘这个点:

static void multiplyMV4(Matrix4* matrix, float x, float y, float z, float w, Out(Vector4* result)) {result->v[0] = matrix->m[0] * x + matrix->m[4] * y + matrix->m[8]  * z + matrix->m[12] * w;result->v[1] = matrix->m[1] * x + matrix->m[5] * y + matrix->m[9]  * z + matrix->m[13] * w;result->v[2] = matrix->m[2] * x + matrix->m[6] * y + matrix->m[10] * z + matrix->m[14] * w;result->v[3] = matrix->m[3] * x + matrix->m[7] * y + matrix->m[11] * z + matrix->m[15] * w;
}static void multiplyMV3(Matrix4* matrix, float x, float y, float z, Out(Vector3* result)) {result->v[0] = matrix->m[0] * x + matrix->m[4] * y + matrix->m[8]  * z + matrix->m[12];result->v[1] = matrix->m[1] * x + matrix->m[5] * y + matrix->m[9]  * z + matrix->m[13];result->v[2] = matrix->m[2] * x + matrix->m[6] * y + matrix->m[10] * z + matrix->m[14];
}static void multiplyMV2(Matrix4* matrix, float x, float y, Out(Vector2* result)) {result->v[0] = matrix->m[0] * x + matrix->m[4] * y + matrix->m[8] + matrix->m[12];result->v[1] = matrix->m[1] * x + matrix->m[5] * y + matrix->m[9] + matrix->m[13];
}

假设把一个世界坐标系转换到一个矩阵上,我们矩阵右乘这个矩阵:

static void multiplyMM(Matrix4* left, Matrix4* right, Out(Matrix4* result)) {result->m[0]  = left->m[0] * right->m[0]  + left->m[4] * right->m[1]  + left->m[8]  * right->m[2]  + left->m[12] * right->m[3];result->m[1]  = left->m[1] * right->m[0]  + left->m[5] * right->m[1]  + left->m[9]  * right->m[2]  + left->m[13] * right->m[3];result->m[2]  = left->m[2] * right->m[0]  + left->m[6] * right->m[1]  + left->m[10] * right->m[2]  + left->m[14] * right->m[3];result->m[3]  = left->m[3] * right->m[0]  + left->m[7] * right->m[1]  + left->m[11] * right->m[2]  + left->m[15] * right->m[3];result->m[4]  = left->m[0] * right->m[4]  + left->m[4] * right->m[5]  + left->m[8]  * right->m[6]  + left->m[12] * right->m[7];result->m[5]  = left->m[1] * right->m[4]  + left->m[5] * right->m[5]  + left->m[9]  * right->m[6]  + left->m[13] * right->m[7];result->m[6]  = left->m[2] * right->m[4]  + left->m[6] * right->m[5]  + left->m[10] * right->m[6]  + left->m[14] * right->m[7];result->m[7]  = left->m[3] * right->m[4]  + left->m[7] * right->m[5]  + left->m[11] * right->m[6]  + left->m[15] * right->m[7];result->m[8]  = left->m[0] * right->m[8]  + left->m[4] * right->m[9]  + left->m[8]  * right->m[10] + left->m[12] * right->m[11];result->m[9]  = left->m[1] * right->m[8]  + left->m[5] * right->m[9]  + left->m[9]  * right->m[10] + left->m[13] * right->m[11];result->m[10] = left->m[2] * right->m[8]  + left->m[6] * right->m[9]  + left->m[10] * right->m[10] + left->m[14] * right->m[11];result->m[11] = left->m[3] * right->m[8]  + left->m[7] * right->m[9]  + left->m[11] * right->m[10] + left->m[15] * right->m[11];result->m[12] = left->m[0] * right->m[12] + left->m[4] * right->m[13] + left->m[8]  * right->m[14] + left->m[12] * right->m[15];result->m[13] = left->m[1] * right->m[12] + left->m[5] * right->m[13] + left->m[9]  * right->m[14] + left->m[13] * right->m[15];result->m[14] = left->m[2] * right->m[12] + left->m[6] * right->m[13] + left->m[10] * right->m[14] + left->m[14] * right->m[15];result->m[15] = left->m[3] * right->m[12] + left->m[7] * right->m[13] + left->m[11] * right->m[14] + left->m[15] * right->m[15];
}

这就是利用矩阵, 把一个世界坐标系的坐标,转换到局部坐标系的方法。

那么。怎样把一个局部坐标系转换到世界坐标系呢?

这里须要得到局部坐标系相应矩阵的逆矩阵,这个矩阵包括了还原矩阵操作的变换。

然后,把逆矩阵当做左边的矩阵,去右乘局部坐标点, 我们就能够得到局部坐标变成世界坐标后的坐标。

static bool tryInvert(Matrix4* matrix, Out(Matrix4* result)) {float a0 = matrix->m[0]  * matrix->m[5]  - matrix->m[1]  * matrix->m[4];float a1 = matrix->m[0]  * matrix->m[6]  - matrix->m[2]  * matrix->m[4];float a2 = matrix->m[0]  * matrix->m[7]  - matrix->m[3]  * matrix->m[4];float a3 = matrix->m[1]  * matrix->m[6]  - matrix->m[2]  * matrix->m[5];float a4 = matrix->m[1]  * matrix->m[7]  - matrix->m[3]  * matrix->m[5];float a5 = matrix->m[2]  * matrix->m[7]  - matrix->m[3]  * matrix->m[6];float b0 = matrix->m[8]  * matrix->m[13] - matrix->m[9]  * matrix->m[12];float b1 = matrix->m[8]  * matrix->m[14] - matrix->m[10] * matrix->m[12];float b2 = matrix->m[8]  * matrix->m[15] - matrix->m[11] * matrix->m[12];float b3 = matrix->m[9]  * matrix->m[14] - matrix->m[10] * matrix->m[13];float b4 = matrix->m[9]  * matrix->m[15] - matrix->m[11] * matrix->m[13];float b5 = matrix->m[10] * matrix->m[15] - matrix->m[11] * matrix->m[14];// Calculate the determinant.float det = a0 * b5 - a1 * b4 + a2 * b3 + a3 * b2 - a4 * b1 + a5 * b0;// Close to zero, can't invert.if (fabs(det) < FLT_EPSILON) {return false;}float scalar   = 1.0f / det;// Support the case where matrix == resultresult->m[0]   = ( matrix->m[5]  * b5 - matrix->m[6]  * b4 + matrix->m[7]  * b3) * scalar;result->m[1]   = (-matrix->m[1]  * b5 + matrix->m[2]  * b4 - matrix->m[3]  * b3) * scalar;result->m[2]   = ( matrix->m[13] * a5 - matrix->m[14] * a4 + matrix->m[15] * a3) * scalar;result->m[3]   = (-matrix->m[9]  * a5 + matrix->m[10] * a4 - matrix->m[11] * a3) * scalar;result->m[4]   = (-matrix->m[4]  * b5 + matrix->m[6]  * b2 - matrix->m[7]  * b1) * scalar;result->m[5]   = ( matrix->m[0]  * b5 - matrix->m[2]  * b2 + matrix->m[3]  * b1) * scalar;result->m[6]   = (-matrix->m[12] * a5 + matrix->m[14] * a2 - matrix->m[15] * a1) * scalar;result->m[7]   = ( matrix->m[8]  * a5 - matrix->m[10] * a2 + matrix->m[11] * a1) * scalar;result->m[8]   = ( matrix->m[4]  * b4 - matrix->m[5]  * b2 + matrix->m[7]  * b0) * scalar;result->m[9]   = (-matrix->m[0]  * b4 + matrix->m[1]  * b2 - matrix->m[3]  * b0) * scalar;result->m[10]  = ( matrix->m[12] * a4 - matrix->m[13] * a2 + matrix->m[15] * a0) * scalar;result->m[11]  = (-matrix->m[8]  * a4 + matrix->m[9]  * a2 - matrix->m[11] * a0) * scalar;result->m[12]  = (-matrix->m[4]  * b3 + matrix->m[5]  * b1 - matrix->m[6]  * b0) * scalar;result->m[13]  = ( matrix->m[0]  * b3 - matrix->m[1]  * b1 + matrix->m[2]  * b0) * scalar;result->m[14]  = (-matrix->m[12] * a3 + matrix->m[13] * a1 - matrix->m[14] * a0) * scalar;result->m[15]  = ( matrix->m[8]  * a3 - matrix->m[9]  * a1 + matrix->m[10] * a0) * scalar;return true;
}

是的有些矩阵是没有逆矩阵的,所以求逆矩阵的操作会失败。

世界坐标系的意义,就是坐标是相对于原点坐标系的。

局部坐标系的意义。就是坐标不是相对于原点坐标系。而是相对于某个详细的坐标系。

局部坐标系是能够通过上面的方法互相转换的。

那么怎样在局部坐标系之间互相转换呢?

我们无法把一个局部坐标系的坐标,一次就变化成还有一个局部坐标系上。

由于两个不同的局部坐标的坐标。都是相对于各自的坐标系。也就是參考系不同。

但。我们能够,把一个局部坐标系,转换到世界坐标系。以后再从世界坐标系转换到还有一个局部坐标系上。

坐标系转换的意义是什么?

假设我们可以恰当的选取坐标系。在进行坐标计算的时候,会简化非常多运算和思考的模型。

由于一个物体坐标的变化总是在父类坐标之内的,也就是相对于父类坐标系去变化。

这个父类坐标系。要么世界坐标系,要么就是某个详细的坐标系。

而我们这里讨论的坐标转换的模型是这种。

一个坐标终于呈如今屏幕上,我们假设改动了坐标的父坐标系,通过坐标系的转化。而保持这个坐标终于呈现的位置不变。

打一个例如

假设一个坐标(0, 0)在世界坐标系上,终于呈现出来的就是在(0, 0)点处。

我们如今把这个坐标,放到一个在(5, 5)处的坐标系内。这样这个坐标全部的数值都像相对于(5, 5)这个坐标系的。

那么,(0, 0)终于呈现的就是在(5, 5)处了,而不再原来的位置。

我们通过把这个坐标(0, 0)转换到(5, 5)的坐标系里,会得到新的坐标(-5, -5)这是相对于新坐标系的数值。

终于(-5, -5) 会呈如今(0, 0)的位置。

其实,在openGL绘制的时候。我们常常须要在各种不同的坐标系之间互相转换,可能是为了计算动画。可能是为了计算物理碰撞。

转载于:https://www.cnblogs.com/gavanwanggw/p/6705909.html

openGL 坐标系的互相转换相关推荐

  1. OpenGL坐标系及坐标转换

    https://blog.csdn.net/shimazhuge/article/details/25135009 OpenGL通过相机模拟.可以实现计算机图形学中最基本的三维变换,即几何变换(模型变 ...

  2. Unity 中的 3D 数学学习笔记——认识坐标系及坐标系之间的转换

    一 :3d空间坐标系  x,y,z 轴 z轴方向确定有两种方式 左手坐标系和右手坐标系 左手坐标系:伸开左手,大拇指指向X轴正方向,食指指向Y轴正方向,其他三个手指指向Z轴正方向. 右手坐标系:伸开右 ...

  3. 搞晕我的openGL坐标系

    OpenGL坐标系 研究任何坐标系(非欧的不清楚),只要把握住以下三点:1.原点:2.坐标轴正方向:3.坐标单位.以下均按照这个思路研究. 1.OpenGL坐标系转换的大致流程 一般使用摄像来做比来描 ...

  4. OpenGL坐标系和像素坐标系

    OpenGL坐标系原点在中心,并且做了归一化处理.就是说xy轴,都是从[-1, 1]之间.而像素坐标系是同样的中心点,右上是正方向,只是没有做归一化处理,是以像素为单位的.那么,归一化的坐标系和像素坐 ...

  5. gps84转换gcj02公式_地球坐标系 (WGS-84) 相互转火星坐标系 (GCJ-02) 的转换算法

    import java.util.HashMap; import java.util.Map; /** * 地球坐标系 (WGS-84) 相互转火星坐标系 (GCJ-02) 的转换算法 * * @au ...

  6. GIS中的坐标系定义与转换

    GIS中的坐标系定义与转换 青岛海洋地质研究所 戴勤奋 2002-3-27 14:22:47 ----------------------------------------------------- ...

  7. 经纬度坐标系与UTM MGRS坐标系之间的转换 c# 版本

    摘要: 经纬度坐标系与UTM, MGRS坐标系之间的转换代码 c# 原文地址: http://lu.9efish.com/Blog/longitude-latitude-utm-mgrs-csharp ...

  8. proj4经纬度bl转换xy_多种坐标系之间的转换之Proj.NET_转载

    Proj.NET (http://www.codeplex.com/ProjNET)是一个.NET下开源的空间参照和投影引擎,遵循OGC相关标准.负责人(Coordinators )是D_Guidi ...

  9. ArcGIS中的坐标系定义与转换 (转载)

    原文:ArcGIS中的坐标系定义与转换 (转载) 1.基准面概念:  GIS中的坐标系定义由基准面和地图投影两组参数确定,而基准面的定义则由特定椭球体及其对应的转换参数确定,因此欲正确定义GIS系统坐 ...

最新文章

  1. android java包_android SDk中常用的java包介绍
  2. python快速入门 pdf-Python快速入门PDF高清完整版本下载
  3. hive解决数据倾斜问题_八种解决 Spark 数据倾斜的方法
  4. 洛谷P2680 运输计划(倍增LCA + 树上差分 + 二分答案)
  5. 【转】蓝牙物理链路类型:SCO和ACL链路
  6. Nios中PIO的INT
  7. 深度学习在轨迹数据挖掘中的应用研究综述
  8. docker-compose 运行 Flask 应用最佳实践
  9. netty使用(7)传输一个序列化对象
  10. [USACO DEC13] 虫洞
  11. arcmap发布三维地图_如何使用高程DEM建立三维地图模型(Arcgis ArcScene)
  12. 通过设置关联菜单建立excel记账本
  13. 【读书笔记】python3 网络爬虫开发实战(1)
  14. php微商系统,产品营销推广神器Thinkphp核心微商新版零售系统源代码
  15. Helm charts
  16. 上海老百姓的胆量 VS 大牌店营业员的势利
  17. elasticsearch报错 all shards failed修复
  18. Android 高德地图黑屏定位,Android Fragment集成高德地图黑屏的问题解决方案
  19. html思维导图word版,(完整word版)非谓语动词练习及思维导图
  20. Visual Studio 好用的插件

热门文章

  1. MapReduce开发总结
  2. Uva1593 代码对齐
  3. 系统备份还原软件整理
  4. 35-03沉浸式状态栏例子
  5. jemter编写Mysql脚本___传参
  6. MapWindow记录
  7. 洛谷 1303——A*B Problem
  8. gradle第二天(Building a RESTful Web Service)
  9. 利用存储过程来实现分页性能比较
  10. 数据结构2:中序线索化二叉树为什么要通过pre设置后继结点