2012-10-17 85 views
0

現在我正在旋轉一個對象,我們稱之爲'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(); 
} 
+0

你什麼時候在你的'Gun :: render()'裏再次調用setupModelviewMatrix?你正在消除任何突出的旋轉。否則,如果您抹掉父母的矩陣,您打算如何從父母處獲得輪換? – Tim

+0

@Tim我很抱歉,我不完全明白你的意思。你是否告訴我我應該重新移動setupModelvieuwMatrix();在槍的繪圖功能裏面? –

+0

我想我不太瞭解你的邏輯。你明確表示這是*不是父/子系統,但我不知道爲什麼你認爲你的子對象應該由父母旋轉,如果他們使用兩個完全獨立的矩陣。我相信你可以在opengl中找到這種父母/孩子繪畫的很多不同的例子,只要查看任何太陽/地球/月亮的例子。 – Tim

回答

1

因爲蒂姆我注意到我的矩陣也沒有通過槽其他人。當我終於明白他在說些什麼時,這是一個簡單的解決方法,所以100%的道具都歸他所有。

現在任何人可能需要它的代碼。

{ 
    glm::mat4 startingModel(1.0); 

    setupStartModelMatrix(); 
    startingModel = continuedModelvieuwMatrix(startingModel); 
    drawMainBody(); 

    } 

    if(mNumberOfEquipementOwned != 0) 

    { 
     for(int i = 0; i < mNumberOfEquipementOwned; i++) 

     { 
      //obj is retived with a function 
      obj->render(startingModel); 

     } 
    } 

    setupEndModelMatrix(); // <--- Has glPopMatrix(); 
} 

而且GLM代碼

glm::mat4 GameObject::continuedModelvieuwMatrix(glm::mat4 startingModel) 
{ 
    glm::mat4 Model = glm::scale(glm::mat4(1.0f), glm::vec3(1.0f)); 
    glm::mat4 ViewTranslate = glm::translate(startingModel, 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)); 

    return MVP; 
} 

void GameObject::setupStartModelMatrix() 
{ 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
} 

和牽引設備公司代碼

void Gun::render(glm::mat4 startingModel) 
{ 
    glm::math4 tempModel; 
    tempModel = continuedModelvieuwMatrix(startingModel); 
    mMesh->render(); 
} 

而這就是這件事。 我不是100%確定這段代碼是否工作正常,因爲我的對象結構不得不以其他方式修復它,但是這至少應該爲有同樣問題的人提供一個良好的開端。

也不需要glPopMatrix()或glPushMatrix()來完成此工作。

2

我的猜測是你打電話glPushMatrix(),旋轉,繪製你的主體,呼叫glPopMatrix(),然後繪製附件。如果這是真的,請在繪製附件後將glPopMatrix()調用移至。

+0

啊是的我應該提到這一點,我有揹包的繪畫背後的主體glPopMatrix。 –