在OnSize函数中的代码是这样的:
void CGLLightView::OnSize(UINT nType, int cx, int cy)
{    
    CView::OnSize(nType, cx, cy);
    // TODO: Add your message handler code here    
    if (cy==0) // 防止被零除
    {
        cy=1;// 将Height设为1
    }
    glMatrixMode(GL_PROJECTION); // 选择投影矩阵
    glLoadIdentity();// 重置投影矩阵
    gluPerspective(0.0f,(GLfloat)cx/(GLfloat)cy,1.0,100.0);// 计算窗口的外观比

    glLoadIdentity();
     glViewport(0,0,cx,cy);//设视口
}绘制一个正方形的函数中的代码是这样的:
void CGLLightView::OnDraw(CDC* pDC)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);    
    glLoadIdentity();
    glBegin(GL_QUADS);
        glVertex2f(-0.5f,0.5f);
        glVertex2f(-0.5f,-0.5f);
        glVertex2f(0.5f,-0.5f);
        glVertex2f(0.5f,0.5f);
    glEnd();
    SwapBuffers(m_pDC->GetSafeHdc());
    // TODO: add draw code for native data here
}问题:为什么正方形会变长方形?图形的高和宽跟窗口的高和宽成正比的:窗口拉长,正
方形也拉长!这个问题怎么解决?有人说这是和gluPerspective这个函数设定相关,但应
该怎么设定?是不是还有别的函数在影响这个问题?
请高手指教!!!

解决方案 »

  1.   

    1. Preface
      前几天,有一个网友寻找OpenGL显示曲面的方法,email到我这里。我把我的 wave 程序发给他了。不料我的程序使他喜出望外。这是我想到如果我的程序放到网上的话,会有更多的人能够更容易的看到我的代码,并且公容易的学习如何使用OpenGL。2. Contents
      请大家访问 http://www.betajin.com/alphasun/index.htm。请看其中的 Wave OpenGL 页面,在里面便可下载 wave 的源代码。以后我还会公布一些其它的程序源代码。希望能对大家有用。我的 MyProjects 有172个目录呢,并且有的workspace包含数个工程。另外,如果大家觉得本贴对你有用,还烦劳各位 up 一下,使得更多的人能够看得到。
    谢谢
      

  2.   


       我想先用3d-max制作一个飞机着陆的动画,然后用opengl来
    处理。使之能用外界输入的数据来控制,我现在刚开始学习vc,请指点
    如何才能掌握着技巧,你的设计,处理思路是什么?我现在没有头绪。
      它能处理3d的文件格式嘛/
      

  3.   

    把gluPerspective下面的glLoadIdentity去掉
      

  4.   

    看看这段代码
    // Called by GLUT library when the window has chanaged size
    void ChangeSize(GLsizei w, GLsizei h)
    {
    // Prevent a divide by zero
    if(h == 0)
    h = 1;

    // Set Viewport to window dimensions
        glViewport(0, 0, w, h); // Reset coordinate system
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity(); // Establish clipping volume (left, right, bottom, top, near, far)
        if (w <= h) 
    glOrtho (0.0f, 250.0f, 0.0f, 250.0f*h/w, 1.0, -1.0);
        else 
    glOrtho (0.0f, 250.0f*w/h, 0.0f, 250.0f, 1.0, -1.0); glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    }
    这样能保证你所画的正方形保持不变
      

  5.   

    gluPerspective(0.0f,(GLfloat)cx/(GLfloat)cy,1.0,100.0);// 计算窗口的外观比

    ----------
    应该是这里的错误,这是透视变换,看看它的相关参数就知道了。
    另外,glOrtho 可以使正方形保持不变
      

  6.   

    alphapaopao(炮炮) :你厉害阿!!!