gpt4 book ai didi

c++ - OpenGL 3D 选择

转载 作者:太空狗 更新时间:2023-10-29 23:10:14 25 4
gpt4 key购买 nike

我正在尝试创建一个 3D 机器人,它应该在单击某些 body 部位时执行某些 Action 。我已经成功地(有点)实现了拾取,如果你点击任何 x 平面部分,它会记录一个点击,但不会在其他任何地方。也就是说,它没有记录深度,如果你点击它的方头,你只能通过点击头部的前部(面向你)来记录一次点击。显然,我并不完全理解采摘和选择,并且草率地尝试将我对 2D 选择的了解转录为 3D(我的老师非常乐于助人)但是我遗漏了一些东西或者没有改变与深度有关的东西。谁能帮我吗?下面是相关函数。

void processHits (GLint hits, GLuint buffer[])
{
unsigned int i, j;
GLint n, *ptr;

printf ("hits = %d\n", hits);
ptr = (GLint *) buffer;

//For each hit.
for (i = 0; i < hits; i++)
{
n = *ptr; //Number of names under current hit.
ptr+=3; //Bypass three integers: n, z1, z2.
printf ("hit %d has %d name(s)\n", i, n);

//For each name.
for (j = 0; j < n; j++)
{
if(*ptr==1) printf ("Body hit.\n");
else if(*ptr==2) printf ("Right shoulder hit.\n");
else if(*ptr==3) printf ("Left shoulder hit.\n");
else if(*ptr==4) printf ("Left arm hit.\n");
else if(*ptr==5) printf ("Right arm hit.\n");
else if(*ptr==6) printf ("Left leg hit.\n");
else if(*ptr==7) printf ("Right leg hit.\n");
else if(*ptr==8) printf ("Right foot hit.\n");
else if(*ptr==9) printf ("Left foot hit.\n");
else if(*ptr==10) printf ("Neck hit.\n");
else if(*ptr==11) printf ("Head hit.\n");
else printf ("Nothing hit.\n");

ptr++;
}
printf ("\n");
}
}

void selection(int mouse_x, int mouse_y)
{
GLuint buffer[512]; //Set up a selection buffer.
GLint hits; //The number of objects we selected.
GLint viewport[4]; //Viewport size. [0] Is <x>, [1] Is <y>, [2] Is <length>, [3] Is <width>.

glGetIntegerv(GL_VIEWPORT, viewport); //Sets the array <viewport> to size and location of screen relative to window.
glSelectBuffer(512, buffer); //Tell OpenGL to use our array for selection.

glRenderMode(GL_SELECT); //Puts OpenGL in selection mode. Nothing will be drawn. Object IDs and extents stored in buffer.

glInitNames(); //Initializes name stack.
glPushName(0); //Push an entry onto the stack.

glMatrixMode(GL_PROJECTION); //Selects the projection matrix.
glPushMatrix(); //Push the projection matrix.
glLoadIdentity(); //Resets matrix.

//This creates a matrix that will zoom up to a small portion of the screen, where the mouse is.
gluPickMatrix((GLdouble) mouse_x, (GLdouble) (viewport[3]-mouse_y), 0.01, 0.01, viewport);

gluPerspective(45.0f, (GLfloat) (viewport[2]-viewport[0])/(GLfloat) (viewport[3]-viewport[1]), 0.1f, 100.0f);
glMatrixMode(GL_MODELVIEW); //Select the modelview matrix.
drawObjects(GL_SELECT); //Render the targets to the selection buffer.
glMatrixMode(GL_PROJECTION); //Select the projection matrix.
glPopMatrix(); //Pop the projection matrix.
glMatrixMode(GL_MODELVIEW); //Select the modelview matrix.
hits = glRenderMode(GL_RENDER);
processHits (hits, buffer);

//printf("%d ", hits);

//Post redisplay message.
glutPostRedisplay();
}

void mouse(int button, int state, int x, int y)
{
if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
{
selection(x, y);
}
}

最佳答案

它不是完全清楚您的要求。如果您的意思是您只获得了最前面的对象的命中记录,那么这是意料之中的。被剔除的多边形不会生成任何命中记录。如果您希望获得通常会被剔除的多边形的命中记录,您需要在选择模式下进行绘图时使用 glDisable(GL_CULL_FACE);。这可以防止多边形被剔除,因此它们可以产生命中记录。

关于c++ - OpenGL 3D 选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1767154/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com