OpenGL直线拾取

 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]);

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值