Четверг, 28 Марта 2024, 13:35

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Программирование » C/C++ » OpenGL (маштабирование)
OpenGL
imperator12Дата: Среда, 27 Марта 2013, 19:58 | Сообщение # 1
почетный гость
Сейчас нет на сайте
Здравствуйте. Начал учить OpenGL и вот столкнулся с такой проблемой как масштабирование, вроде бы все и решал но при создании сетки возникли проблемы.
Вот код. Код main() не даю за ненадобностью.
Код
float width,height;
void RenderScene(void)
{
  glClear(GL_COLOR_BUFFER_BIT);
  glColor3f(0.0f,0.0f,1.0f);
glBegin(GL_LINES);
for(int i=-width/2;i<=width/2; i+=20)
{
glVertex2f(i,height/2);
glVertex2f(i,-height/2);
}
glEnd();

  glFlush();
}
void ChangeSize(GLsizei w, GLsizei h)
{
  GLfloat appect;
  if(h ==0)
   h=1;

  glViewport(0,0,w,h);
     glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  appect = (GLfloat)w /(GLfloat)h;
  if(w<=h)
  {
   glOrtho(-w/2,w/2,(-h/2)/appect,(h/2)/appect,1.0,-1.0);
   height =h/appect;width=w;
  }
  else
  {
   glOrtho((-w/2)*appect,(w/2)*appect,-h/2,h/2,1.0f,-1.0f);
   height =h;width=w*appect;
  }
  glMatrixMode(GL_MODELVIEW);
   
}


Проблема в том что я не могу понять почему при увеличении размеров окна в ширину уменьшается расстояние между линиями. Ведь шаг пространства между ними не изменяется.
OpenGOOДата: Четверг, 28 Марта 2013, 01:21 | Сообщение # 2
почти ветеран
Сейчас нет на сайте
Цитата (imperator12)
Проблема в том что я не могу понять почему при увеличении размеров окна в ширину уменьшается расстояние между линиями. Ведь шаг пространства между ними не изменяется.


Когда не пропорционально изменяется размер окна, изменяется aspect ratio (меняется пропорция пикселя), что и приводит к искажению изображения.


Мои проекты:
- Свободный и открытый клон World Of Goo
- TrueEngine2D (2D игровой фреймворк основанный на FreeBASIC)

[GameMaker: Studio v1.4.9999]
ArchidoДата: Четверг, 28 Марта 2013, 08:52 | Сообщение # 3
Сэнсэй
Сейчас нет на сайте
Проекция ортографическая? Обновляешь ее при ресайзе окна?

C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
Deeem_ERДата: Четверг, 28 Марта 2013, 10:50 | Сообщение # 4
был не раз
Сейчас нет на сайте
Попробуй сбросить матрицу вида после выбора.
Код
glMatrixMode(GL_MODELVIEW);  
glLoadIdentity();
imperator12Дата: Четверг, 28 Марта 2013, 12:33 | Сообщение # 5
почетный гость
Сейчас нет на сайте
Спасибо всем, кажется я понял
Код
for(int i=-width/2;i<=width/2; i+= (width<=height) ?20: 20*appect)

Вот так вроде бы все нормально.
OpenGOOДата: Четверг, 28 Марта 2013, 15:18 | Сообщение # 6
почти ветеран
Сейчас нет на сайте
Попробуй нарисовать квадрат и если твоё окно не квадратное, то получиться прямоугольник.

glBegin(GL_QUADS);
glVertex2f(-250.0f, 250.0f);
glVertex2f(-250.0f, -250.0f);
glVertex2f(250.0f, -250.0f);
glVertex2f(250.0f, 250.0f);
glEnd();

Если взять квадрат 500 х 500 и w = 800, h = 600 то получим прямоугольник 375 x 500 px

Вот здесь ошибка (appect нарушает пропорцию и используется как коэффициент масштабирования в ширину, если >1 уменьшает, если < 1 увеличивает), можешь appect присвоить 1 и получишь правильный квадрат
Код

glOrtho((-w/2)*appect,(w/2)*appect,-h/2,h/2,1.0f,-1.0f);    
      height =h;width=w*appect;


w = 800, h = 600
appect = 800/600 = 4/3 = 1.3(3)
glOrtho((-w/2)*appect,(w/2)*appect,-h/2,h/2,1.0f,-1.0f);
400 * 4/3 * 2 = 1066.6(6)
1066.6(6)/(300*2) = 1.7(7) а нужно чтобы было тоже 1.3(3)


Мои проекты:
- Свободный и открытый клон World Of Goo
- TrueEngine2D (2D игровой фреймворк основанный на FreeBASIC)

[GameMaker: Studio v1.4.9999]


Сообщение отредактировал OpenGOO - Четверг, 28 Марта 2013, 16:51
imperator12Дата: Четверг, 28 Марта 2013, 17:03 | Сообщение # 7
почетный гость
Сейчас нет на сайте
OpenGOO То есть можно appect и не пользоваться вообще?
OpenGOOДата: Четверг, 28 Марта 2013, 18:45 | Сообщение # 8
почти ветеран
Сейчас нет на сайте
В данном случае даже не надо использовать, хотя конечно можно сделать так
Код
glOrtho((-h/2)*appect,(h/2)*appect,-h/2,h/2,1.0f,-1.0f);
wink


Мои проекты:
- Свободный и открытый клон World Of Goo
- TrueEngine2D (2D игровой фреймворк основанный на FreeBASIC)

[GameMaker: Studio v1.4.9999]
imperator12Дата: Четверг, 28 Марта 2013, 18:59 | Сообщение # 9
почетный гость
Сейчас нет на сайте
А если не в данном случаи. Например при рисовании спрайтов надо использовать этот коэффициент? Ведь действительно присвоив appect 1 и нарисовавши квадрат, при растяжении окна я получал все равно ровный квадрат.
OpenGOOДата: Четверг, 28 Марта 2013, 23:17 | Сообщение # 10
почти ветеран
Сейчас нет на сайте
В не контекста ответить не смогу

Мои проекты:
- Свободный и открытый клон World Of Goo
- TrueEngine2D (2D игровой фреймворк основанный на FreeBASIC)

[GameMaker: Studio v1.4.9999]
Форум игроделов » Программирование » C/C++ » OpenGL (маштабирование)
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг