3

私はGLUTの使用にかなり慣れていないため、クリックアンドドラッグの開始点と終了点を記録することにより、マウスを使用して長方形を描くプログラム(ここで見つけました、最初の応答)をコンパイルしようとしています。

クリーンなコピー/ペーストとして、コンパイルはしますが何も描画しません。( setup() 関数で)背景色を黒に変更した後でも、白い画面が表示されるだけです。いくつかの情報源を読んで、このプログラムが draw 関数と reshape 関数に欠落がないことを確認しました。すべて揃っています。

ウィンドウを作成し、ビューポートをウィンドウの寸法に設定し、gluOrtho2D 関数を使用してマッピングを設定します (ウィンドウとビューポートは同じ寸法であるため、マッピングをウィンドウの寸法に設定します)。マウス コールバックは、左クリックした場所と左クリックを離した場所を記録し、glutPostRedisplay() 関数を呼び出して、ウィンドウを新しい座標で再描画します。少しデバッグした後、座標が適切に記録および保存され、ピクセル単位で測定されることを発見しました (x と y は 0 とウィンドウの次元の間の整数です)。座標を使用します。しかし、私が言ったように、それは白い画面しか表示しません。

では、長方形の描画方法に何か問題がありますか? ウィンドウのマッピングが間違っていますか? 私は真剣に迷っています。どんなフィードバックでも大歓迎です。

EDIT2: glutInitDisplayMode を GLUT_SINGLE から GLUT_DOUBLE に変更し、非インタラクティブな白い画面全体を修正しました。これで、反転した y 座標 (これを修正しました) を使用してマウスで四角形を描画し、今ではうまく機能します。ご提案ありがとうございます。

これが私のプログラムです(EDIT1:コメントを追加):

#include <cstdlib>
#include <GL/glut.h>    

using namespace std;

GLsizei width, height;

struct Position
{
    Position() : x(0), y(0) {}
    float x;
    float y;
};

Position start;  // Records left-click location
Position finish; // Records left-click release location

void display()
{
    glClear(GL_COLOR_BUFFER_BIT); // clear window

    glColor3ub(rand()%256, rand()%256, rand()%256); // generates random color
    glBegin(GL_QUADS);
        glVertex2f(start.x,start.y);
        glVertex2f(finish.x,start.y);
        glVertex2f(finish.x,finish.y);
        glVertex2f(start.x,finish.y);
    glEnd();

    glutSwapBuffers(); // display newly drawn image in window
}

void reshape( int w, int h )
{
    glViewport( 0, 0, (GLsizei)w, (GLsizei)h ); // set to size of window
    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();

    gluOrtho2D( 0.0, (float)w, 0.0, (float)h );

    width = w;  // records width globally
    height = h; // records height globally

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

void mouse(int button, int state, int x, int y)
{
    switch(button)
    {
    case GLUT_LEFT_BUTTON:

        if(state==GLUT_DOWN) 
        {
            start.x = x; //x1
            start.y = y; //y1                          
        }
        if(state==GLUT_UP)
        {
            finish.x = x; //x2
            finish.y = y; //y2
        }
        break;  
        glutPostRedisplay();
    }
}

void motion( int x, int y )
{
    finish.x = x;
    finish.y = y;
    glutPostRedisplay();
}

void setup()
{
    glClearColor(0.0, 0.0, 0.0, 1.0); // *should* display black background
}

int main(int argc, char** argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
    glutInitWindowSize(640,480);
    glutInitWindowPosition(100,100);
    glutCreateWindow("");

    setup();

    // initializing callbacks
    glutReshapeFunc(reshape);
    glutDisplayFunc(display);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);

    glutMainLoop();
    return 0;
}
4

1 に答える 1

3

私のコメントが示唆したように:

変化する:

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);

に:

glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
于 2013-09-24T15:03:29.043 に答える