opengl中从3d到2d的坐标变换 (转)
sutiany | 28 六月, 2005 09:51
首先说一下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], 那么在操作这个矩阵时必须小心。 下面在说opengl中从物体坐标变换到窗口坐标的算法(实际上就是mesa中gluProject的实现):
GLint GLAPIENTRY 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
}
祝贺自己申请成功
sutiany | 23 六月, 2005 11:44
Welcome to my Blog. I am doing research on the application of virtual reality in marine and developing virtual seabed system using OpneGL. I'd like to communication with all friends who are interested in the theory, technology and development of Marine GIS and Virtual Reality.
Contact Information:
msn: sutiany0532@hotmail.com
Usually display as off-line
一个不错的研究海洋GIS的网址
sutiany | 23 六月, 2005 11:18
祝贺您
sutiany | 21 六月, 2005 16:24
如果您阅读到这篇文章,这就意味着您注册的博客已经申请成功。