OpenGL直线拾取
2013-05-22 11:23
225 查看
void WALL::pick(GLfloat xpos,GLfloat ypos) { xpos,ypos; GLint viewport[4]; GLdouble mvmatrix[16],projmatrix[16]; float realy; GLdouble wx,wy,wz; glGetIntegerv(GL_VIEWPORT,viewport); glGetDoublev(GL_MODELVIEW_MATRIX,mvmatrix); glGetDoublev(GL_PROJECTION_MATRIX,projmatrix); realy =ypos; printf("%f %f \n",xpos,realy); gluUnProject((GLdouble)xpos,(GLdouble)realy,0.0,mvmatrix,projmatrix,viewport,&wx,&wy,&wz); float g_nearxyz[3]; g_nearxyz[0] = (GLfloat)wx; g_nearxyz[1] = (GLfloat)wy; g_nearxyz[2] = (GLfloat)wz;//// gluUnProject((GLdouble)xpos,(GLdouble)realy,1.0,mvmatrix,projmatrix,viewport,&wx,&wy,&wz); float g_farxyz[3]; g_farxyz[0] = (GLfloat)wx; g_farxyz[1] = (GLfloat)wy; g_farxyz[2] = (GLfloat)wz;//// float m_fangxiang[3]; for(int i=0 ;i<3 ;i++) { m_fangxiang[i] =g_farxyz[i] -g_nearxyz[i]; } float noml =1/sqrtf(m_fangxiang[0]*m_fangxiang[0]+m_fangxiang[1]*m_fangxiang[1]+m_fangxiang[2]*m_fangxiang[2]); for(int i=0 ;i<3 ;i++) { m_fangxiang[i]*=noml; } float distens =-g_nearxyz[1]/m_fangxiang[1]; float onefangxiang[3]; for(int i=0; i<3 ;i++) { onefangxiang[i] =distens*m_fangxiang[i]+g_nearxyz[i]; } for(int i=0 ;i<400 ;i++) { pic[i].select =false; if(abs(onefangxiang[0]-pic[i].x)<4&&abs(onefangxiang[2]-pic[i].y)<4) { pic[i].select =true; } } //printf("%f %f %f \n",onefangxiang[0],onefangxiang[1],onefangxiang[2]); //printf("line:%f,%f ,%f --->%f ,%f,%f\n",g_nearxyz[0],g_nearxyz[1],g_nearxyz[2],g_farxyz[0],g_farxyz[1],g_farxyz[2]); }
相关文章推荐
- OpenGL选择与拾取GL_SELECT 附源码
- 理解OpenGL拾取模式(OpenGL Picking)
- 第一课、OpenGL绘制直线等等
- 理解OpenGL拾取模式(OpenGL Picking)
- OpenGL编程(五)绘直线以及分析绘直线的算法
- 学习OpenGL(四)绘制直线
- Win32 OpenGL编程(3) 基本图元(点,直线,多边形)的绘制
- OpenGL-选择与拾取
- OpenGL直线剪裁
- OpenGL绘制直线
- 关于unity的轴的移动和openGL的鼠标拾取
- OpenGL学习-------点、直线、多边形
- OpenGL选择-拾取机制(转载自zwqxin)
- openGL-中点Bresenham绘制直线算法
- opengl DDA直线算法的实现
- Android OpenGL射线拾取&手势旋转(一) 推荐
- opengl逐点比较法绘直线
- OpenGL鼠标拾取的实现:终于搞定(包括细节问题)
- 计算机图形学-基于OpenGL的直线扫描程序