opengl拾取的问题

时间:2023-01-29 17:10:45
我要做的是拾取一个长方体,hits总是0,怎么回事啊。
是不是我的gluPerspective语句不对啊,该怎么设置?
Draw(GL_SELECT)这个函数是不是要在要选择的长方体所在位置重画啊?
谢谢!代码如下:
#define BUFFER_LENGTH 512
void ProcessSelection(CPoint point)
{
GLuint buffer[BUFFER_LENGTH];
GLint hits;
GLint viewport[4];
glGetIntegerv(GL_VIEWPORT, viewport);
glSelectBuffer(BUFFER_LENGTH, buffer);

(void) glRenderMode(GL_SELECT);
glInitNames();
glPushName(-1);

glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
gluPickMatrix((GLdouble)point.x,(GLdouble)(viewport[3]-point.y),5.0f,5.0f,viewport);
gluPerspective(45.0f,(GLfloat)(viewport[2]-viewport[0])/(GLfloat)(viewport[3]-viewport[1]), 0.1f, 100.0f);

glMatrixMode(GL_MODELVIEW); glPushMatrix();
glLoadIdentity();
Draw(GL_SELECT);
glPopMatrix();
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
hits=glRenderMode(GL_RENDER);
}
void Draw(GLenum mode)
{
ArPose pose=m_Robot.getPose();
glPushMatrix();
if(mode==GL_SELECT)
glLoadName(1);
glTranslated(pose.getX(),pose.getY(),HEIGHT/2);//平移到长方体原来所在的位置
glRotatef(pose.getTh(),0,0,1);
auxSolidBox(300,300,500);
glPopMatrix();
}

8 个解决方案

#1


up,我困扰很久了,哪位能指点一下啊

#2


up

#3


http://blog.csdn.net/xlzxlich/archive/2007/06/05/1639780.aspx

#4


up

#5


我运行了一下你的例子,但没有编译成功。我注意到你的例子中有函数 
gluLookAt(eyex+xMove,eyey+yMove,eyez+zMove,lookat_X+xMove,lookat_Y+yMove, lookat_Z+zMove,0.0,0.0,1.0);
其中的xMove,yMove,zMove是什么,鼠标偏移量吗?
lookat_X等怎么设的?
0.0,0.0,1.0 我看到有些书里写的是y轴,即0,1,0
谢谢你的解释

#6


up

#7


已经发到你的邮箱里了。

#8


问题解决了,回答我自己的几个问题:
gluPerspective(45.0f,(GLfloat)(viewport[2]-viewport[0])/(GLfloat)(viewport[3]-viewport[1]), 0.1f, 100.0f);这个语句没错,只要把握住选择模式下和绘图模式下gluPerspective
语句设置的一致就行。
Draw(GL_SELECT)这个函数是要在要选择的物体所在的位置画,重绘时的投影矩阵,视图矩阵都要和绘图模式下相同才行。
本程序的主要问题是
................
glLoadIdentity();
Draw(GL_SELECT);
..............
Draw函数前不应该初始化GL_MODELVIEW矩阵

#1


up,我困扰很久了,哪位能指点一下啊

#2


up

#3


http://blog.csdn.net/xlzxlich/archive/2007/06/05/1639780.aspx

#4


up

#5


我运行了一下你的例子,但没有编译成功。我注意到你的例子中有函数 
gluLookAt(eyex+xMove,eyey+yMove,eyez+zMove,lookat_X+xMove,lookat_Y+yMove, lookat_Z+zMove,0.0,0.0,1.0);
其中的xMove,yMove,zMove是什么,鼠标偏移量吗?
lookat_X等怎么设的?
0.0,0.0,1.0 我看到有些书里写的是y轴,即0,1,0
谢谢你的解释

#6


up

#7


已经发到你的邮箱里了。

#8


问题解决了,回答我自己的几个问题:
gluPerspective(45.0f,(GLfloat)(viewport[2]-viewport[0])/(GLfloat)(viewport[3]-viewport[1]), 0.1f, 100.0f);这个语句没错,只要把握住选择模式下和绘图模式下gluPerspective
语句设置的一致就行。
Draw(GL_SELECT)这个函数是要在要选择的物体所在的位置画,重绘时的投影矩阵,视图矩阵都要和绘图模式下相同才行。
本程序的主要问题是
................
glLoadIdentity();
Draw(GL_SELECT);
..............
Draw函数前不应该初始化GL_MODELVIEW矩阵