2013-01-17 129 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()来按照自己想要的方式放置场景中的每个元素。