現在我正在旋轉一個對象,我們稱之爲'mainBody',但附加到mainBody是幾個附件,當我旋轉我的mainBody時,它們也應該旋轉,但是現在他們沒有。我沒有使用父母/子女系統。主體有一系列附件,並將它們繪製在mainBody繪圖函數中。旋轉一個對象及其'子女'
繪製設備項目後,主體的glPopMatrix()完成。
我知道我在過去用pushMatrix()設法做到了這一點;和popMatrix();但現在它似乎並沒有工作。
我正在使用C++,opengl和glm。
下面是一些代碼,顯示你有什麼我現在所擁有的:
{
setupStartModelMatrix(); //<---- Has glPushMatrix();
setupModelviewMatrix(); //<--- has all the gml stuff
drawMainBody();
}
if(mNumberOfEquipementOwned != 0)
{
for(int i = 0; i < mNumberOfEquipementOwned; i++)
{
//obj is retived with a function
obj->render();
}
}
setupEndModelMatrix(); // <--- Has glPopMatrix();
}
而且GLM代碼
void GameObject::setupModelviewMatrix()
{
glm::mat4 Projection = glm::perspective(45.0f, 4.0f/3.0f, 0.1f, 100.f);
glm::mat4 Model = glm::scale(glm::mat4(1.0f), glm::vec3(1.0f));
glm::mat4 ViewTranslate = glm::translate(glm::mat4(1.0f), glm::vec3(mPosition.x, mPosition.y, mPosition.z));
glm::mat4 ViewRotateX = glm::rotate(ViewTranslate, mRotation.x, glm::vec3(1.0f, 0.0f, 0.0f));
glm::mat4 ViewRotateY = glm::rotate(ViewRotateX, mRotation.y, glm::vec3(0.0f, 1.0f, 0.0f));
glm::mat4 View = glm::rotate(ViewRotateY, mRotation.z, glm::vec3(0.0f, 0.0f, 1.0f));
glm::mat4 MVP = View * Model;
glUniformMatrix4fv(0, 1, GL_FALSE, glm::value_ptr(MVP));
glLoadMatrixf(glm::value_ptr(MVP));
}
和牽引設備公司代碼
void Gun::render()
{
glPushMatrix();
setupModelviewMatrix();
mMesh->render();
glPopMatrix();
}
你什麼時候在你的'Gun :: render()'裏再次調用setupModelviewMatrix?你正在消除任何突出的旋轉。否則,如果您抹掉父母的矩陣,您打算如何從父母處獲得輪換? – Tim
@Tim我很抱歉,我不完全明白你的意思。你是否告訴我我應該重新移動setupModelvieuwMatrix();在槍的繪圖功能裏面? –
我想我不太瞭解你的邏輯。你明確表示這是*不是父/子系統,但我不知道爲什麼你認爲你的子對象應該由父母旋轉,如果他們使用兩個完全獨立的矩陣。我相信你可以在opengl中找到這種父母/孩子繪畫的很多不同的例子,只要查看任何太陽/地球/月亮的例子。 – Tim