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]
|
|
| |