3

マウスの左ボタンを押したまま、openGL で画像を移動しようとしています。オブジェクトをドラッグしようとしているのではなく、画像全体を移動するだけです。フラクタルの 2D 描画であり、gluortho2d を使用できると言われましたが、それを行う方法に関する情報や同様の試みが見つかりません。私は次のようなものを想定しています

void mouse_callback_func(int button, int state, int x, int y)
{
    if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
    gluOrtho2D(x-250.0, x+250.0, y-250.0,y+250.);
glutPostRedisplay();
}  

500x500 ウィンドウの場合、動作しません。ウィンドウを左クリックした瞬間、空白になります。何か案は?

4

1 に答える 1

2

gluOrtho2D現在のマトリックスを変更します。glMatrixMode(GL_PROJECTION)たとえば、次のように使用するように設計されています。

glMatrixMode(GL_PROJECTION); //start editing the projection matrix
glLoadIdentity(); //remove current projection
gluOrtho2D(...); //create new one
glMatrixMode(GL_MODELVIEW); //back to editing the modelview matrix

カメラのコンセプトを設定する方が簡単かもしれません...

float cameraX, cameraY;
int lastMouseX, lastMouseY;

void mouse_callback_func(int button, int state, int x, int y)
{
    int dx = x - lastMouseX;
    int dy = y - lastMouseY;
    const float speed = 0.1f;
    if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
    {
        cameraX += dx * speed; //or -=, depending on which direction feels more natural to you
        cameraY -= dy * speed; //-= as mouse origin is top left, so +y is moving down
        glutPostRedisplay();
    }
    lastMouseX = x;
    lastMouseX = y;
}

void display()
{
    glLoadIdentity(); //remove transforms from previous display() call
    glTranslatef(-cameraX, -cameraY, 0.0f); //move objects negative = move camera positive
    ...
于 2013-11-10T08:01:45.033 に答える