1

我正在制作一个反弹其窗口边缘的球的程序,但我遇到了边界倾斜的问题。

如果我将初始分辨率设置为方形窗口,

int windowWidth = 600;

int windowHeight = 600;

它工作正常。一旦我重塑窗口,窗口上的边界就会倾斜。

当它是正方形时,它看起来像这样: 在此处输入图像描述

当我按其宽度拉伸它时,它看起来像这样: 在此处输入图像描述

当我按它的高度拉伸它时,它看起来像这样: 在此处输入图像描述

基本上我无法在不倾斜窗口边界的情况下调整窗口大小。

这是我的reshape功能的代码:

void reshape(GLsizei weight, GLsizei height)  
{ 
    if (height == 0) height = 1;               // To prevent divide by 0 
    GLfloat aspect = (GLfloat)weight / height; // Get aspect ratio 

    // Set the viewport to cover the entire window 
    glViewport(0, 0, weight, height); 

    // Adjust the aspect ratio of clipping area to match the viewport 
    glMatrixMode(GL_PROJECTION); // Select the Projection matrix 
    glLoadIdentity();            // Reset 

    for (int i = 0; i < numOfBalls; i++) 
    { 
        if (weight <= height)  
        { 
            balls[i].xLeft   = -1.0; 
            balls[i].xRight  = 1.0; 
            balls[i].yBottom = -1.0 / aspect; 
            balls[i].yTop    = 1.0 / aspect; 
        }  
        else 
        { 
            balls[i].xLeft   = -1.0 * aspect; 
            balls[i].xRight  = 1.0 * aspect; 
            balls[i]. yBottom = -1.0; 
            balls[i]. yTop    = 1.0; 
        } 
        gluOrtho2D(balls[i].xLeft, balls[i].xRight, balls[i].yBottom, balls[i].yTop); 
        balls[i].xPosMin = balls[i].xLeft + balls[i].ballRadius; 
        balls[i].xPosMax = balls[i].xRight - balls[i].ballRadius; 
        balls[i].yPosMin = balls[i].yBottom + balls[i].ballRadius; 
        balls[i].yPosMax = balls[i].yTop - balls[i].ballRadius; 
    } 

    glMatrixMode(GL_MODELVIEW); // Select the model-view matrix 
    glLoadIdentity();           // Reset 
} 

*注意:如果需要,我可以发布更多代码...

4

1 回答 1

2

尝试从你的循环中删除这个:

gluOrtho2D(balls[i].xLeft, balls[i].xRight, balls[i].yBottom, balls[i].yTop);

并定义一次正交矩阵。

我认为每当您的循环执行时,您都会将一个新矩阵与之前在 GL 中插入的矩阵相乘。

GL产生的正交矩阵是这样的:

在此处输入图像描述

现在,当您设置宽度:800 和高度:600 时,您的纵横比将为 1.33,第一个循环的矩阵将为:

在此处输入图像描述

现在通过每个循环,GL 将新矩阵与前一个矩阵相乘,并且坐标将通过将每个矩阵乘以 0.75 变得更接近。

(我也不确定)

于 2013-10-17T18:08:53.823 回答