0

私はAndroidのopengllibに取り組んでおり、小さな問題が発生しました。簡単に修正できることはわかっていますが、追跡するのに多くの問題があります。一言で言えば、私は本当に軽量で素晴らしいシナリオ2Dシーングラフライブラリに基づいた3Dシーングラフライブラリに取り組んでいます。構造を詳細に説明するには時間がかかりすぎますが、基本的にツリー内のすべてのノードには、テクスチャやマテリアルの初期化が行われるload(GL10 gl)メソッドがあります。次に、シェイプノード用のdraw()メソッドと、マテリアル用のkillDraw()メソッドがあります。

私のマテリアルクラスは、3Dモデリングアプリプログラムの観点から来た私のような人々にとってユーザーフレンドリーであることを目的としています(私にとっては最大3ds)。ここに問題があります:

シーンにいくつかの3Dシェイプを作成します。

FXShape shape4 = new FXShape();
shape4.setShape(new Model("cup.obj"));

Material material = new Material();
material.setAmientAndDiffuse(1,0,0,1);          
shape5.addMaterial(material);

add(shape4);

FXShape shape5 = new FXShape();
shape5.setShape(new Cube());
shape5.addMaterial(new TextureMaterial(shape5.getShape(),R.drawable.crate));
add(shape5);

最初のシェイプ用に作成された赤いマテリアルが、そのシェイプだけでなく、独自のテクスチャを持っていても2番目のシェイプに適用されていることを除いて、すべてがうまく機能します。

関連するマテリアルメソッドは次のとおりです

@Override
public void loadMaterial(GL10 gl) { 
}

@Override
public void draw(GL10 gl){
    gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_AMBIENT,his.ambientBuffer);
    gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_DIFFUSE, this.diffuseBuffer);
    gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SPECULAR, this.specularBuffer);
    gl.glMaterialf(GL10.GL_FRONT_AND_BACK, GL10.GL_SHININESS, Math.min(shininess, 128));    
}

@Override
public void killDraw(GL10 gl) {
    gl.glDisableClientState(GL10.GL_COLOR_ARRAY);
}

シーンに10個のシェイプを配置し、シェイプ1と5に色付きのマテリアルを追加すると、1〜5が最初のマテリアルになり、6〜10が2番目のマテリアルになります。

私ができるはずだと思ったのは、gl.glLoadIdentity()のようなものを呼び出してそれをクリアすることですが、マテリアルパラメータについてはそれを見つけることができません。誰か助けてもらえますか?

ありがとう

長さは申し訳ありませんが、できるだけ簡潔にしようとしました。誰かがlibまたはより多くの情報に興味があるなら、私はgitハブhttps://github.com/ghostandthemachine/DroidGraphにいます

4

1 に答える 1

0

作成する各オブジェクトは、使用しているマテリアルプロパティを正確に認識しています。スタック上の関連する状態をプッシュ/ポップするだけです。

于 2011-04-19T14:37:36.783 に答える