2013-02-12 54 views
1

我需要使用C++/OpenGL在兩個對象之間執行靜態碰撞檢測。我已經編寫了碰撞檢測代碼,但是這個代碼使用了兩個模型的頂點,它們在.obj文件中給出,而不是它們當前位置的座標(這是我想要的)。OpenGL中對象的當前座標

我已經執行了兩種模型的轉換和比例轉換,我需要知道這些座標是什麼現在。我想這與轉換矩陣等有關,但這與初始座標結合起來如何?

任何人都可以幫助我嗎?

回答

1

如果你只是有翻譯T和縮放S,你可以簡單地計算出實際位置與:

world_position = s * model_position + t 

如果你給出一個矩陣m中的任意轉換,你計算的位置:

world_position = M * model_position 
//where model_position should be a 4d vector with w-coordinate 1 
+0

這就是我一直在尋找!非常感謝你! – 2013-02-13 00:19:27

1

OpenGL不知道模型或場景是什麼,它只是繪製點,線和三角形到像素幀緩衝區。

您該放棄部分或全部固定功能管道了。你不應該再使用glRotate,glTranslate和glScale來建立你的模型視圖矩陣。相反,你應該自己維護矩陣,使用像GLM或Eigen這樣的數學庫。這爲您提供了模型轉換矩陣的單個實例,您可以將其應用於原始模型座標以進行碰撞測試,但也可以使用glLoadMatrix(如果您還應用了視圖轉換)或GL_MODELVIEW中的glMultMatrix將其加載到模型視圖矩陣中矩陣模式。或者你去着色器和使用制服。

0

您實際上需要對座標進行相同的轉換。

如果您正在使用固定功能管線,您可能會在開始通過glGetFloatv(GL_MODELVIEW_MATRIX, m)將一個對象繪製到某個GLfloat m[16]之前,獲取當前的ModelView矩陣,然後存儲這些矩陣以便稍後將其應用於您的對象。

爲了得到乘法權,這裏是從左邊開始乘以矩陣元素排序的方式。

| m[0] m[4] m[8] m[12] |  v[0] 
    | m[1] m[5] m[9] m[13] | x v[1] 
    | m[2] m[6] m[10] m[14] |  v[2] 
    | m[3] m[7] m[11] m[15] |  v[3] 
1

我建議你先畫你的對象蒙山他們的心在原點(0,0,0)

所以,當你調用funcion

GLfloat matrixMV [16];

glGetFloatv(GL_MODELVIEW_MATRIX,matrixMV);

的座標x,y和z

將分別matrixMV [12] matrixMV [13] matrixMV [14]

glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    glRotatef(-25.0, 0.0, 1.0, 0.0); 
    glTranslatef(100.0, 50.0, 0.0); 
    /*Draw a triangle with centroid in the orign*/ 
    glBegin(GL_POLYGON); 

     glVertex2f(0.0 , 1.0 ); 
     glVertex2f(-1.0,-0.27); 
     glVertex2f(1.0 ,-0.27); 

    glEnd(); 

    GLfloat matrixMV[16]; 
    glGetFloatv(GL_MODELVIEW_MATRIX, matrixMV); 


double xCenterTriangle = matrixMV[12]; 
double yCenterTriangle = matrixMV[13]; 
double zCenterTriangle = matrixMV[14];