Вопрос

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

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

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

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

Это было полезно?

Решение

Вам необходимо установить матрицу проекции внутри функции изменения формы (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() расширяется как макрос при компиляции приложения Unicode, что, как я предполагаю, вы и делаете).Вы также уязвимы к переполнению буфера — вам следует использовать буфер длиной не менее 12 символов, хотя на самом деле вам никогда не будет передан очень большой код. x ценить.Наконец, вы также должны использовать snprintf()/wsnprintf() вместо sprintf()/wsprintf() для защиты от переполнения буфера.

Другие советы

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

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

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

У вас есть:

gluOrtho2D(0, appWidth, appHeight, 0);

Который имеет верхнюю часть окна, отображающуюся снизу, наоборот.

В большинстве случаев это так:

gluOrtho2D(0, appWidth, 0, appHeight);

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

Еще кое-что, чтобы проверить, может ли это повлиять на вашу ошибку.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top