0

私はこの目的のために glproject 呼び出しを使用した opengl 座標 (3D 空間に投影された) から画面座標を見つけようとしています。コードで回転と変換を使用しました。

何らかの変換を実行した後の特定の時点で、glproject api を呼び出して、特定の投影点 P(x,y,z) の画面座標を取得しました。

glproject(x,y,z,modelMatrix,projectionmatrix,ビューポート,*x_s,*y_s,*z_s);

x_s で x 画面座標を正しく取得できますが、y 座標は異なります

x にはない y の唯一の変更は、最初に glperspective を呼び出して fovy (y 方向の視野角、度数) を設定したときです。gluPerspective(60.0f, 幅/高さ,0.0001f,1000.0f);

画面上に 3D ポイントを作成し、マウス座標とは異なる GLproject を介してそのポイントの 2d(x,y) 座標を取得しています。正しい座標を取得するための可能な解決策は何ですか。

ここにコードスニペットがあります

#include<GL/glut.h>     /* Header File For The GLUT Library */
GLint Window;              /* The number of our GLUT window */
float tmp_x,tmp_y,tmp_z;
GLfloat w = 1200;         /* Window size. Global for use in rotation routine */
GLfloat h = 1200;
GLint prevx, prevy;        /* Remember previous x and y positions */
GLfloat xt=1.0,yt=1.0,zt=1.0;   /* translate */
int width = 1600;
int height = 1200;

//This function will set windowing transformation
void transform(GLfloat Width , GLfloat Height )
{
    glViewport(0,0,  (GLfloat)Width,  (GLfloat)Height);
    glPushMatrix();
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(60.0f, Width/Height,0.0001f,1000.0f); 
    glTranslatef(0.0, 0.0, -15.0f);     /* Centre and away the viewer */
    glMatrixMode(GL_MODELVIEW);
    glPopMatrix();
}


GLvoid draw_room() 
{   
int i;
glPushMatrix();
glShadeModel(GL_SMOOTH); 
glLineWidth(1.0);                             
glPointSize(4.0);                             /* Add point size, to make it clear */
glBegin(GL_POINTS);                /* start drawing the cube.*/
glColor3f(0.0f,0.0f,1.0f);            /* Set The Color To Orange*/
glColor3f(1.0f,0.0f,0.0f);            /* Set The Color To Orange*/
glVertex3f(3.1f,2.1f,2.1f); 
glEnd();                              /* Done Drawing The Cube*/
glEnable(GL_DEPTH_TEST); 
}
//OpenGl Display  callback Function It call init room
void DrawGLScene()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    printf("%f %f %f\n",xt,yt,zt);
    glPushMatrix();
    glMatrixMode(GL_PROJECTION);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glTranslatef(xt,yt, zt);
    draw_room();
    glPopMatrix();
    glutSwapBuffers();               /* Swap buffers */
    glFlush();
}

GLvoid Mouse( int b , int s, int xx, int yy)
{

    double a1,a2,a3;    
    GLint viewport[4];
    GLdouble modelview[16];
    GLdouble projection[16]; 
    glGetIntegerv(GL_VIEWPORT, viewport);  
    glGetDoublev(GL_MODELVIEW_MATRIX, modelview);   
    glGetDoublev(GL_PROJECTION_MATRIX, projection);  
    //gluProject(xt+3.1f,yt+2.1f,zt+2.1f, modelview, projection, viewport, &a1, &a2, &a3);
    gluProject(3.1f,2.1f,2.1f, modelview, projection, viewport, &a1, &a2, &a3);

    printf("Mouse: %d %d\n",xx,yy);                // Both Print are giving different coordinaes.
    printf("Unproject %f %f %f\n",a1,a2,a3);    
    switch (b) {
    case GLUT_LEFT_BUTTON:  /* only stash away for left mouse */
        prevx = xx - w/2;
        prevy = h/2 - yy;
        break;
    case GLUT_MIDDLE_BUTTON:
        break;
    case GLUT_RIGHT_BUTTON:
        break;
    }
}

これに対する可能な解決策は何ですか?

4

2 に答える 2

1

副次的な問題:

gluPerspective(60.0f, 幅/高さ,0.0001f,1000.0f);

近距離と遠距離の比率が非常に大きくなっています。これは、深さの解像度にとって非常に悪いです。原則として、ニア クリップ プレーンの距離は、シーンが許す限り、できるだけ遠くに設定する必要があります。gluPerspective によって作成された射影のファー クリップ プレーンは、できるだけ近くに設定する必要があります (射影行列がわずかに異なる場合は、ファー クリッピング プレーンを無限大に設定することもできます)。

とにかく、深度解像度が低いと、マウス ポインターの画面位置の逆投影に悪影響を及ぼします。

画面上に 3D ポイントを作成し、マウス座標とは異なる GLproject を介してそのポイントの 2d(x,y) 座標を取得しています。正しい座標を取得するための可能な解決策は何ですか。

ほとんどのウィンドウ システムは、ポインター座標系の原点を左上に置きます。OpenGL は、ビューポート座標系の原点を左下に設定します。そのため、ウィンドウ内のマウスの位置を Y=Up 軸に沿って反転する必要があります。

于 2012-12-08T11:48:39.413 に答える
1

OpenGL は画面の左下隅を座標系の原点として使用します。ウィンドウ システムは通常、座標系の原点として左上隅を使用します。この違いを処理する必要があります。例:

printf("Mouse: %d %d\n",xx,yy);                
printf("Unproject %f %f %f\n",a1,viewport[1]-a2,a3);   
于 2012-12-08T10:57:10.400 に答える