Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.10.2011, 18:47   #1
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию Растягивания выведенного на OpenGL изображения при широкоформатном разрешении

Добрый вечер, коллеги. В общем откладывал всегда я этот вопрос на потом, а теперь решил разузнать "что да как". Расскажу на примере. У меня разрешение монитора 1650 на 1050. Это равно 19 на 10. Если я выведу средствами OpenGL(на весь экран) простой квадрат, то он будет растянут, т.е. будет не квадрат, а прямоугольник. Как это можно исправить? Уменьшение координат glVertex2f() в GL_QUADS вручную не подойдет.
p.s. Что-то не могу я в своем предложении скрин сделать, надеюсь, мой рассказ вы поняли

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 09.10.2011, 19:09   #2
Greek9000
Форумчанин
 
Регистрация: 01.09.2009
Сообщений: 151
По умолчанию

это делается при задании окна просмотра (если не ошибаюсь - команда называется glView). Зная размеры области просмотра можно получить отношение ширины к высоте и потом домножить ширину области воспроизведения на этот коэффициент.
Greek9000 вне форума Ответить с цитированием
Старый 09.10.2011, 19:33   #3
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Можете привести пример. Поискав в гугле "glView" я наткнулся на какую-то утилиту, а не на функцию библиотеки.
Спасибо.

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 10.10.2011, 07:12   #4
Greek9000
Форумчанин
 
Регистрация: 01.09.2009
Сообщений: 151
По умолчанию

Вот, нашёл пример.
glViewport( 0, 0, Width, Height ); // Указываем область вывода на канве
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glOrtho(-5,5, -5,5, 2,12); // Задаём отображаемый куб
gluLookAt(0,0,5, 0,0,0, 0,1,0); // Устанавливаем вид камеры (по 3-м точкам)
glMatrixMode( GL_MODELVIEW );

Я ошибся с и именем функции и с их количеством.
Имелись ввиду ф-ии glViewport и glOrtho.
Первая задаёт область канвы на форме (или другом оконном компоненте), а вторая задаёт мировые размеры.

Более подробно можно почитать у Краснова в его книге "OpenGL Графика в проектах Delphi".
Там всё от самого начала, с примерами.
Greek9000 вне форума Ответить с цитированием
Старый 10.10.2011, 15:56   #5
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Цитата:
Более подробно можно почитать у Краснова в его книге "OpenGL Графика в проектах Delphi".
Я, собственно, делал ставку на эту книгу, но только не туда полез.
Спасибо.

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 12.10.2011, 12:19   #6
anyx
Форумчанин
 
Регистрация: 10.09.2009
Сообщений: 352
По умолчанию

Я делал так (и это лучшее, на мой взгляд, решение):
Код:
void OnResize(int w, int h) // Вызывается при изменении размера окна и при его создании
{
    int left = 0, top = 0;
    int width = w, height = h;

    if (w > h * 4 / 3) // Если экран шире необходимого
    {
        width = h * 4 / 3;
        left = (w - width) / 2;
    }
    else // Наоборот, если экран выше необходимого
    {
        height = w * 3 / 4;
        top = (h - height) / 2;
    }

    glViewport(left, top, width, height); // Устанавливаем область отображения

    // Здесь другие действия, выполняемые при изменении/создании окна
    // ...
}
Понятно, что делает этот код: при несоответствии размеров окна он указывает OpenGL, в какой области рисовать (по умолчанию - всё окно)
anyx вне форума Ответить с цитированием
Старый 14.10.2011, 14:27   #7
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

У меня так было. Но объекты растягиваются. А мне нужно, чтобы они были одинаковыми при любых размерах окна. Но все равно спасибо.

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 14.10.2011, 14:49   #8
anyx
Форумчанин
 
Регистрация: 10.09.2009
Сообщений: 352
По умолчанию

Цитата:
Сообщение от _PROGRAMM_ Посмотреть сообщение
У меня так было. Но объекты растягиваются. А мне нужно, чтобы они были одинаковыми при любых размерах окна. Но все равно спасибо.
Этот код (мой предыдущий пост) только позволяет поддерживать область отображения нужных пропорций, заполняя лишнее пространство чёрным с боков или по краям экрана. Чтобы внутри этой области объекты сохраняли пропорции, нужно каждый раз при изменении размера окна создавать матрицу. Для этого есть продолжение моего кода, где создаётся перспективная матрица проекции:

Код:
    // Здесь другие действия, выполняемые при изменении/создании окна
    // ...
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity(); // Возможно эта строчка лишняя, не уверен
    gluPerspective(
        4 / 3, // Отношение сторон экрана
        60, // Угол зрения
        0.001, // Ближняя точка отсечения. Ноль нельзя
        100); // Дальняя точка отсечения

    glMatrixMode(GL_MODELVIEW);
И затем уже в коде отрисовки при перерисовке в цикле просто загружаем единичную матрицу модели командой glLoadIdentity()
anyx вне форума Ответить с цитированием
Старый 15.10.2011, 16:43   #9
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Спасибо, но мне хватило glOrtho. Именно она приводит мою программу к нужным результатам. Если изменить на более большее разрешение, то в вашем случае заполнится черным цветом, а мне нужно было чтобы становилось видно то, что раньше было за пределами окна. Еще раз повторю, что мне хватило последнего поста Greek9000. Этим я решил проблему.
Спасибо.

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не могу вывести часть изображения. OpenGL fmonkey3105 Gamedev - cоздание игр: Unity, OpenGL, DirectX 2 02.07.2011 21:37
OpenGL, сохранение изображения в файл Syn-McJ C++ Builder 0 02.03.2011 19:47
OpenGL. Деформация изображения. BOBAH13 Общие вопросы C/C++ 2 11.11.2009 14:50
Вывод врагмента изображения на весь экран в OpenGL LMan Помощь студентам 0 13.09.2009 17:51
Координаты формы при различном разрешении экрана Fataller Помощь студентам 13 28.03.2009 10:51