私はピッキング手法を初めて使用し、NEHE チュートリアルに従って opengl でピッキング手法を使用しました。実際には、正方形の細い線を検出する必要があります。しかし、なぜそれが正しく検出されないのかわかりません。背景から正方形を削除しても、作成したものではなく他の選択がランダムに選択されます。ほとんどの場合、検出されません...そのため、別のテストexeを作成し、2行だけ配置して正方形の背景を削除しましたが、それでも選択されません..画面の他の部分で選択されることがあります..これらの線は画面から少し離れているので、線がどのように存在するかをはっきりと見るためにズームの自由を与えたので、ズームでもチェックしました...しかし、まだ役に立ちません。非常に紛らわしいです。
以下は私のコードで、どのように行を作成していますか
私の初期化コード
void COpenGLControl::oglInitialize(void)
{
// Initial Setup:
//
static PIXELFORMATDESCRIPTOR pfd =
{
sizeof(PIXELFORMATDESCRIPTOR),
1,
PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,
PFD_TYPE_RGBA,
32, // bit depth
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
16, // z-buffer depth
0, 0, 0, 0, 0, 0, 0,
};
// Get device context only once.
hdc = GetDC()->m_hDC;
// Pixel format.
m_nPixelFormat = ChoosePixelFormat(hdc, &pfd);
SetPixelFormat(hdc, m_nPixelFormat, &pfd);
// Create the OpenGL Rendering Context.
hrc = wglCreateContext(hdc);
wglMakeCurrent(hdc, hrc);
// Basic Setup:
//
// Set color to use when clearing the background.
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClearDepth(1.0f);
// Turn on backface culling
glFrontFace(GL_CCW);
glCullFace(GL_BACK);
// Turn on depth testing
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
GLenum a = glGetError();
CCTrace::Trace(L"COpenGLControl::oglInitialize return",a);
OnDraw(NULL);
}
これは、マウスクリックで呼び出している選択方法です
void CRightOGL::Selection(int mouse_x,int mouse_y) // This Is Where Selection Is Done
{
GLuint buffer[512]={0};
GLint hits; // The Number Of Objects That We Selected
// The Size Of The Viewport. [0] Is <x>, [1] Is <y>, [2] Is <length>, [3] Is <width>
GLint viewport[4];
// This Sets The Array <viewport> To The Size And Location Of The Screen Relative To The Window
glGetIntegerv(GL_VIEWPORT, viewport);
glSelectBuffer(512, buffer); // Tell OpenGL To Use Our Array For Selection
(void) glRenderMode(GL_SELECT);
glInitNames();
glPushName(0);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
gluPickMatrix((GLdouble) mouse_x, (GLdouble) (viewport[3]-mouse_y), 30.0f, 30.0f, viewport);
gluPerspective(35.0f, (GLfloat) (viewport[2]-viewport[0])/(GLfloat) (viewport[3]-viewport[1]), 0.01f, 2000.0f);
glMatrixMode(GL_MODELVIEW);
DrawTargetLines();
//DrawJawImage();
glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
glPopMatrix(); // Pop The Projection Matrix
glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
hits=glRenderMode(GL_RENDER); // Switch To Render Mode, Find Out How Many
// Objects Were Drawn Where The Mouse Was
GLenum s = glGetError();
if(s!=0) CCTrace::Trace(L"CRightOGL::oglDrawScene",s);
if (hits > 0) // If There Were More Than 0 Hits
{
int choose = buffer[3]; // Make Our Selection The First Object
int depth = buffer[1]; // Store How Far Away It Is
//SetTeethSlice(choose);
for (int loop = 1; loop < hits; loop++) // Loop Through All The Detected Hits
{
// If This Object Is Closer To Us Than The One We Have Selected
if (buffer[loop*4+1] < GLuint(depth))
{
choose = buffer[loop*4+3]; // Select The Closer Object
depth = buffer[loop*4+1]; // Store How Far Away It Is
}
}
((CTeethBiometricApp*)::AfxGetApp())->setDialogSlider(choose);
}
}
これは、52 種類の線を描画する線引き機能です。
void CRightOGL::DrawTargetLines()
{
glDisable(GL_TEXTURE_2D);
//original line when you need to adjust the line use this block
// glVertex3d(-0.5,-0.23f,1.0f);
// glVertex3d( -0.1,-0.35f,1.0f);
//-------------------------------------------------------------------
float y1 = 0.25f, y2 = 0.37f;
for(float loop=1;loop<51;loop++)
{
y1+=0.004f;
y2+=0.004f;
glLoadName(loop); // Assign Object A Name (ID)
glPushMatrix(); // Push The Modelview Matrix
glLineWidth(3.0f);
glBegin(GL_LINES); // Start Drawing Our Player Using Lines
if(this->m_CurrentSlice==loop)
glColor3f(1.0f,1.0f,0.0f);
else
glColor3f(1.0f,0.0f,0.0f);
glVertex3d(-0.5,y1,1.0f); // Top Left Of Player
glVertex3d( -0.1,y2,1.0f); // Bottom Right Of Player
// Pop The Modelview Matrix
glEnd();
glPopMatrix();
}
}
これは私の描画機能です
void CRightOGL::oglDrawScene(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glShadeModel(GL_SMOOTH);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glLoadIdentity();
//glTranslatef(0.0f, 0.0f, -m_fZoom);//this is for zoom using left mouse click but no placing
glTranslatef(m_fPosX, m_fPosY,-m_fZoom); // this is for placing + zooming using middle scroll button mouse click
glRotatef(m_fRotX, 1.0f, 0.0f, 0.0f);//these two for mouse movement
glRotatef(m_fRotY, 0.0f, 1.0f, 0.0f);
glRotated(90,0.0f, 0.0f, -1.0f);
GLenum s = glGetError();
DrawJawImage();
DrawTargetLines();
SwapBuffers(hdc);
glFlush();
}
私のテストexeはこのドロップボックスにあります
http://dl.dropbox.com/u/104183650/Release.zip
マウスの右ボタンを使用してズームし、マウスの左ボタンを回転させてください