2011-06-26 5 views
1

こんにちは、これは難しい質問のように思えるかもしれませんが(少なくとも私にとってはそれですが)、私はglUnprojectを使っていて、動作していません。 私はOpenGLとWinapiで同じ機能を使用すると、魅力的に機能しましたが、OpenGlとSDLを使用すると動作しませんでしたが、同じであるようにsuppossされましたが、そうではないようです...そう、私は本当にこのheresこれは、私が選んだ場所の色を返すためにsuppossedが、私は標準エラー出力を開いたとき、それは私にこのSDL/OpenGL Picking質問

するmouseX 430、mouseYの295

カラー1 0カラー2 00000000カラー3を与えている

void Game::Picking(int x,int y,int Which) 
{ 

    GLint viewport[4]; 
    GLfloat depth[2]; 
    GLubyte pixel[3]; 
    GLdouble modelview[16]; 
    GLdouble projection[16]; 
    GLfloat winX, winY; 
    GLdouble posX, posY, posZ,oldPosZ; 
    oldPosZ = posZ; 

    glGetDoublev(GL_MODELVIEW_MATRIX, modelview); 
    glGetDoublev(GL_PROJECTION_MATRIX, projection); 
    glGetIntegerv(GL_VIEWPORT, viewport); 

    winX = (float)x; 
    winY = (float)viewport[3] - (float)y; 
    glReadPixels(x, int(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, depth);//geting depth 

    glReadPixels(x, int(winY),1,1,GL_RGB,GL_UNSIGNED_BYTE,(void *)pixel);//getting Pixels 
    printf("Color1 %x Color2 %p Color3 %d ",pixel[0],pixel[1],pixel[2]); 
    if(Which == 0) 
    { 
     if(pixel[0] == MP_SinglePlayer.x && pixel[1] == MP_SinglePlayer.y && pixel[2] == MP_SinglePlayer.z) 
     { 
     printf("Detected Click Single Player"); 
      b_MenuPrincipal = false; 
      b_JuegoSolo = true; 
     } 
     else if(pixel[0] == MP_MultiPlayer.x && pixel[1] == MP_MultiPlayer.y && pixel[2] == MP_MultiPlayer.z) 
     { 
     printf("Detected Click MultiPlayer"); 
      b_MenuPrincipal = false; 
      b_MenuSrvClt = true; 
     } 
     else if(pixel [0] == MP_Exit.x && pixel [1] == MP_Exit.y && pixel [2] == MP_Exit.z) 
     { 
     printf("Detected Click Salir"); 
      b_MenuPrincipal = false; 
      b_Exit = true; 
     } 
    } 
} 

を選ぶための機能0 mouseX430、mouseY295

カラー1 0カラー2 00000000カラー3 0するmouseX 430、mouseYの295

と私はちょうど違いを見てみたかったが、それのどれもがここで働いていないとされるが、ゲームの私の主なサイクルだcuzのX、P、Dとイム印刷(期待してあなたはそれについての質問を持っている場合

while(Exit == 0) 
    { 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glLoadIdentity(); 

    glTranslatef(-PosicionCam[0].x,-PosicionCam[0].y,-PosicionCam[0].z); 
    Uint32 inicio = SDL_GetTicks(); 
    float delta = ((float)inicio - (float)ultimo) * 0.001f; 
    SDL_PumpEvents(); 


    keyboardstate = SDL_GetKeyState(NULL); 

    if(keyboardstate [SDLK_ESCAPE]) salir = 1; 


    if(b_MenuPrincipal){ 
     if(SDL_GetMouseState(&mousex, &mousey) & SDL_BUTTON(1)) 
     { 
     printf("mouseX %d , mouseY %d \n",mousex,mousey); 
     Picking(mousex,mousey,0); 
     } 
     menup->Move(PosicionCam[0].x,PosicionCam[0].y,PosicionCam[0].z); 
     menup->Draw(); 
    } 

SDL_GL_SwapBuffers(); 

)理解しにくい教えてください、私はすぐに答えることを試みるないあなたは私が最初に

答えて

3

をtyvm役立つことを願って、ピッキングは、描画した後に行うべきですおそらくSDLでレンダリングバッファがクリアされます。

第2に、私はglReadPixels(...、GL_DEPTH_COMPONENT、..、depth)もgluUnProjectも使用しないコードに注目していませんでした。結局のところ、色の選択や投影の解除についての質問はありますか?それは両方のクレイジーミックスのように見えます。あなたは奥行きを読んで無視し、RGB値を読んでXYZ座標として扱います。

gluUnProjectで奥行きを読んだり投影したりする必要があります。次に、glReadPixels(...、GL_RGB、...)を使ってカラーピクセルを読み込み、それを何らかの形で使用する必要がある場合。

+0

大変ありがとうございました私は愚かな気がします。まずはドローイングしてXDを始める必要がありました。本当にありがとう – Makenshi