Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenGL选择模式 我知道OpenGL的选择模式被禁止,而且从来没有被HW加速,除了在几个SGI框和3DLAP GPU上。但是我不能摆脱它(不是我的代码)。低于它的C++代码: void GLWidget::Selection(int x,int y) // This Is Where Selection Is Done { GLint viewport[4]; glSelectBuffer(BUFSIZE,selectBuf); glRenderMode(GL_SELECT); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); glGetIntegerv(GL_VIEWPORT,viewport); gluPickMatrix(x,viewport[3]-y,5,5,viewport); //defining the picking matrix gluPerspective(fov,ratio,0.1f,1000); glMatrixMode(GL_MODELVIEW); glInitNames(); glPushName(1); //Pushing names on the stack glutSolidTorus(1, 2, 55, 55); //Some draw in GL_SELECT mode glTranslatef(5.0f,1,5.0f); glPopName(); glPushName(2); glutSolidTorus(1, 2, 55, 55); glTranslatef(5.0f,1,5.0f); glPopName(); glPushName(3); glutSolidTorus(RADIUS1, RADIUS2, complex1, complex2); //public members glTranslatef(5.0f,1,5.0f); glPopName(); int hits; // restoring the original projection matrix glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); // returning to normal rendering mode hits = glRenderMode(GL_RENDER); // if there are hits process them if (hits != 0){ qDebug() << "Found " << hits << " hit(s)"; processHits(hits,selectBuf); } }_C++_Qt_Opengl_Qglwidget - Fatal编程技术网

OpenGL选择模式 我知道OpenGL的选择模式被禁止,而且从来没有被HW加速,除了在几个SGI框和3DLAP GPU上。但是我不能摆脱它(不是我的代码)。低于它的C++代码: void GLWidget::Selection(int x,int y) // This Is Where Selection Is Done { GLint viewport[4]; glSelectBuffer(BUFSIZE,selectBuf); glRenderMode(GL_SELECT); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); glGetIntegerv(GL_VIEWPORT,viewport); gluPickMatrix(x,viewport[3]-y,5,5,viewport); //defining the picking matrix gluPerspective(fov,ratio,0.1f,1000); glMatrixMode(GL_MODELVIEW); glInitNames(); glPushName(1); //Pushing names on the stack glutSolidTorus(1, 2, 55, 55); //Some draw in GL_SELECT mode glTranslatef(5.0f,1,5.0f); glPopName(); glPushName(2); glutSolidTorus(1, 2, 55, 55); glTranslatef(5.0f,1,5.0f); glPopName(); glPushName(3); glutSolidTorus(RADIUS1, RADIUS2, complex1, complex2); //public members glTranslatef(5.0f,1,5.0f); glPopName(); int hits; // restoring the original projection matrix glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); // returning to normal rendering mode hits = glRenderMode(GL_RENDER); // if there are hits process them if (hits != 0){ qDebug() << "Found " << hits << " hit(s)"; processHits(hits,selectBuf); } }

OpenGL选择模式 我知道OpenGL的选择模式被禁止,而且从来没有被HW加速,除了在几个SGI框和3DLAP GPU上。但是我不能摆脱它(不是我的代码)。低于它的C++代码: void GLWidget::Selection(int x,int y) // This Is Where Selection Is Done { GLint viewport[4]; glSelectBuffer(BUFSIZE,selectBuf); glRenderMode(GL_SELECT); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); glGetIntegerv(GL_VIEWPORT,viewport); gluPickMatrix(x,viewport[3]-y,5,5,viewport); //defining the picking matrix gluPerspective(fov,ratio,0.1f,1000); glMatrixMode(GL_MODELVIEW); glInitNames(); glPushName(1); //Pushing names on the stack glutSolidTorus(1, 2, 55, 55); //Some draw in GL_SELECT mode glTranslatef(5.0f,1,5.0f); glPopName(); glPushName(2); glutSolidTorus(1, 2, 55, 55); glTranslatef(5.0f,1,5.0f); glPopName(); glPushName(3); glutSolidTorus(RADIUS1, RADIUS2, complex1, complex2); //public members glTranslatef(5.0f,1,5.0f); glPopName(); int hits; // restoring the original projection matrix glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); // returning to normal rendering mode hits = glRenderMode(GL_RENDER); // if there are hits process them if (hits != 0){ qDebug() << "Found " << hits << " hit(s)"; processHits(hits,selectBuf); } },c++,qt,opengl,qglwidget,C++,Qt,Opengl,Qglwidget,而paintGL()方法是 void GLWidget::paintGL() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glViewport (0, 0, w_screen, h_screen); gluLookAt(objCamera->mPos.x, objCamera->mPos.y, objCamera->mPos.z, 0,

而paintGL()方法是

void GLWidget::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glViewport (0, 0, w_screen, h_screen);


    gluLookAt(objCamera->mPos.x,  objCamera->mPos.y,  objCamera->mPos.z,
              0, objCamera->mView.y, 0,
              objCamera->mUp.x,   objCamera->mUp.y,   objCamera->mUp.z);        

glutSolidTorus(1, 2, 55, 55);  //draw some objects
glTranslatef(5.0f,1,5.0f);
glutSolidTorus(1, 2, 55, 55);
glTranslatef(5.0f,1,5.0f);
glutSolidTorus(RADIUS1, RADIUS2, complex1, complex2);
glTranslatef(5.0f,1,5.0f);
glTranslatef(-15.0f,-3,-15.0f);
}
此时,使用此代码,我可以选择一个对象并检索其ID,如果在同一xy坐标上有多个对象,我可以检索最近的对象(按ID)。 现在我有了3个对象,它们有3个不同的ID(1-2-3)

ID=3的具有非固定大小。我的问题是:如何使用缓冲区检索第三个圆环并更改其大小修改半径1、半径2、复数1、复数2

你们中有人能举个小例子吗


当出现命中时,我是否只需在堆栈上使用命中的名称(用glPushName给出),该名称必须以某种方式引用对象(可能带有包含该名称的字符串public成员),以便我可以更改其属性?

您必须自己存储每个对象的属性。当您将一个名称推送到名称堆栈上时,您所做的只是向每个片段添加额外的数据,以便以后可以有效地识别它来自何处

您可能需要创建一个类似{float rad1,rad2,complex1,complex2;}的结构来存储每个圆环体的值。知道所选对象的ID后,进入所述结构的数组,并修改相应对象的值。每次绘制场景时,只需运行此结构数组

void GLWidget::mousePressEvent(QMouseEvent *event)
{
lastPos = event->pos();
if (event->buttons() & GLUT_RIGHT_BUTTON){
    Selection(event->x(),event->y());
    }
}
void GLWidget::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glViewport (0, 0, w_screen, h_screen);


    gluLookAt(objCamera->mPos.x,  objCamera->mPos.y,  objCamera->mPos.z,
              0, objCamera->mView.y, 0,
              objCamera->mUp.x,   objCamera->mUp.y,   objCamera->mUp.z);        

glutSolidTorus(1, 2, 55, 55);  //draw some objects
glTranslatef(5.0f,1,5.0f);
glutSolidTorus(1, 2, 55, 55);
glTranslatef(5.0f,1,5.0f);
glutSolidTorus(RADIUS1, RADIUS2, complex1, complex2);
glTranslatef(5.0f,1,5.0f);
glTranslatef(-15.0f,-3,-15.0f);
}