Opengl选择问题 [英] Opengl Select Problem
本文介绍了Opengl选择问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我一直面临着使用glulookat函数选择负z方向空间的问题。我的代码适用于在工作区中选择一个提供两个数字点的空间,如果其中一个具有正z值但是如果两个z值都为负则代码将失败。
I have been facing a problem regarding selecting the space in negative z direction with glulookat function. my code works fine for selecting a space providing two digonal points in the workspace if either one has positive z value but if both of the z value is negative the code fails.
void COpenGLBaseView::Select(float x1,float y1, float z1,float x2,float y2,float z2)
{
if(x1 > x2)
{
Swap(x1,x2);
}
if(y1 > y2)
{
Swap(y1,y2);
}
if(z1 > z2)
{
Swap(z1,z2);
}
GLint hits, view[4];
/* This choose the buffer where store the values for the selection data */
glSelectBuffer(m_BucketSize, m_aBucket);
/* This retrieve info about the viewport */
glGetIntegerv(GL_VIEWPORT, view);
/* Switching in selecton mode */
glRenderMode(GL_SELECT);
/* Clearing the name's stack
This stack contains all the info about the objects */
glInitNames();
/* Now fill the stack with one element (or glLoadName will generate an error) */
glPushName(0);
/* Now modify the vieving volume, restricting selection area around the cursor */
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
/*restrict the draw to an area around the cursor */
//gluPickMatrix(X+XRange * 0.5, Y+YRange * 0.5, XRange, YRange, view);
gluPickMatrix(m_cx * 0.5, m_cy * 0.5,m_cx, m_cy, view);
glOrtho(x1,x2,y1,y2,z1,z2);
/* Draw the objects onto the screen*/
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
//gluLookAt(0.0,0.0,z2+z1, 0.0 , 0.0 ,z1,0.0,1.0,0.0);
if(z1<0 && z2<0)
{
gluLookAt(0.0,0.0,-(z1+z2), 0.0 , 0.0 ,-(z1+z2),0.0,1.0,z1); // I want value to work for this condition.
}
else
{
gluLookAt(0.0,0.0,z1+z2, 0.0 , 0.0 ,z1,0.0,1.0,0.0);
}
//gluLookAt(0.0,0.0,z1+z2, 0.0 , 0.0 ,z1-1,0.0,1.0,0.0);
/* draw only the names in the stack, and fill the array*/
m_pContour->RenderSelection();
/* Do you remeber? We do pushMatrix in PROJECTION mode */
glMatrixMode(GL_PROJECTION);
glPopMatrix();
/* get number of objects drawed in that area and return to render mode */
hits = glRenderMode(GL_RENDER);
glMatrixMode(GL_MODELVIEW);
/*if(hits > 0)
{
int selIndex = buff[3];
return selIndex;
}
return -1;*/
/*
For each hit in the buffer are allocated 4 bytes:
1. Number of hits selected (always one,
beacuse when we draw each object
we use glLoadName, so we replace the
prevous name in the stack)
2. Min Z
3. Max Z
4. Name of the hit (glLoadName)
*/
// return hits;
int SelectedNum = hits;
if(SelectedNum > 0)
{
for(int i = 0;i < SelectedNum; ++i)
{
m_SelectedParticles.push_back(m_aBucket[i * 4 + 3]);
if(TM_SELECT_REGION_DIRECT)
{
m_SelectedParticlesToSeeParticleFlow.insert(m_aBucket[i * 4 + 3]);
}
}
}
if(TM_SELECT_REGION_DIRECT)
{
m_SelectedParticles.clear();
set<int>::iterator it;
for(it= m_SelectedParticlesToSeeParticleFlow.begin(); it!= m_SelectedParticlesToSeeParticleFlow.end(); it++)
{
m_SelectedParticles.push_back(*it);
}
}
glLoadIdentity();
SetupViewingTransform();
Invalidate(false);
}
//************** End Selection in 3D**********************//
bool COpenGLBaseView::CompareFramewithTrackValue(int trackValue,bool checkStepForward)
{
if(checkStepForward)
{
if(trackValue<frameNumber)
{
return true;
}
}
else
{
if(trackValue>initialframeNumber)
{
return true;
}
}
return false;
}
可以随时提供帮助。
could any one please help.
推荐答案
这个代码没有问题,问题在于glulookat功能。
我尝试更改一些参数,问题解决了。
this code had no problem, the issue was with glulookat function.
I tried changing some parameter and the problem was solved.
这篇关于Opengl选择问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文