0

我正在使用 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));
        }
}

(对于我们需要使用的“简单框架”非常抱歉……它不允许我使用网络中提供的教程)

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 创建一个新矩阵时,该对象不可见。

这是我的担忧。当我将在我的场景中创建大量对象时,他们将不得不参考之前创建的对象。

4

2 回答 2

1

尝试将变换矩阵理解为浓缩为单个实体的一系列变换。您可以使用矩阵链接转换。你从一个我们称之为的lookAt矩阵开始view

然后对于每个模型,您都有自己的模型矩阵,例如model_transform_mousemodel_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
于 2013-01-17T19:45:26.867 回答
0

OpenGL 有一个堆栈机制,允许您在某些点保存变换矩阵。您应该考虑明智地使用场景中的每个元素,glPushMatrix()glPopMatrix()按照您想要的方式准确定位。

于 2013-01-17T19:54:23.920 回答