2013-11-09 67 views
2

我想在按住鼠标左键的同时在openGL中移动图像。 我不是试图拖动一个物体,只是移动整个图片。它是一个分形的二维图,我被告知我可以使用gluortho2d,但我找不到任何信息或类似的尝试如何做到这一点。 我假设像用鼠标在openGL中移动绘图

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(); 
} 

为500×500的窗口,但它不工作。我离开的那一刻,窗口一片空白。 任何想法?

+0

可能有一个溢出和图片出去屏?虽然我不知道答案,但这应该有助于您调试问题。在mouse_callback_func()中的提示符上打印x和y的值。 一旦你得到这个值,用gluOrtho2D替换它们(x-250.0,x + 250.0,y-250.0,y + 250)。并正常渲染图像(现在不要使用鼠标)。检查画面是否正确显示在屏幕上。我认为它不会,然后你可以尝试减少/增加值来检查将呈现给你的视口的x/y值的范围。 – viktorzeid

+0

你最初的预测是什么? – jozxyqk

+0

我尝试过,但它没有奏效。我甚至低至x-1,x + 1,y-1,y + 1看看会发生什么,仍然屏幕变空白 – Deadalus

回答

1

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 
    ... 
+0

我被告知这正是gluortho2d可以做到的。而不是实际移动我的照片,我可以改变观看窗口(即移动相机)。我被要求与gluortho2d具体做到这一点:S – Deadalus

+0

我玩弄glMatrixMode(GL_PROJECTION)等etc等 我什么都得不到,是不断重绘,即使我包括postredisplay.After我拖动我的鼠标左键单击,没有任何更改,然后我必须右键单击并选择一个数字(右键单击可以更改组成该图片的随机点的数量)。 – Deadalus

+0

您*可以*使用投影矩阵来“移动相机”,但如果引入了照明,它将不起作用。 OpenGL没有相机概念。做出一个唯一的方法是在场景中移动所有内容。考虑上面的'glTranslatef' - 通过移动场景中的所有内容,摄像机向右移动。这就是摄像头的实现方式。你也可以添加'glRotatef'来让相机旋转。 ['gluLookAt'](http://www.opengl.org/sdk/docs/man2/xhtml/gluLookAt.xml)是一个方便的函数,直到你自己完成矩阵转换。 – jozxyqk