2

修正方法がわからないバグに遭遇しました。ウィンドウをクリックすると、3D 空間のポイントが実際のウィンドウの x 軸のクリックに直接マップされません。クリックしたポイントと 3D 空間での光線の実際の作成との不一致は、ウィンドウの x 軸の中央から遠ざかるにつれて比例して増加します。y 軸は問題なく動作します。これは単なる x 軸です。

これは、マウスをクリックした 3D 空間で作成された正方形の図です。端だけをクリックして、ウィンドウ内を移動しました。(カメラアングルが下を向いているため四角が六角形に見えることもあるが、それは重要ではない、左右のずれはある)

例

ウィンドウをクリックして 3D 空間で光線を作成するために使用したコードを次に示します。

    GLfloat window_height = 800;
    GLfloat window_width  = 800;

    void proccess_Mouse(int button, int state, int x, int y) {
            glMatrixMode(GL_PROJECTION);
            glLoadIdentity();
            gluPerspective(camera->getAngle(), window_height / window_width, viewPlane_close, viewPlane_far);

            glMatrixMode(GL_MODELVIEW);
            glLoadIdentity();
            gluLookAt(camera->getIndex_position(0), camera->getIndex_position(1),   camera->getIndex_position(2),
                      camera->getIndex_looking(0),  camera->getIndex_looking(1),    camera->getIndex_looking(2),
                      0,                                    -1,                             0);

            // matrix information
            GLint viewport[4];
            GLdouble modelview[16];
            GLdouble projection[16];

            GLfloat winX, winY;                // clicked coords on the screen
            GLdouble near_x, near_y, near_z;   // position of the mouse on the near view plane
            GLdouble far_x, far_y, far_z;      // position of the mouse on the far view plane

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

            winX = (float)x;
            winY = (float)viewport[3] - (float)y; // window height - click position

            gluUnProject(winX, winY, 0.0, modelview, projection, viewport, &near_x, &near_y, &near_z);
            gluUnProject(winX, winY, 1.0, modelview, projection, viewport, &far_x, &far_y, &far_z);

            Vector3f* near = new Vector3f(near_x, near_y, near_z);
            Vector3f* far  = new Vector3f(far_x, far_y, far_z);

            ...
    }

何かを見逃しているか、何かを忘れていると思いますが、見えません。何か案は?

4

1 に答える 1

3

一見すると、間違ったアスペクト比を gluPerspective に渡しているように見えます。2 番目のパラメーターは、幅/高さである必要があります。

于 2013-06-16T17:14:13.750 に答える