用OpenGL实现三维点到屏幕空间的投影
2011-03-07 15:19
316 查看
有两种方法,一种是利用gluProject函数:
gluProject源码:
第二种方法就是实现gluProject,照着源码实现就可以了,需要注意的是OpenGL的矩阵是列主序存储的。
GLdouble modelview[16]; GLdouble projection[16]; GLdouble out[3], in[3]; // 对in赋值…… glPushMatrix(); glGetDoublev(GL_MODELVIEW_MATRIX, modelview); glGetDoublev(GL_PROJECTION_MATRIX, projection); gluProject(in[0],in[1],in[2],modelview,projection,viewport,&(out[0]),&(out[1]),&(out[2]));
gluProject源码:
/* Transform a point(column vector) by a 4x4 matrix. Then, 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 } // gluProject source code (说明见OpenGL API文档) GLint gluProject(GLdouble objx, GLdouble objy, GLdouble objz, const GLdouble modelMatrix[16], const GLdouble projMatrix[16], const GLint viewport[4], GLdouble *winx, GLdouble *winy, GLdouble *winz) { // matrice transformation GLdouble in[4], out[4]; //initialize matrice and column vector as a transformer in[0] = objx; in[1] = objy; in[2] = objz; in[3] = 1.0; transform_point(out, modelMatrix, in); //乘以模型视图矩阵 transform_point(in, projMatrix, out); //乘以投影矩阵 //齐次向量的第四项不能为0 if(in[3] == 0.0) return GL_FALSE; //向量齐次化标准化 in[0] /= in[3]; in[1] /= in[3]; in[2] /= in[3]; //视口向量的作用 *winx = viewport[0] + (1 + in[0]) * viewport[2] / 2; *winy = viewport[1] + (1 + in[1]) * viewport[3] / 2; *winz = (1 + in[2]) / 2; return GL_TRUE; }
第二种方法就是实现gluProject,照着源码实现就可以了,需要注意的是OpenGL的矩阵是列主序存储的。
相关文章推荐
- VC+OpenGL实现空间三维Delaunay三角剖分
- VC+OpenGL实现空间三维Delaunay三角剖分
- Captain Dialog 2009-09-18 VC+OpenGL实现空间三维Delaunay三角剖分
- VC+OpenGL实现空间三维Delaunay三角剖分
- 无需Root实现Android手机屏幕流畅投影到电脑进行演示(附软件下载)
- Unity3d 实现屏幕坐标和3维空间坐标的转化
- 在Unity中实现屏幕空间反射Screen Space Reflection(1)
- 在Unity中实现屏幕空间反射Screen Space Reflection(2)
- 在Unity中实现屏幕空间反射Screen Space Reflection(3)
- OpenCV学习笔记(19)双目测距与三维重建的OpenCV实现问题集锦(四)三维重建与OpenGL显
- 从相机空间到屏幕投影,期间发生了什么
- openGL+VS2010的例程--空间摄影机注释版(三维)
- 空间圆弧作图算法,基于OpenGL实现!
- 【opengl】OpenGL中三维物体显示在二维屏幕上显示的变换过程
- (转)从零实现3D图像引擎:(13)把宽高比、透视投影矩阵、屏幕变换矩阵说透
- 在Unity中实现屏幕空间反射Screen Space Reflection(4)
- OpenGL中三维物体显示在二维屏幕上显示的变换过程
- opengl 投影 内部实现代码
- OpenGL:屏幕二维坐标转化为三维模型坐标
- 通过屏幕鼠标绘制opengl三维场景图形