2016-11-20 9 views
0

私のアプリケーションでは、単純な3Dオブジェクトを描画しています(質問の最後にコードがあります)。私はGL10オブジェクトを使って描画しています。どのように3Dオブジェクトの定義を実行時にアプリに渡すか?

私は今一歩進んでランタイム中にそのようなオブジェクトの定義を渡したいと思います。私は構築し、私のwebserviceから定義を取得するメソッドにオブジェクトを注入したい。

どのようなヒントを始めるには?

public class SimpleBox { 
private FloatBuffer box; 
private FloatBuffer normals; 
public SimpleBox() { 
    float boxf[] = { 
      // FRONT 
      -25.0f, -25.0f, 25.0f, 
      25.0f, -25.0f, 25.0f, 
      -25.0f, 25.0f, 25.0f, 
      25.0f, 25.0f, 25.0f, 
      // BACK 
      -25.0f, -25.0f, -25.0f, 
      -25.0f, 25.0f, -25.0f, 
      25.0f, -25.0f, -25.0f, 
      25.0f, 25.0f, -25.0f, 
      // LEFT 
      -25.0f, -25.0f, 25.0f, 
      -25.0f, 25.0f, 25.0f, 
      -25.0f, -25.0f, -25.0f, 
      -25.0f, 25.0f, -25.0f, 
      // RIGHT 
      25.0f, -25.0f, -25.0f, 
      25.0f, 25.0f, -25.0f, 
      25.0f, -25.0f, 25.0f, 
      25.0f, 25.0f, 25.0f, 
      // TOP 
      -25.0f, 25.0f, 25.0f, 
      25.0f, 25.0f, 25.0f, 
      -25.0f, 25.0f, -25.0f, 
      25.0f, 25.0f, -25.0f, 
      // BOTTOM 
      -25.0f, -25.0f, 25.0f, 
      -25.0f, -25.0f, -25.0f, 
      25.0f, -25.0f, 25.0f, 
      25.0f, -25.0f, -25.0f, 
     }; 
    float normalsf[] = { 
      // FRONT 
      0.0f, 0.0f, 1.0f, 
      0.0f, 0.0f, 1.0f, 
      0.0f, 0.0f, 1.0f, 
      0.0f, 0.0f, 1.0f, 
      // BACK 
      0.0f, 0.0f, -1.0f, 
      0.0f, 0.0f, -1.0f, 
      0.0f, 0.0f, -1.0f, 
      0.0f, 0.0f, -1.0f, 
      // LEFT 
      -1.0f, 0.0f, 0.0f, 
      -1.0f, 0.0f, 0.0f, 
      -1.0f, 0.0f, 0.0f, 
      -1.0f, 0.0f, 0.0f, 
      // RIGHT 
      1.0f, 0.0f, 0.0f, 
      1.0f, 0.0f, 0.0f, 
      1.0f, 0.0f, 0.0f, 
      1.0f, 0.0f, 0.0f, 
      // TOP 
      0.0f, 1.0f, 0.0f, 
      0.0f, 1.0f, 0.0f, 
      0.0f, 1.0f, 0.0f, 
      0.0f, 1.0f, 0.0f, 
      // BOTTOM 
      0.0f, -1.0f, 0.0f, 
      0.0f, -1.0f, 0.0f, 
      0.0f, -1.0f, 0.0f, 
      0.0f, -1.0f, 0.0f, 
     }; 

    box = GraphicsUtil.makeFloatBuffer(boxf); 
    normals = GraphicsUtil.makeFloatBuffer(normalsf); 
} 


public final void draw(GL10 gl) { 
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
    gl.glEnableClientState(GL10.GL_NORMAL_ARRAY); 

    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, box); 
    gl.glNormalPointer(GL10.GL_FLOAT,0, normals); 
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4); 
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 4, 4); 
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 8, 4); 
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 12, 4); 
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 16, 4); 
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 20, 4); 
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); 
    gl.glDisableClientState(GL10.GL_NORMAL_ARRAY); 
} 
} 

答えて

1

あなたは、例えばあなたのようなデータに何か与えるサーバからのJSON渡すことができます。

{ 
     vertex_count: 30, 
     vertices: [ 
      {x: 0, y: 0, z: 0, nx: 0, ny: 1, nz: 0}, 
      {x: 1, y: 1, z: 1, nx: 0, ny: 1, nz: 0}, 
      {x: 0, y: 1, z: 0, nx: 0, ny: 1, nz: 0}, 
      {x: 1, y: 0, z: 0, nx: 0, ny: 1, nz: 0}, 
      {x: 1, y: 1, z: 0, nx: 0, ny: 1, nz: 0}, 
      ... 
     ] 
     ... 
    } 

あなたのコードの場合と同じように2つのバッファを作成することができますこの方法を。次に、JSONのverticesを反復処理し、その値を2つのfloatバッファに追加します。すべての作業が完了したら、boxnormalsにバッファを割り当てて、新しいオブジェクトが古いオブジェクトを上書きして新しいオブジェクトを表示するようにします。

+0

これは私が選択したルートです。唯一の問題は、アプリケーションに提供しているDBに適切なフォーマットを取得することです。私がWaveform形式(.obj)に3D obejctを変換しても、私はまだポイントを接続する方法を知る必要がありますが、これは私が思うよい解決策です。 – Fixus

+0

あなたは単にobjファイルを提供してランタイムにダウンロードできます。それで、クライアント上で解析する必要があることはまだ残っていますが、それはまだ痛みです。だから、どこかでそれらを解析する必要がある限り、サーバ側で行うほうが良いかもしれませんが、いずれにしてもmtlのマテリアルファイルとテクスチャファイルを提供します。それは本当に正確に何をターゲットにしているかによりますが、スピードが必要な場合は、objをサーバー上のバイナリに解析し、バイナリをクライアントに送信するのが最善です。 –

+0

...バイナリwoldは、次のようなものを意味します。最初の32ビットは、頂点の数を表す整数です。次に、1つの頂点が8つの浮動小数点を持つ32ビット浮動小数点によって表される頂点を定義することができます(位置は3、法線は3、テクスチャ座標は2)。たとえば、頂点が100のモデルでは、このマップから3208バイトのバイナリデータを送信します。 (これはすべて、モデルを定義できる多くの方法の1つです)。しかし、データがインデックスバッファの後に同じ手順を使用することができるので、複雑になる可能性があります。長さのために別の32ビットとインデックスバッファが続きます。 –

関連する問題