Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > OpenGL ViewPort изменение размеров окна


Автор: glDevAleksey001 30.11.2014, 12:43
Привет всем !
Прошу подсказки .
Нужно так, что бы изменение размеров окна не влияли на масштаб фигуры в окне вида.
Ну, допустим, размер окна  800x600 переходим на  1024х768  фигура остаётся в центре окна и одного фигура размера, что и при 800x600 и  1024х768  .
ICQ 684966146



Автор: baldina 1.12.2014, 11:32
в общем случае примерно так
Код

void onResize (int newWidth, int newHeight) {
  if (newHeight==0) return;
  glViewport(0,0,newWidth,newHeight);
  double aspect=double(newWidth)/newHeight;
  if (aspect > 1)
    glOrtho(-sceneWidth/2*aspect, sceneWidth/2*aspect, -sceneHeight/2, sceneWidth/2, nearZ, farZ);
  else
    glOrtho(-sceneWidth/2, sceneWidth/2, -sceneHeight/2/aspect, sceneWidth/2/aspect, nearZ, farZ);
}

остальное сами добавите по вкусу
а как у вас сейчас делается?

Автор: glDevAleksey001 1.12.2014, 15:17
Да, Спасибо большое оно и есть!
Его  искал я, помню, был такой пример в  Builder c++ 5.0. 
У себя его не я и не нашёл.
Я сделал по другому .
Сперва рабочая
Код

Matrix4.CreatePerspectiveFieldOfView((float)Math.PI / 4, aspect, 1, 1000, out projection_matrix);


потом
Код

Glu.Ortho2D(0, w, 0, h);  

И в шейдере 
Код

uniform vec4 vView; 

vec4 Vertex  ;

void main()
{

Vertex =gl_Vertex;

Vertex.x*= vView.z;
Vertex.y*= vView.z;


Vertex.z=0.0;
Vertex.x+= vView.x/2;
Vertex.y+= vView.y/2;

gl_FrontColor =gl_Color;
gl_Position = gl_ModelViewProjectionMatrix* vec4(Vertex.xyz, 1.0); 
}



 Да и вопрос что это за переменные?
sceneWidth, sceneHeight

Автор: baldina 1.12.2014, 16:40
размеры сцены, т.е. диапазоны координат вашей модели, в которых она должна быть видна в окне.
у вас эти координаты 0..w и 0..h

Добавлено через 8 минут и 29 секунд
допустим у вас прямоугольник с координатами 0,0,100,100, и вы желаете, что бы он выводился на весь экран независимо от разрешения/размера окна. тогда
Код

glOrtho(0,100,0,100);

но еще надо учесть соотношение сторон окна (оно в общем случае не совпадает с соотношением сторон вашей сцены, которая в данном случае квадрат), для этого используется переменная aspect.
допустим, окно имеет размеры w и h
aspect=w/h
если окно "шире" модели, то по размеру модели устанавливается высота 
Код

glOrtho(0,100*aspect,0,100);
а если "выше", то по размеру модели устанавливается ширина
Код

glOrtho(0,100,0,100/aspect);


Автор: glDevAleksey001 1.12.2014, 18:10
Да спасибо я, разобрался, так я мало-мальски понимаю в видовых преобразованиях.

Переписал немного 

Код

GL.Ortho(-w / 2.0, w / 2.0, -h / 2.0, h / 2.0, nearZ, farZ); 


А то фигура была сплющена по ширине. 

Замес-то квадрата прямоугольник получался.



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)