OpenGL选择模式
OpenGL Picking on Selection Mode
我知道OpenGL选择模式已被弃用,并且从未进行过硬件加速,除了在一些SGI盒和3DLabs 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);
}
}
这是processshits方法
void GLWidget::processHits (GLint hits, GLuint buffer[]) //Some prints
{
unsigned int i, j;
GLuint names, *ptr, minZ,*ptrNames, numberOfNames;
ptr = (GLuint *) buffer;
minZ = 0xffffffff;
for (i = 0; i < hits; i++) {
names = *ptr;
ptr++;
if (*ptr < minZ) {
numberOfNames = names;
minZ = *ptr;
ptrNames = ptr+2;
}
ptr += names+2;
}
qDebug() << "Nearest: ";
ptr = ptrNames;
for (j = 0; j < numberOfNames; j++,ptr++) {
qDebug() << *ptr ;
}
}
Selection()通过使用*事件调用(GLWidget派生自QGLWidget (QT 4.8))。因此,只有当我点击鼠标右键时,我才会在缓冲区中"绘制"对象,并将其名称推入堆栈。
void GLWidget::mousePressEvent(QMouseEvent *event)
{
lastPos = event->pos();
if (event->buttons() & GLUT_RIGHT_BUTTON){
Selection(event->x(),event->y());
}
}
而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的不固定大小。我的问题是:如何使用缓冲区来检索第三个环面,并修改其大小RADIUS1, RADIUS2, complex1, complex2?
你们谁能写一个小例子吗?
有我,当有一个命中,简单地使用命中的名称在堆栈上(与glPushName给出),必须以某种方式引用一个对象(可能与字符串公共成员包含的名称),所以我可以改变它的属性?
您必须自己存储每个对象的属性。当你把一个名字推到名字堆栈上时,你所做的就是给每个片段添加额外的数据,这样你就可以有效地识别它来自哪里。
你可能想要创建一个结构{float rad1, rad2, complex1, complex2;}来存储每个环面的值。知道所选对象的ID后,进入所述结构的数组,并修改相应对象的值。每次绘制场景时,只需遍历这个结构数组。
相关文章:
- 如何使用默认参数等选择模板专业化
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- 选择要调用的构造函数
- C++选择排序算法中的逻辑错误
- 为什么在保护模式下继承升级不起作用
- QTreeView幻灯片多选后无法使用单击选择
- 如何在全屏模式下(在OpenGL中)使背景透明
- 无法获取菜单选择以运行函数.C++
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 为什么使用__LINE_的代码在发布模式下在MSVC下编译,而不是在调试模式下
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- C++,有选择地应用模板模式来发挥作用
- Windows Console API鼠标事件只是进入选择模式
- 为什么CRTP(奇怪的递归模板模式)试图选择另一个私有基类的另一个同名函数
- 设计模式选择
- OpenGL选择模式
- 在做一次选择(GL_SELECT模式)后,一半Fps (OpenGL)
- QListView改变MultiSelection选择模式的行为
- vector insert中重载模板函数选择(模式匹配)是如何工作的