Итак, моя программа открывает файл, читает в xyz-points, а затем рисует из нее линейную полосу. Первоначально эта программа была написана на SharpGL (реализована как окно WPF), и она работала, но не очень хорошо из-за использования непосредственного режима, поэтому я перешел на OpenGL в C ++. Я (немного) разобрался с VBO и теперь я пытаюсь добавить функциональность мыши. Моя проблема в том, что я не могу переместить изображение с помощью мыши, я хочу иметь возможность щелкнуть и «перетащить» изображение. Мои mouseClickFunc и mouseMotion работают (мои операторы cout выполняются), однако кажется, что мой переводящий вызов никогда не выполняется (то есть картинка начинает частично «обрезаться» в сцене, и я хотел бы иметь возможность перетаскивать ее и центрировать ее). Я знаю, что это выстрел в темноте, но я действительно не уверен, что делать.
MotionFunc:
void mouseMotion(int x, int y)
{
if (moveable)
{
xMove += xTransform(x) - xTransform(xDown);
yMove += yTransform(y) - yTransform(yDown);
xDown = x;
yDown = y;
cout << yMove << "---" << xMove << endl;
glutSwapBuffers();
glutPostRedisplay();
}
}
Функция дисплея:
void RenderFunction(void)
{
++FrameCount;glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glOrtho(xMin - 1, xMax + 1, yMin - 1, yMax + 1, -diameter * zScale, diameter * zScale);
// Reset the modelview matrix.
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);glLoadIdentity();
glPushMatrix();
glTranslatef(xMove, -yMove, 0);
//glViewport((GLint)xMove*100, (GLint)-yMove*100, CurrentWidth, CurrentHeight);//glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDrawArrays(GL_LINE_STRIP, 0, 29000);
glPopMatrix();
glutSwapBuffers();
glutPostRedisplay();}
Я уверен, что есть еще код, который мне нужно показать, и именно в этом проблема. Любая помощь будет принята с благодарностью.
Вот изображение вывода консоли и экрана (контекст OpenGL), как я это вижу.
ОБНОВЛЕНИЕ: обновил мой код. Похоже, мои координаты движутся, но картинка не так, если это имеет смысл. Если вы посмотрите на мой вывод, если я продолжу «перетаскивать» изображение, вы увидите в консоли, что переменные xMove и yMove могут быть такими большими или маленькими, как они хотят, опять же, переводчик просто не перемещает его.
Вы вытаскиваете свою матрицу перед тем, как рисовать вещи, что сбрасывает матрицу в состояние последней матрицы нажатия Переехать glPopMatrix();
под тиражом
Вы выскакиваете матрицу, прежде чем позвонить glDrawArrays()
так что это естественно сводит на нет эффект перевода. Это также сводит на нет glOrtho()
вызов, но это должно быть выдано на матрицу проекции, а не на матрицу просмотра модели в первую очередь.
И, конечно же, проблема в вашем коде, а не в OpenGL.
В этом фрагменте кода:
glLoadIdentity();
glPushMatrix();
glTranslatef(xMove, -yMove, 0);
//glViewport((GLint)xMove*100, (GLint)-yMove*100, CurrentWidth, CurrentHeight);
glOrtho(xMin - 1, xMax + 1, yMin - 1, yMax + 1, -diameter * zScale, diameter * zScale);
glPopMatrix();
//glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDrawArrays(GL_LINE_STRIP, 0, 29000);
ты :
Поэтому ваш перевод игнорируется.
Это правильная операция:
glLoadIdentity();
glPushMatrix();
glTranslatef(xMove, -yMove, 0);
//glViewport((GLint)xMove*100, (GLint)-yMove*100, CurrentWidth, CurrentHeight);
glOrtho(xMin - 1, xMax + 1, yMin - 1, yMax + 1, -diameter * zScale, diameter * zScale);
//glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDrawArrays(GL_LINE_STRIP, 0, 29000);
glPopMatrix();
Вы умножаете проекцию перед переводом, не забывайте всегда читать матричное преобразование из нижней части в OpenGL 1.1, которую вы должны обновить IMO. Другая проблема заключается в том, что вы открываете матрицу перед рисованием.
Правильный код:
//glViewport((GLint)xMove*100, (GLint)-yMove*100, CurrentWidth, CurrentHeight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(xMin - 1, xMax + 1, yMin - 1, yMax + 1, -diameter * zScale, diameter * zScale);
// Reset the modelview matrix.glMatrixMode(GL_MODELVIEW);glLoadIdentity();
glPushMatrix();
glTranslatef(xMove, -yMove, 0);//glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDrawArrays(GL_LINE_STRIP, 0, 29000);
glPopMatrix();