Opengl选择问题 [英] Opengl Select Problem

查看:63
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆