目的:ウィンドウ サイズが変更されても、グラフィック スケールは変更されません。
アイデア:ウィンドウのアスペクト比が変化した場合、ウィンドウの表示領域のサイズを変更し、投影行列を使用して観察対象のサイズを変更して変化に適応させます。
コード:
void reshape(int w, int h){
glViewport(0,0,(GLsizei) w, (GLsizei) h);//改变显示区域,起始位置为客户端窗口左下角(非坐标原点)
glMatrixMode(GL_PROJECTION);//修改投影矩阵
glLoadIdentity();//导入单位阵
gluPerspective(fovy, (float)w/h,near, far);//宽高比改为当前值,视线区域与屏幕大小一致;
glMatrixMode(GL_MODELVIEW);//修改模型视图
glLoadIdentity();
gluLookAt(eyex...,centerx...,upx...);//观察者位置
}
int main(){
...
glutReshapeFunc(reshape);
...
}
まとめ:
1. この方法がうまくいかない場合
つまり、オブジェクトはウィンドウのサイズに合わせて拡大縮小されます。投影行列とモデル ビュー行列が前のコードで定義されているかどうかを確認してください。有効性を確保するため、必要がない場合は 1 回のみ設定することをお勧めします。
2. 射影行列を変更すると、glOrtho も使用できます
glViewport が描画表示領域を変更し、gluPerspective が表示領域を変更する場合、glOrtho は長方形のフレームを設定し、そこに含まれるグラフィックスを表示のためにインターセプトします。
無理にオリジナルサイズのグラフィックスを引き伸ばした画面に投影すると、画像が引き伸ばされて表示されてしまうため、歪みを避けるためには、引き伸ばした分だけ元のグラフィックスを拡大する必要があります。射影行列部分は次のように変更されます。
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
GLfloat aspect;
if(w<=h)//窗口在高度方向变长,截图也要在该方向上拉长相同比例
aspect=(GLfloat)h/w;
glOrtho(left,right,bottom*aspect,top*aspect,near,far);
else //宽度方向拉长,截图也要在该方向上拉长相同比例
aspect=(GLfloat)w/h;
glOrtho(left*aspect,right*aspect,bottom,top,near,far);