2012-11-14 35 views
1
float carX = 0.0; 
float carY = 0.0; 
float carSpeed = 1.0; 
float direction = 0.0; 
bool exhaust; 



void reshape(void) 
{ 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glOrtho(0, 10.0, 0, 10.0, 0.0, 10.0); 
glMatrixMode(GL_MODELVIEW); 
} 

void keys(int key, int x, int y){ 


if(key == GLUT_KEY_UP){ 
    carY = carY + carSpeed; 
    direction = 0.0; 
    glutPostRedisplay(); 
} 
if(key == GLUT_KEY_DOWN){ 
    carY = carY - carSpeed; 
    direction = 90.0; 
    glutPostRedisplay(); 

} 

if(key == GLUT_KEY_LEFT){ 
    carX = carX - carSpeed; 
    direction = -90.0; 
    glutPostRedisplay(); 
} 

if(key == GLUT_KEY_RIGHT){ 
    carX = carX + carSpeed; 
    direction = 180.0; 
    glutPostRedisplay(); 
}} 

void renderScene(void){ 
glClear (GL_COLOR_BUFFER_BIT); 
glLoadIdentity(); 
drawPlayground(); 
glPushMatrix(); 
glRotatef(direction, 0.0, 0.0, 1.0); 
glTranslatef(carX, carY,0.0); 
drawcar(); 
glPopMatrix(); 
glFlush();} 

int main(int argc, char** argv){ 
    glutInit(&argc, argv); 
    glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); 
    glutInitWindowSize (400, 400); 
    glutInitWindowPosition (100, 100); 
    glutCreateWindow("courseWork_2DGame"); 
    reshape(); 
    glutDisplayFunc(renderScene); 
    glutSpecialFunc(keys); 
    glutMainLoop(); 
    return 0;} 

這是我的openGL代碼,我已經畫出了汽車移動的地方。汽車將被移動,但箭頭,並且當它移動的方向是汽車按照箭頭鍵的旋轉。然而,當按鍵時,汽車翻譯得很好,但旋轉不正確,我認爲,因爲它不是在中心而是在不同的點上旋轉。如何在其中心旋轉2d對象

回答

2

我記得有一篇文章詳細解釋了這個問題here。這個人在解釋整個矩陣層次結構方面做了令人驚歎的工作。


如果要圍繞其中心旋轉對象,首先必須將它轉換爲原點,然後旋轉並將其轉換回來。由於變換矩陣會影響您的向量從右向左,因此您必須以相反的順序對這些步驟進行編碼。

下面是一些僞代碼,因爲我不通過心臟知道的OpenGL程序:

PushMatrix(); 
LoadIdentity(); // Start with a fresh matrix 
Translate();  // Move your object to its final destination 
Rotate();  // Apply rotations 
Draw();   // Draw your object using coordinates relative to the object center 
PopMatrix(); 

這些矩陣得到應用:

v_t = (I * T * R) * v = (I * (T * (R * v))) 

這樣的順序是:旋轉,平移。

編輯:上面的公式的解釋。

轉換的旋轉,縮放和平移影響模型視圖矩陣。您的模型的每個3D點(矢量)都與該矩陣相乘,以獲得其3D空間中的最終點,然後乘以投影矩陣以接收2D點(在2D屏幕上)。

忽略投影的東西,你通過模型 - 視圖 - 矩陣變換點是:

v_t = MV * v 

含義原來的點v,乘以模型視圖矩陣MV。

在上面的代碼中,我們已經構建MV由單位矩陣I,翻譯T和旋轉R:

MV = I * T * R 

將所有內容放在一起,你看到你的點v第一次受旋轉R,然後翻譯T,讓您的點在翻譯前旋轉,就像我們希望它是:

v_t = MV * v = (I * T * R) * v = T * (R * v) 

調用旋轉()來翻譯前()會導致:

v_t = (I * R * T) * v = R * (T * v) 

這將是不好的:在3D中翻譯成某個點,然後圍繞原點旋轉,導致模型中出現一些奇怪的失真。