1

こんにちは、これは難しい質問のように思えるかもしれません (少なくとも私にはそうです) が、glUnproject を使用していて、機能していません。OpenGLとWinapiで同じ機能を使用すると、魅力的に機能しましたが、OpenGlとSDLを使用すると機能しなくなりました。ピッキング用

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;
        }
    }
}

これは、私が選んだ場所の色を返すことになっていますが、標準エラー出力を開くと、これが表示されます

マウス X 430 、マウス Y 295

Color1 0 Color2 00000000 Color3 0 mouseX 430 , mouseY 295

Color1 0 Color2 00000000 Color3 0 mouseX 430 , mouseY 295

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();

それについて何か質問がある場合は教えてください。すぐに答えようとします。助けていただければ幸いです tyvm

4

1 に答える 1

3

まず、描画後にピッキングを実行する必要があります。おそらくSDLでレンダリングバッファがクリアされます。

次に、最も重要なのは、glReadPixels(...、GL_DEPTH_COMPONENT、..、depth)やgluUnProjectを使用するコードに気づかなかったことです。結局のところ、カラーピッキングまたは非投影についての質問はありますか?それは両方のクレイジーなミックスのように見えます。深度を読み取り、無視してから、RGB値を読み取り、XYZ座標として扱います。

深さを読み取り、gluUnProjectで投影を解除する必要があります。次に、必要に応じて、glReadPixels(...、GL_RGB、...)を使用してカラーピクセルを読み取り、何らかの方法で使用します。

于 2011-06-27T05:23:34.880 に答える