0

我已经成功地在 OpenGL (C++) 中旋转了一个矩形。我正在制作一个使用“分离轴定理”测试两个矩形碰撞的程序。要使用该定理,我需要矩形每个角的 x 和 y 坐标,但我的问题是,虽然我调用glRotatef(...),但矩形角的坐标也没有更改为它们旋转的值,但是矩形按应有的方式旋转。调用 glRotatef 后如何更新矩形的坐标?

代码:

// float r1.x[4] and r1.y[4] hold the x and y position of each of the 4 corners, starting with the upper left (r1.x[0], r1.y[0])
    glLoadIdentity();
    glTranslatef((r1.x[0] + r1.x[2]) / 2, (r1.y[1] + r1.y[3]) / 2, 0); // Translates matrix to center of rectangle
    glRotatef(r1.angle, 0, 0, 1);
    glTranslatef(-((r1.x[0] + r1.x[2]) / 2), -((r1.y[1] + r1.y[3]) / 2), 0); // Translates back
    r1.angle++;

    glBegin(GL_QUADS);
        glVertex2f(r1.x[0], r1.y[0]);
        glVertex2f(r1.x[1], r1.y[1]);
        glVertex2f(r1.x[2], r1.y[2]);
        glVertex2f(r1.x[3], r1.y[3]);
    glEnd();
4

1 回答 1

2

OpenGL 中的转换调用(如glTranslatefglRotatef)会更新一个内部转换矩阵,该矩阵在绘制到屏幕上之前乘以您提供的点。OpenGL 根本不会触及您的数据。

一般来说,这就是你想要的。你有一个在时间上是恒定的模型,但它会被改变。

但是,如果您确实需要更新数据,则需要创建自己的转换矩阵,手动将其相乘,然后使用干净的转换矩阵进行绘制(使用glLoadIdentity

不过,您可以从 OpenGL 获得一些帮助,因为您可以从 OpenGL 获得转换矩阵,但我不推荐这样做。数学并不难,你会很高兴学习如何去做。

于 2012-04-04T09:01:23.097 回答