1

そのため、3D ピッキングの概念を理解しようとしてきましたが、実際に英語を話すビデオ ガイドや具体的なガイドが見つからないため、非常に難しいことがわかりました。LWJGL での 3D ピッキングの経験が豊富な人がいる場合は、すべての意味を行ごとに説明した例を教えてください。私がやろうとしているのは、画面の中心 (マウスがある場所ではない) から光線を放ち、通常の立方体 (6 QUADS でレンダリング) を検出することだけです。

4

1 に答える 1

1

私は3Dピッキングの専門家ではありませんが、以前に行ったことがあるので、説明しようと思います。

マウスの位置ではなく、光線を発射したいとおっしゃいました。この光線が画面に平行である限り、この方法は、ランダムな画面座標の場合とまったく同じように機能します。そうでない場合、そしてあなたが実際にある方向に角度を付けて光線を発射したいのであれば、物事はもう少し複雑になりますが、私は(まだ)それには入りません。

では、コードはどうですか?

Object* picking3D(int screenX, int screenY){
    //Disable any lighting or textures
    glDisable(GL_LIGHTING);
    glDisable(GL_TEXTURE);

    //Render Scene
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    orientateCamera();

    for(int i = 0; i < objectListSize; i++){
        GLubyte blue = i%256;
        GLubyte green = min((int)((float)i/256), 255);
        GLubyte red = min((int)((float)i/256/256), 255);
        glColor3ub(red, green, blue);
        orientateObject(i);
        renderObject(i);
    }

    //Get the pixel
    GLubyte pixelColors[3];
    glReadPixels(screenX, screenY, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, pixelColors);

    //Calculate index
    int index = pixelsColors[0]*256*256 + pixelsColors[1]*256 + pixelColors[2];

    //Return the object
    return getObject(index);
}

コードノート:

  • screenXはピクセルのx位置、screenYはピクセルのy位置(画面座標)です。
  • orientateCamera()は、シーン内でカメラを配置(および回転)するために必要なglTranslate、glRotate、glMultMatrixなどを呼び出すだけです。
  • orientateObject(i)は、シーン内のオブジェクト'i'を除いて、orientateCameraと同じように機能します。
  • 'インデックスを計算する'とき、私は実際には、インデックスを取り戻すためにレンダリング中に実行した計算を元に戻しています。

このメソッドの背後にある考え方は、すべてのモデルが単色であることを除いて、各オブジェクトがユーザーの見たとおりに正確にレンダリングされることです。次に、要求された画面座標のピクセルの色を確認し、色がインデックス付けされているモデルを確認します。これがオブジェクトです。

ただし、実際にオブジェクトに当たらない場合に備えて、背景色(またはglClearColor)のチェックを追加することをお勧めします。

必要に応じて、さらに説明を求めてください。

于 2012-05-30T02:42:40.267 に答える