OpenGL: 3D坐标到屏幕坐标的转换逻辑(gluProject的实现)

遇到需要将3D坐标转换到屏幕坐标的问题,在网上很多朋友也在寻找答案,下面是glu中gluProject函数的实现。(实际上就是mesa的OpenGL实现版本)

// 矩阵按行优先存储

首先说一下opengl中的矩阵表示, 一般在c/c++中定义的矩阵和opengl中的矩阵分别是:
/*****************************************************************************
We define a 4x4 matrix array, OpenGL linear matrix format:
referenced as Row,Column as:

| 0,0   0,1   0,2   0,3 |             |a0 a4 a8 a12|

| 1,0   1,1   1,2   1,3 |             |a1 a5 a9 a13|

| 2,0   2,1   2,2   2,3 |             |a2 a6 a10 a14|

| 3,0   3,1   3,2   3,3 |             |a3 a7 a11 a15|

*/ 两者行和列正好相反,因此,对于一个4×4的矩阵GLdouble m[16], 那么在操作这个矩阵时必须小心

GLint gluProject(GLdouble objx, GLdouble objy, GLdouble objz,
const GLdouble model[16], const GLdouble proj[16],
const GLint viewport[4],
GLdouble * winx, GLdouble * winy, GLdouble * winz)
{
/* matrice de transformation */
GLdouble in[4], out[4];
/* initilise la matrice et le vecteur a transformer */
in[0] = objx;
in[1] = objy;
in[2] = objz;
in[3] = 1.0;
transform_point(out, model, in);
transform_point(in, proj, out);
/* d’ou le resultat normalise entre -1 et 1 */
if (in[3] == 0.0)
return GL_FALSE;
in[0] /= in[3];
in[1] /= in[3];
in[2] /= in[3];
/* en coordonnees ecran */
*winx = viewport[0] + (1 + in[0]) * viewport[2] / 2;
*winy = viewport[1] + (1 + in[1]) * viewport[3] / 2;
/* entre 0 et 1 suivant z */
*winz = (1 + in[2]) / 2;
return GL_TRUE;
}
/*
* Transform a point (column vector) by a 4x4 matrix. I.e. out = m * in
* Input: m - the 4x4 matrix
* in - the 4x1 vector
* Output: out - the resulting 4x1 vector.
*/

static void
transform_point(GLdouble out[4], const GLdouble m[16], const GLdouble in[4])
{
#define M(row,col) m[col*4+row]
out[0] =
M(0, 0) * in[0] + M(0, 1) * in[1] + M(0, 2) * in[2] + M(0, 3) * in[3];
out[1] =
M(1, 0) * in[0] + M(1, 1) * in[1] + M(1, 2) * in[2] + M(1, 3) * in[3];
out[2] =
M(2, 0) * in[0] + M(2, 1) * in[1] + M(2, 2) * in[2] + M(2, 3) * in[3];
out[3] =
M(3, 0) * in[0] + M(3, 1) * in[1] + M(3, 2) * in[2] + M(3, 3) * in[3];
#undef M
}

参考:

http://www.soidc.net/articles/1215485053486/20081129/1215945559526_1.html

http://sutiany.itpub.net/post/6261/33673

http://www.opengl.org/wiki/GluProject_and_gluUnProject_code

转载于:https://www.cnblogs.com/mazhenyu/archive/2011/12/08/2280660.html

OpenGL: 3D坐标到屏幕坐标的转换逻辑(gluProject的实现)(转)相关推荐

  1. 屏幕距离和坐便转换工具_地图经纬度坐标与屏幕坐标的转换(android版)

    我们在开发GIS系统的时候,首先要解决的就是地图的可视化问题,这个问题的关键就在于如何把地图的坐标转换成屏幕坐标,然后才到渲染着色.标注等.以下以wgs84经纬度坐标为基准,介绍一下地图经纬度坐标与屏 ...

  2. Qt+OpenGL——3D坐标转2D坐标

    原理介绍:https://learnopengl-cn.github.io/01%20Getting%20started/08%20Coordinate%20Systems/ 代码实现 为了获取模型中 ...

  3. fps透视基础-3分钟快速定位矩阵基址-附3D坐标转屏幕坐标算法

    目录 矩阵介绍 根据矩阵特征快速定位矩阵头基址[以csgo游戏为例] 函数封装

  4. TrackPopupMenu参数为屏幕坐标的转换

    第一次接触TrackPopupMenu函数的时候大家可能会发现:编写出来的窗口的动态弹出菜单位置始终不能如愿地显示在正确位置,仔细观察或者查MSDN就知道,TrackPopupMenu函数中的坐标参数 ...

  5. 百度android api坐标转地址,百度API从经纬度坐标到地址的转换服务

    /// /// 百度API从经纬度坐标到地址的转换服务 /// /// /// /// public string GetAddress(string lng, string lat) { strin ...

  6. 游戏世界三维坐标转换为屏幕坐标原理分析:三角函数转换与矩阵变换

    在3D游戏中获得游戏人物敌人坐标xyz后,并不能直接绘制到屏幕上,需要进行一系列的转换算法,目前主流的算法包括三角函数转换与矩阵变换,三角函数转换方法过时且繁琐,这里不推荐使用,本文主讲矩阵变换原理: ...

  7. 《地理坐标(经纬度坐标)和屏幕坐标(xy坐标)间的转换》的读后笔记

    今天读了一下<地理坐标(经纬度坐标)和屏幕坐标(xy坐标)间的转换>,觉得内容很好,特摘录和附上自己的解释. 背景 在我们的屏幕上,有一张地图,这张地图经过缩放.平移.旋转,最终地理坐标和 ...

  8. Android OpenGL ES 2.0 屏幕坐标和3D世界坐标转换

    Android OpenGL ES 2.0 屏幕坐标和3D世界坐标转换 查看全文 http://www.taodudu.cc/news/show-6705596.html 相关文章: word中如何加 ...

  9. three.js 3D坐标转化为2D屏幕坐标

    //创建一个3D坐标 var vector = new THREE.Vector3(); //获取模型 var obj = scene.getObjectByName(modelName); vect ...

最新文章

  1. torch.nn.functional.cross_entropy.ignore_index
  2. 从数据库导出数据到word、excel、.txt
  3. Linux Shell脚本之向脚本传递参数
  4. BSP 二叉树再次讨论
  5. CodeDom 笔记整理
  6. VS2015中配置MSComm通讯控件和注意事项
  7. “保持耐心”,永远从用户角度出发— 专访阿里巴巴淘系技术内容中台负责人吴桂林(梁舒)...
  8. Android中利用productFlavors配置多渠道
  9. RabbitMQ基本概念(三)-Centos7下安装RabbitMQ3.6.1
  10. 如何Super Vectorizer从Mac 上的图像中删除多余的颜色区域?
  11. 如何在linux上创建数据库,在LINUX平台上手动创建数据库(oracle 10g)
  12. 题目1088:剩下的树(小端快排+大端判断边界)
  13. 学一点Wi-Fi:WAPI
  14. 结构体初始化的四种方法
  15. 笔记本win10 QQ能登上,网页打不开
  16. 《苏菲的世界》——读书笔记
  17. 解决阿里云此手机号码绑定的账户数已达上限的方法
  18. sap pp模块中的物料反冲
  19. Zigbee efr32 有线网关接入HASS中的ZHA,实现设备控制
  20. 今天感受了一下ipad

热门文章

  1. python微信好友分析源代码_搞事情了 | 教你用Python分析微信好友信息(内附完整代码)...
  2. python元组修改_python基础知识之元组
  3. 可以比较两个指针是否相等_算法一招鲜——双指针问题
  4. rfid商品管理软件_哪个RFID固定资产管理系统比较好用?
  5. linux启动服务器ftp监听,Linux redhat6.5开启ftp服务
  6. 包画三维散点图怎么导出_不开玩笑,发现宝藏了,一键导出场地三维模型,连贴图都有!...
  7. 通信专业考研考C语言,2016年北京邮电大学信息与通信工程学院C语言程序设计考研复试题库...
  8. Error in configuration process解决方法
  9. push_back()和emplace_back()函数
  10. php扩展兼容,PHP扩展迁移为PHP7扩展兼容性问题记录,php7兼容性_PHP教程