2012-04-04 135 views
0

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

代码:在OpenGL

// 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(); 

回答

2

转型调用(如glTranslatefglRotatef)更新内部转换矩阵,得到由你在屏幕上绘制得到之前提供点相乘。 OpenGL完全不会触及你的数据。

一般来说,这就是你想要的。你有一个时间常数不变的模型,但它会发生变化。

但是,如果你需要更新你的数据,你需要创建自己的转换矩阵,人工繁殖,然后用干净的变换矩阵画(用glLoadIdentity

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