不更新坐标位置?

时间:2012-04-04 08:50:55

标签: c++ opengl

我设法在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();

1 个答案:

答案 0 :(得分:2)

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

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

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

可以从OpenGL获得一些帮助,因为你可以从OpenGL获得转换矩阵,但我不建议这样做。数学并不那么难,你会喜欢学习如何去做。