Преобразование позиции окна SDL в мировую позицию OpenGL

Я использую SDL и OpenGL для этого проекта. Мой экран при запуске программы имеет разрешение 640 x 480, как и мои настройки glOrtho. Таким образом, программа запускается синхронно. Но моя программа позволяет пользователю создать выбор с помощью мыши части дисплея для увеличения. Например, пользователь может выбрать область от 320 240 (_mouseStart) до 640 480 (_mouseEnd). Эта область выбора затем передается в glOrtho, чтобы он мог центрировать и масштабировать выбранную область. Моя проблема заключается в том, что я пытаюсь выбрать область уже увеличенной области, потому что координаты мыши SDL находятся в диапазоне от 0,0 до 640 480 вместо новой выбранной области, которая в этом случае была от 320, 240 до 640 480. Мне нужен способ вычислить реальную позицию мыши при попытке выбрать и уже увеличить область.

Я не мог публиковать фотографии здесь, но я создал пост на gamedev.net, на который вы можете ссылаться, если вам нужна дополнительная информация. http://www.gamedev.net/topic/636257-opengl-2d-selection-scaling-multiple-times/

Здесь я вычисляю все положение мыши после того, как пользователь выбрал область (ЧТО ТЕПЕРЬ ПРАВИЛЬНО)

// modify mouse coordinates to fit scaled image
            _mouseStart.x = ((_mouseStart.x / SCREEN_WIDTH) * (_portionEnd.x - _portionStart.x)) + _portionStart.x;
            _mouseStart.y = ((_mouseStart.y / SCREEN_HEIGHT) * (_portionEnd.y - _portionStart.y)) + _portionStart.y;
            _mouseEnd.x = ((_mouseEnd.x / SCREEN_WIDTH) * (_portionEnd.x - _portionStart.x)) + _portionStart.x;
            _mouseEnd.y = ((_mouseEnd.y / SCREEN_HEIGHT) * (_portionEnd.y - _portionStart.y)) + _portionStart.y;

Вот как я сбрасываю glOrtho по центру и отображаю выбранную область.

glLoadIdentity();
glOrtho(_portionStart.x, _portionEnd.x, _portionEnd.y, _portionStart.y, 1, -1);

person arnm    schedule 24.12.2012    source источник


Ответы (1)


Я создал изображение, которое объясняет процесс (надеюсь)

  • Синий прямоугольник — это ваш (без увеличения) базовый экран просмотра.
  • Маленький зеленый прямоугольник — это область, выделенная в базовом окне просмотра.
  • Большой зеленый прямоугольник — это новое увеличенное окно просмотра.
  • В увеличенном окне просмотра выбран новый прямоугольник (красный)

Красные координаты в красном прямоугольнике — это координаты, которые вы должны получить из положения мыши. Вы можете использовать эти координаты для вычисления значений для вашего текущего увеличенного окна просмотра (зеленые координаты). Чтобы получить окончательные немасштабированные координаты (синие значения), вам нужно добавить смещение зеленого прямоугольника (228,88).

Обратите внимание, что мой пример не самый лучший, потому что смещение зеленого прямоугольника и высота зеленого прямоугольника идентичны (оба значения равны 228).

вычисления

person micha    schedule 24.12.2012
comment
Спасибо за подробный пример, но я пытаюсь пойти противоположным путем. Я пытаюсь рассчитать, какими должны быть увеличенные координаты x и y из немасштабированных координат x и y. Другими словами, я пытаюсь вычислить зеленые координаты из синих координат и красные координаты из зеленых координат. - person arnm; 25.12.2012
comment
Хм, ты уверен, что понял мою картинку? Я думаю, что ошибся с верхней левой красной координатой x, потому что 120 слишком мало. Но если посмотреть в правый нижний угол. (564,392) — это абсолютная позиция мыши, которую вы получаете (от 0,0 до 640,480). 330,186 — это координата относительно зеленого прямоугольника, а 558,274 — это координата, которую вы можете использовать для вычисления нового окна просмотра. - person micha; 25.12.2012
comment
Таким образом, красные координаты — это абсолютные координаты мыши. Итак, мы сначала умножаем ширину экрана на ширину выделения, а затем делим на абсолютную координату x мыши, чтобы получить координату x, соответствующую увеличенному изображению. Мы используем эту новую координату x и добавляем к ней начальное значение координаты x для текущего увеличенного выделения. Мы делаем это и для значений y, и это должно быть так. Правильно? - person arnm; 25.12.2012
comment
Да, это должно работать. [mouse position] / [maximal horizontal mouse coordinate] * [selection width] + [x offset for the zoomed section] -> 564 / 640 * 374 + 228 - person micha; 25.12.2012
comment
Хорошо, это сработало! Ты гений! Мне потребовалось так много времени, чтобы получить это! Я ценю это. - person arnm; 25.12.2012