0

マウスの動きを検出し、マウスの位置にボールを描画する必要があります。ボールがワールド座標にある必要があります。だから私はglUnProjectこのタスクに使用しようとしていますが、今まで成功していないようです。これは私のmotionFuncです:

void motionFunc( int x, int y)
{


    GLint viewport[4];
    GLdouble modelview[16];
    GLdouble projection[16];
    GLfloat winX, winY, winZ;
    GLdouble posX, posY, 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, &winZ );

    gluUnProject( winX, winY, winZ, modelview, projection, viewport, &posX, &posY, &posZ);      //printf("winz: %f posz: %f\n",winZ,posZ);
    Ball.x=posX;
    Ball.y=posY;
    Ball.z=posZ;
    //printf("%f %f %f\n",Ball.x,Ball.y,posZ);
    glutPostRedisplay();
}

ここで、glutPostRedisplay にブレークポイントを追加しました。マウスをクリックしてドラッグすると、ボールの座標 (Ball.x,Ball.y,Ball.z) は次のようになります。

(Ball).x -727.175354
(Ball).y 407.310242
(Ball).z -865.000610

なぜz座標はこれまでですか?私のカメラは z=+135 にあります。私のモデルの他のオブジェクトは、z= -3 から +3 のようなものです。ボールの z 座標が同じ範囲にある必要があります。

さて、正確にはwinZ何ですか?ここでは、常に 1.00 になることを確認しました。ハードコーディングを試みたところwinZwinZ=0.85ボールが常にマウスの下にあるように見えます (マウスでボールをドラッグでき、ボールは常にポインターの下にあります)。しかし、ボールの座標は次のようになります。

(Ball).x -4.67813921
(Ball).y 2.57806134
(Ball).z 128.370895

これはカメラに非常に近いですが、x 座標と y 座標は私には適していません。それらは常に原点の近くにあることがわかります。これは私が望むものではありません。他のオブジェクトの x 座標と y 座標の範囲が広くなっています。

最後に、私の質問は、正しい方法glUnprojectまたは同じ種類のものは何ですか?

4

1 に答える 1

1

2D マウス座標は、3D ワールド座標に明確にマップ解除できません。2D 座標は、3D 空間の線に対応します。winz は、この行のどの点が返されるかに影響します。winz に 0.0 を使用すると、近くのクリッピング プレーンでポイントが得られます。1.0 を使用すると、ファー クリッピング プレーンでポイントが得られます。

深度バッファを使用している場合は、glReadPixels 関数を使用して深度バッファから値を取得し、それを winz として使用できます。これは、Java での私のおもちゃのプロジェクトのコードの一部です。

    FloatBuffer depth = BufferUtils.createFloatBuffer(1);
    glReadPixels(mouse_x, mouse_y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, depth);

    depth.rewind();
    FloatBuffer farPos = BufferUtils.createFloatBuffer(3);
    GLU.gluUnProject(mouse_x, mouse_y, depth.get(), 
            mainContext.getModelviewMatrix(), 
            mainContext.getProjectionMatrix(), viewport, farPos);

変な NIO バッファを除いて、ほとんどは C/C++ でも同じです。

于 2012-08-18T16:02:53.440 に答える