2013-01-17 163 views
0

我正在使用opengl在我的學校項目上工作,我應該使用一些提供的模型和我自己的想法創建「基本場景」。 我會創建一個簡單的農場:從頂點創建一個房子,並在它前面放置一個貓模型...但這裏是我的關注點:Opengl對象翻譯

當我開始編碼時,我意識到每個模型都被鏈接到前一個模型矩陣?例如一塊代碼:

public void display(GLAutoDrawable drawable) { 
    final GL3 gl = drawable.getGL().getGL3(); 
    loader.setUniformMatrix("projection", projection); 

    gl.glClear(GL3.GL_COLOR_BUFFER_BIT | GL3.GL_DEPTH_BUFFER_BIT); 

    myTexture.bind(gl, modeling, "my_texture"); 

    myTexture.bind(gl, program, "my_texture"); 

    Mat4 mv = MatrixMath.lookAt(this.eyeX,this.eyeY,this.eyeZ,this.at,this.up); 

    program.setUniformMatrix("model_view", mv); 
    program.use(gl); 
    vbo.bind(gl); 
    gl.glDrawArrays(GL3.GL_TRIANGLES, 0, numVertices); 
    // 2nd part 
    mouseMv = mv; 
    modeling.setUniformMatrix("model_view", mouseMv); 
    Mat4 translate = MatrixMath.translate(1.0f, 0.35f, 0); 
    Mat4 rotate = MatrixMath.rotationX(-270.0f); 
    mouseMv = mouseMv.mul(translate); 
    mouseMv = mouseMv.mul(rotate); 

    angle += 2.0f; 
    if (angle > 360.0f) 
    angle -= 360.0f; 

    rotate = MatrixMath.rotationZ(angle); 
    mouseMv = mouseMv.mul(rotate); 
    modeling.setUniformMatrix("model_view", mouseMv); 
    modeling.use(gl); 
     for (Map.Entry<String, VertexBufferObject> entry : vboHashMap.entrySet()) { 
      String key = entry.getKey(); 
      entry.getValue().bind(gl); 
      gl.glDrawArrays(GL3.GL_TRIANGLES, 0, SGFLoader.getNumVertices(key)); 
     } 
} 

(非常SRY爲「簡單的框架,」我們需要用...它不允許我在網上提供的教程工作)

Mat4 mv = MatrixMath.lookAt(this.eyeX,this.eyeY,this.eyeZ,this.at,this.up); 

program.setUniformMatrix("model_view", mv); 

我創建了一個'看看矩陣',它可以讓我把眼睛放在相機上看看給定的點。現在它是(0.0,0.0,0.0);在這之後,當我從頂點繪製房屋時,它被放置在給定的點(以(0.0,0.0,0.0)爲中心的矩形);然後,

當我想把鼠標的模型,我使用前一個對象的最後一個變換矩陣把它放在它的引用(在這種情況下,我使用mv矩陣[我從它的類示例]);我可以把它放在任何其他地方,而無需參考以前的對象嗎?在教程中,我發現他們使用矩陣推和矩陣彈出來獲得不同的對象。我想控制鼠標移動,並通過按鍵盤按鈕在場景中移動它,但它沒有成功。我試圖乘以一個翻譯矩陣mouseMv,但它並沒有改變它的位置。任何建議如何讓鼠標「可控」並在場景中移動?

當我爲mouseMv創建一個新矩陣時,該對象不可見。

這是我關心的問題。當我在場景中創建大量對象時,他們將不得不引用先前創建的對象。

回答

1

嘗試將變換矩陣理解爲一系列濃縮爲單個實體的變換。你可以用矩陣鏈變換。您從lookAt矩陣開始,我們稱之爲view

然後對於每個模型你有自己的模型矩陣,例如model_transform_mouse,model_transform_cat等等。該模型視圖複合矩陣的視圖與模型的相乘的結果轉換

modelview = view · model_transform_ 

因此,創建一個通用的lookAt矩陣,然後爲您創建的第一個複製一個新的模型視圖矩陣查看矩陣中的每個模型和模型乘以轉換到它。

Mat4 view = MatrixMath.lookAt(this.eyeX,this.eyeY,this.eyeZ,this.at,this.up); 

Mat4 model_transform_cat = ... 
Mat4 modelview_cat = view.mul(model_transform_cat); //assuming Mat4::mul does not modify the calling instance 
0

OpenGL有一個堆棧機制,允許您在某些點保存轉換矩陣。您應該考慮明智地使用glPushMatrix()glPopMatrix()來按照自己想要的方式放置場景中的每個元素。