3

gluProject() を使用して 3D 点から計算された 2D 点に 2D 画像を表示したいと考えています。3D ポイントがあり、gluProject を使用してその 2D 座標を取得し、この時点で画像を表示します。それはうまくいきますが、私の画像が画面上に2回表示されるZ座標に問題があります:実際に表示される場所と「反対」に表示されます。

例を見てみましょう: カメラは (0,0,0) にあり、(0,0,-1) を見ているので、負の Z の方向です。

私はオブジェクトに 3D ポイント (0,0,-1) を使用します。gluProject は 2D ポイントとしてウィンドウの中心を与えてくれます。

したがって、(0,0,-1) の方向を見ると、2D イメージが表示されます。回転すると、ポイント (0,0,-1) が見えなくなるまでうまく移動し、2D イメージが外に出ます。画面なので表示されません。

しかし、(0,0,1)を見ると、それも表示されます。したがって、たとえば 3D ポイント (0,0,-1) と (0,0,1) を使用すると、(2D 画像の表示に対して) 同じ結果が得られます。gluProject が返す Z 座標に何か関係があると思いますが、何なのかわかりません。

これが私のコードです:私のzNear = 0.1およびzFar = 1000

    GLint viewport[4];
    GLdouble modelview[16];
    GLdouble viewVector[3];
    GLdouble projection[16];

    GLdouble winX, winY, winZ;//2D point

    GLdouble posX, posY, posZ;//3D point
    posX=0.0;
    posY=0.0;
    posZ=-1.0;//the display is the same if posZ=1 which should not be the case

    //get the matrices
    glGetDoublev( GL_MODELVIEW_MATRIX, modelview );

    viewVector[0]=modelview[8];
    viewVector[1]=modelview[9];
    viewVector[2]=modelview[10];

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

    int res=gluProject(posX,posY,posZ,modelview,projection,viewport,&winX,&winY,&winZ);

    if(viewVector[0]*posX+viewVector[1]*posY+viewVector[2]*posZ<0){
            displayMyImageAt(winX,windowHeight-winY);
    }

では、2D 画像を適切に表示するには、つまり Z を考慮するにはどうすればよいでしょうか?

4

2 に答える 2

4

gluProject は正しく機能します。射影行列はスクリーン平面にポイントを投影します。ポイントが後ろにあるかどうかを確認する必要があります。これは、ビュー ベクトルとポイントへのベクトルの内積を計算することで実現できます。0 未満の場合、ポイントは後ろにあります。

于 2013-07-10T09:14:30.717 に答える
0

あなたの DisplayImageAt 関数は何ですか?

私のコードで与えられたこの表示機能に似ていますか? 選択した3D座標の2D座標も取得しようとしています。

これが私のディスプレイのほとんどすべてです.. `void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glLoadIdentity();
glMultMatrixd(_matrix);

glColor3f(0.5,0.5,0.5);
glPushMatrix();                                                 //draw terrain
glColor3f(0.7,0.7,0.7);
glBegin(GL_QUADS);
    glVertex3f(-3,-0.85,3);
    glVertex3f(3,-0.85,3);
    glVertex3f(3,-0.85,-3);
    glVertex3f(-3,-0.85,-3);
glEnd();
glPopMatrix();

glPushMatrix();

myDefMesh.glDraw(meshModel);

glPopMatrix();

glutSwapBuffers();

}'

于 2015-10-09T00:41:07.200 に答える