我需要使用C++/OpenGL在兩個對象之間執行靜態碰撞檢測。我已經編寫了碰撞檢測代碼,但是這個代碼使用了兩個模型的頂點,它們在.obj文件中給出,而不是它們當前位置的座標(這是我想要的)。OpenGL中對象的當前座標
我已經執行了兩種模型的轉換和比例轉換,我需要知道這些座標是什麼現在。我想這與轉換矩陣等有關,但這與初始座標結合起來如何?
任何人都可以幫助我嗎?
我需要使用C++/OpenGL在兩個對象之間執行靜態碰撞檢測。我已經編寫了碰撞檢測代碼,但是這個代碼使用了兩個模型的頂點,它們在.obj文件中給出,而不是它們當前位置的座標(這是我想要的)。OpenGL中對象的當前座標
我已經執行了兩種模型的轉換和比例轉換,我需要知道這些座標是什麼現在。我想這與轉換矩陣等有關,但這與初始座標結合起來如何?
任何人都可以幫助我嗎?
如果你只是有翻譯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
OpenGL不知道模型或場景是什麼,它只是繪製點,線和三角形到像素幀緩衝區。
您該放棄部分或全部固定功能管道了。你不應該再使用glRotate,glTranslate和glScale來建立你的模型視圖矩陣。相反,你應該自己維護矩陣,使用像GLM或Eigen這樣的數學庫。這爲您提供了模型轉換矩陣的單個實例,您可以將其應用於原始模型座標以進行碰撞測試,但也可以使用glLoadMatrix(如果您還應用了視圖轉換)或GL_MODELVIEW中的glMultMatrix將其加載到模型視圖矩陣中矩陣模式。或者你去着色器和使用制服。
您實際上需要對座標進行相同的轉換。
如果您正在使用固定功能管線,您可能會在開始通過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]
我建議你先畫你的對象蒙山他們的心在原點(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];
這就是我一直在尋找!非常感謝你! – 2013-02-13 00:19:27