gpt4 book ai didi

opengl - 在窗口调整大小时保持 2D 对象的纵横比

转载 作者:行者123 更新时间:2023-12-01 13:03:39 25 4
gpt4 key购买 nike

我有一个 Windows (XP) 应用程序需要在窗口中显示一个二维矩形。矩形不得被裁剪(即必须始终完全位于视口(viewport)内),并且必须在调整大小时保持其纵横比。当前,处理布局的方法会扭曲矩形的纵横比以匹配窗口。我希望矩形缩放到窗口并在窗口中居中(同样,不剪裁)。目前的方法如下。 lWinDist 和 lMaxDepth 是要显示的矩形的宽度和高度(如果重要,以 48 英寸为单位):

void CRoRRecView::RedoLayout( long lWinDist, long lMaxDepth )
{
CDC* pDC = GetDC() ;

if ( pDC != NULL )
{
m_lWinDist = lWinDist;
GetClientRect( m_rectClient ) ;
int nClientWidth = m_rectClient.Width();
int nClientHeight = m_rectClient.Height();
glViewport( 0, 0, nClientWidth, nClientHeight );

glMatrixMode( GL_PROJECTION);
glLoadIdentity();

m_fWinXDist = (float) lWinDist ;
m_fWinYDist = lMaxDepth ;
m_fAspectRatio = m_fWinXDist / m_fWinYDist;

glOrtho(0.0, m_fWinXDist, 0.0, m_fWinYDist, -1, 1 ) ;

glRotatef(180.0, 0,1,0);
glTranslatef( (float)(-1 * lWinDist),0,0 ); // Translate across the x axis

glMatrixMode( GL_MODELVIEW );
glLoadIdentity();

ReleaseDC( pDC ) ;
}
}

最佳答案

试试这个 reshape 函数。它将保持纵横比,调整对象大小,并使视口(viewport)居中。

// initial window screen size
int WIDTH = 400;
int HEIGHT = 300;

// reshape function, call with glutReshapeFunc(reshape) in yout main function
void reshape(int width, int height) {
const float ar_origin = (float) WIDTH / (float) HEIGHT;
const float ar_new = (float) width / (float) height;

float scale_w = (float) width / (float) WIDTH;
float scale_h = (float) height / (float) HEIGHT;
if (ar_new > ar_origin) {
scale_w = scale_h;
} else {
scale_h = scale_w;
}

float margin_x = (width - WIDTH * scale_w) / 2;
float margin_y = (height - HEIGHT * scale_h) / 2;

glViewport(margin_x, margin_y, WIDTH * scale_w, HEIGHT * scale_h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, WIDTH / ar_origin, 0, HEIGHT / ar_origin, 0, 1.0);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity() ;
}

关于opengl - 在窗口调整大小时保持 2D 对象的纵横比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4338729/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com