私は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の新しいマトリックスを作成すると、オブジェクトが表示されません。
これが私の懸念です。シーンにたくさんのオブジェクトを作成するときは、作成された前のオブジェクトを参照する必要があります。