| 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);  
 Мои проекты:
 - Свободный и открытый клон 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]
 |  |  |  |  |