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_mouse、などの独自のモデル行列がありmodel_transform_catます。modelview複合行列は、viewとモデル変換の乗算の結果です。

modelview = view · model_transform_

したがって、1つのユニバーサルlookAtマトリックスを作成し、次にモデルごとに、最初にそのビューマトリックスをコピーし、それにモデル変換を乗算することによって、新しいmodelviewマトリックスを作成します。

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 に答える