版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Ilson_/article/details/80061460
我用的是正交投影gluOrtho2D以纹理贴图的方式显示一张BMP位图,当我滚动鼠标滚轮时位图会缩小放大;我要求的是纹理贴图在窗口中的大小,如红色框大小:
这是我显示图片的代码:
//贴图的矩形大小与图片比例一致
#define MAPWIDTH 20.0
#define MAPHIGHT GLfloat(20.0 / (1920.0 / 1080.0))
//背景图
void CDrawView::DrawImage()
{
glPushMatrix();
glLoadIdentity();
glScalef(mScale_, mScale_, 1); //横纵坐标缩放量
glTranslatef(mTranslateX_ * mVcWidthRatio_, mTranslateY_ * mVcHightRatio_, 0); //横纵坐标平移量
//纹理图像的坐标范围是从(0,0)到(1,1),左下角为(0,0),右上角为(1,1)
glEnable(GL_TEXTURE_2D);
glBegin(GL_QUADS);
glTexCoord2d(0.0, 0.0);
glVertex2d(-MAPWIDTH, -MAPHIGHT);
glTexCoord2d(1.0, 0.0);
glVertex2d(MAPWIDTH, -MAPHIGHT);
glTexCoord2d(1.0, 1.0);
glVertex2d(MAPWIDTH, MAPHIGHT);
glTexCoord2d(0.0, 1.0);
glVertex2d(-MAPWIDTH, MAPHIGHT);
glEnd();
glDisable(GL_TEXTURE_2D);
glPopMatrix();
}
这是OnSize()函数代码:
mViewHalfWidth_ = 12;
mViewHalfHight_ = 12;
void CDrawView::OnSize(UINT nType, int cx, int cy)
{
CScrollView::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
//以下两行保证窗口大小变化后图像中心点不发生变化
mTranslateX_ *= (GLfloat)(cx * 1.0 / mClientWidth_);
mTranslateY_ *= (GLfloat)(cy * 1.0 / mClientHight_);
mClientWidth_ = cx;
mClientHight_ = cy;
if (mClientHight_==0) // Prevent A Divide By Zero By 防止除以0
{
mClientHight_=1; // Making Height Equal One
}
if (mClientWidth_==0) // Prevent A Divide By Zero By
{
mClientWidth_=1; // Making Height Equal One
}
mVcWidthRatio_ = (GLfloat)(mViewHalfWidth_ * 2 / mClientWidth_);//视窗比(视景体/窗口)
mVcHightRatio_ = (GLfloat)(mViewHalfHight_ * 2 / mClientHight_);
wglMakeCurrent(mhDC_, mhGLContext_);
glViewport(0, 0, cx, cy); // Reset The Current Viewport
glMatrixMode(GL_PROJECTION); // Select The Projection Matrix 选择投影矩阵
glLoadIdentity(); // Reset The Projection Matrix
//改变窗口大小时,使视图等比缩放
//正交投影
GLdouble glScale = (GLdouble)cx / cy;
if (cx <= cy)
gluOrtho2D(-mViewHalfWidth_, mViewHalfWidth_, -mViewHalfHight_ / glScale, mViewHalfHight_ / glScale);
else
gluOrtho2D(-mViewHalfWidth_ * glScale, mViewHalfWidth_ * glScale, -mViewHalfHight_, mViewHalfHight_);
glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
glLoadIdentity(); // Reset The Modelview Matrix
CurrentGLpoint(CPoint(), TRUE);
}
请问我该怎么求在窗口中投影的大小(图片的大小、红框大小),随着缩放量改变而改变