2009-03-08 3 views
1

Я создаю простое приложение OpenGL для 2D, но, похоже, у меня возникают проблемы с камерой. Когда я рисую прямоугольник на (20,20), он рисуется на (25,20) или около того. Когда я рисую его (100, 20), он рисуется на 125 или около того. По некоторым причинам все смещается вправо на несколько процентов.Проблема с координатой OpenGL

Я вставил обрезанную вниз версию здесь http://pastebin.com/m56491c4c

там что-то не так с тем, как я настраиваю GLUT? Я знаю, что это не мои объекты, делающие что-то странное, поскольку то же самое происходит, когда я их отключил.

Заранее спасибо.

ответ

3

Вам необходимо установить матрицу проекции внутри функции RESHAPE (resize()), которая автоматически решает проблему пользователь изменяет размер окна:

void resize(int w, int h) 
{ 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluOrtho2D(0, w, h, 0); 
} 

, а затем в вашей функции вытяжки, убедитесь, что режим матрицы модельно вид:

void draw() 
{ 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    ... 
} 

Другие проблемы с вашим кодом:

  • Вы, вероятно, не должны звонить glutPostRedisplay() в конце draw(). Это заставит ваш процессор работать на 100%. Вместо этого вы можете использовать glutTimerFunc(), чтобы получать обновления каждые несколько миллисекунд.
  • В processMouse(), вы используете wsprintf() на массив char с: wsprintf() принимает массив широких символов (wchar_t), так что вы должны сделать локальную переменную s типа wchar_t[] или использовать sprintf() и MessageBoxA() вместо wsprintf() и MessageBoxW() (к которому MessageBox() расширяется как макрос при компиляции приложения Юникод, который я предполагаю, что вы это делаете). Вы также уязвимы для переполнения буфера - вы должны использовать буфер размером не менее 12 символов, хотя реально вам никогда не будет передано очень большое значение x. Наконец, вы должны также использовать snprintf()/wsnprintf() вместо sprintf()/wsprintf() для защиты от переполнения буфера.
+0

Спасибо, что исправил это! Спасибо за ваши другие предложения. Я знаю, что это грязный код, мне просто нужен быстрый рабочий образец для публикации. Еще раз спасибо! – Alexander

0

Вы, кажется, называете свой glOrtho2D своей матрицей ModelView. Я сомневаюсь, что это проблема (так как я предполагаю, что в этом случае ваше Проектирование должно быть личным), но вы все равно должны называть его на своей матрице проекций.

Вы также должны распечатать w и h в своем изменении размера, просто чтобы убедиться, что размер вашего окна на самом деле является тем, что вы думаете (я не знаю, как работает перенасыщение, но glutInitWindowSize() может включать в себя границы, что может испортить вещи).

+0

Я уже пробовал настроить его в том порядке, который вы предложили, без везения. Я возился с выводами и довольно уверен, что размер окна правильный. Все идеи. – Alexander

0

Это зависит от того, в какой системе вы работаете, но обычно большинство систем координат окон начинаются в левом нижнем углу и подсчитываются вверху и вправо. В этом случае ваш вызов gluOrth02D будет неправильным.

У вас есть:

gluOrtho2D(0, appWidth, appHeight, 0); 

Что имеет в верхней части окна отображения в нижнем, вице-стих.

Большую часть времени это:

gluOrtho2D(0, appWidth, 0, appHeight); 

Как я сказал, что это зависит от системы, платформы вашей работы с. Я могу говорить только для большинства реализаций Linux.

Просто что-то еще, чтобы проверить на случай, если это повлияет на вашу ошибку.

Смежные вопросы