以文本方式查看主题

-  计算机科学论坛  (http://bbs.xml.org.cn/index.asp)
--  『 C/C++编程思想 』  (http://bbs.xml.org.cn/list.asp?boardid=61)
----  OpenGL学习之一: 3D坐标到屏幕坐标的转换逻辑  (http://bbs.xml.org.cn/dispbbs.asp?boardid=61&rootid=&id=87483)


--  作者:葛靖青001
--  发布时间:11/5/2010 11:11:00 AM

--  OpenGL学习之一: 3D坐标到屏幕坐标的转换逻辑
到需要将3D坐标转换到屏幕坐标的问题,在网上很多朋友也在寻找答案,下面是glu中gluProject函数的实现。

  矩阵按行优先存储

  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

  }


W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
388.672ms