基本介紹
- 中文名:glSelectBuffer
- 外文名:void glSelectBuffer(
- 用於:返回選擇數據的數組
- 作用:可以存儲的最大數量
實例分析,
實例分析
CPoint mouse;
GetCursorPos(&mouse);
ScreenToClient(&mouse);
GLuint selectBuf[256]; //創建一個保存選擇結果的數組
GLint hits;
GLint viewport[4];
glGetIntegerv(GL_VIEWPORT, viewport); //獲得viewport
glSelectBuffer(256, selectBuf); //告訴OpenGL初始化 selectbuffer
glRenderMode(GL_SELECT); //進入選擇模式
glMatrixMode(GL_PROJECTION); //進入投影階段準備拾取
glPushMatrix(); //保存以前的投影矩陣
glLoadIdentity(); // 重置當前指定的矩陣為單位矩陣
CRect rect;
GetWindowRect(&rect);
// 設定我們選擇框的大小,建立拾取矩陣,就是上面的公式 viewport[3]-y,
// viewport[3]保存的是視窗的高度,視窗坐標轉換為OpenGL坐標
//void gluPickMatrix(GLdouble x, GLdouble y, GLdouble witdth, GLdouble height, GLint viewport[4]);
gluPickMatrix((GLdouble) mouse.x, (GLdouble) (viewport[3] - mouse.y),
1.0, 1.0, // 選擇框的大小為1,1
viewport // 視口信息,包括視口的起始位置和大小
);
gluPerspective( 45.0f, (GLfloat)rect.Width()/(GLfloat)rect.Height(), 0.1f, 1000.0f);
glMatrixMode(GL_MODELVIEW); //設定當前操作矩陣為“模型視圖矩陣”
CMeshDoc *pDoc = (CMeshDoc *)GetDocument();
glClearColor(m_ClearColorRed,m_ClearColorGreen,m_ClearColorBlue,1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glInitNames();
glPushName(0);
glPopMatrix();
glPushMatrix();
glTranslated(m_xTranslation,m_yTranslation,m_zTranslation);
glRotatef(m_xRotation, 1.0, 0.0, 0.0);
glRotatef(m_yRotation, 0.0, 1.0, 0.0);
glRotatef(m_zRotation, 0.0, 0.0, 1.0);
glScalef(m_xScaling,m_yScaling,m_zScaling);
pDoc->RenderScene();
glPopMatrix();
hits = glRenderMode(GL_RENDER); // 從選擇模式返回正常模式,該函式返回選擇到對象的個數
::glMatrixMode(GL_PROJECTION);
glPopMatrix(); // 返回正常的投影變換
::glMatrixMode(GL_MODELVIEW);
int modelselect = 0; //離眼睛最近的物件的名字(ID)
if (hits >0)
{
int n=0; double minz=selectBuff[1];
for(int i=1;i<hits;i++)
{
if (selectBuff[1+i*4]<minz) {n=i;minz=selectBuff[1+i*4];}
}
modelselect = selectBuff[3+n*4];
//E// RenderGLScene();//Invalidate(FALSE);
}