2011-01-09 6 views
2

私は、opengl(Blender)の3dモデリングプログラムで構築した少しの潜水艦を表示しようとしています。AndroidとOpenGL - 別のオブジェクトを通してオブジェクトを参照

潜水艦は、球の端に交差する長い円筒を使用して構築されています。

私が得ている問題は、結果を見てみると、シリンダーを通して球全体を見ることができるということです。私は球体を通る円柱の端も見ることができます。これは私がライティングをしているときに現れます。私はアンビエントと拡散照明を使用しています。私はちょうどシリンダーの外側の球の半分を見たいと思い、私はどんな内臓も見たくない。

私は顔をカリングし、それは両方のオブジェクトの前面を削除しますが、私は球がはっきりと見えます。

以下、私はすべてのOpenGLパラメータを設定するonSurfaceCreated関数を貼り付けました。どんな提案も感謝しています!

@Override 
public void onSurfaceCreated(GL10 gl, EGLConfig config) { 
    // 
    gl.glEnable(GL10.GL_DEPTH_TEST); 
    //gl.glMatrixMode(GL10.GL_PROJECTION); 

    gl.glMatrixMode(GL10.GL_MODELVIEW); 

    gl.glEnable(GL10.GL_POLYGON_OFFSET_FILL); 

    gl.glEnable(GL10.GL_LIGHTING); 
    gl.glEnable(GL10.GL_LIGHT0); 

    // Define the ambient component of the first light 
    float[] light0Ambient = {0.1f, 0.1f, 0.1f, 1.0f};   
    gl.glLightfv(gl.GL_LIGHT0, gl.GL_AMBIENT, FloatBufferFromFloatArray(light0Ambient, 4)); 

    // Define the diffuse component of the first light 
    float[] light0Diffuse = {0.7f, 0.7f, 0.7f, 1.0f}; 
    gl.glLightfv(gl.GL_LIGHT0, gl.GL_DIFFUSE, FloatBufferFromFloatArray(light0Diffuse, 4)); 

    // Define the specular component and shininess of the first light 
    float[] light0Specular = {0.7f, 0.7f, 0.7f, 1.0f}; 
    float light0Shininess = 0.4f; 
    //gl.glLightfv(gl.GL_LIGHT0, gl.GL_SPECULAR, FloatBufferFromFloatArray(light0Specular, 4));   

    // Define the position of the first light 
    float[] light0Position = {1.0f, 0.0f, 0.0f, 0.0f}; 
    gl.glLightfv(gl.GL_LIGHT0, gl.GL_POSITION, FloatBufferFromFloatArray(light0Position, 4)); 

    // Define a direction vector for the light, this one points correct down the Z axis 
    float[] light0Direction = {0.0f, 0.0f, -1.0f}; 
    //gl.glLightfv(gl.GL_LIGHT0, gl.GL_SPOT_DIRECTION, FloatBufferFromFloatArray(light0Direction, 3)); 

    // Define a cutoff angle. This defines a 90° field of vision, since the cutoff 
    // is number of degrees to each side of an imaginary line drawn from the light's 
    // position along the vector supplied in GL_SPOT_DIRECTION above 
    //gl.glLightf(gl.GL_LIGHT0, gl.GL_SPOT_CUTOFF, 180.0f); 

    gl.glEnable(GL10.GL_CULL_FACE); 
    // which is the front? the one which is drawn counter clockwise 
    gl.glFrontFace(GL10.GL_CCW); 
    // which one should NOT be drawn 
    gl.glCullFace(GL10.GL_BACK); 

    gl.glClearDepthf(10f); 
    gl.glPolygonOffset(1.0f, 2); 

    initShape(); 

    gl.glScalef(0.5f, 0.5f, 0.5f); 
} 
+0

スクリーンショットを投稿できますか? – ChrisF

+0

法線のような音が逆になります。 – Dave

+0

http://img696.imageshack.us/i/13043028.png/ –

答えて

1

バックフェイスカリングの問題であるかどうか確認してみましたか? glEnable(GL_CULL_FACE)glDisableに変更して確認してください。間違いないことを確認してください。同じメッシュ上で両方の巻き取りオーダーを行うことができるため、モデリングの一部分には間違いがありますが、別のものには間違っている可能性があります。問題がないことを確認するために無効にするのが最も簡単です。

何らかの理由でデプスバッファなしでサーフェスが作成されている可能性がありますか? EGLConfigパラメーターをチェックして、そうでないことを確認してください。通常はデフォルトでデプスバッファで作成されますが、その動作をオーバーライドすることは可能です。

また、内部の顔が見えないものをモデリングすることは、あなたのリアルタイムのパフォーマンスにとって良いことをするつもりはありません。ブレンダーでブーリアン演算子を使用することを検討する必要があります。少なくとも、内部の面を取り除くには、結局のところ、ポリカウントだけではなく、それらのトポロジに注意を払って注意を払うことがベストです三角形のストリップに合うようにしてください(これは、あなたが今得ている問題を言い訳するものではありません)。

+0

私は顔のカリングを削除し、内部の顔を取り除いて、それは素晴らしい見えた。私は戻って顔カリングをオンにし、それはまだよく見えたので、私はそれが内部の顔だったはずだと思います。しかし、EGLConfigパラメータは何ですか?私はウェブ上でそれについて良い資料を見ません。 –

+0

数日は離れています。 EGLConfigは低レベルのEGL型で、 'javax.microedition.khronos.egl.EGL10.eglGetConfigAttrib'のような静的メソッドで使用して、あなたのアプリケーションが動作しているものを見つけることができます。使用するのはちょっと難しいですが、レンダラーが持つ機能を正確に知ることは本当に便利です。 –

1

「一部のシーングラフを初期化する」という考え方があります。それはOpenGLがどのように動作するかではありません(これは、私が答えとして書いた3回目の連続です)。 onSurfaceCreatedで行ったことは、実際には表示ルーチンに属しています。 OpenGLはシーングラフではありません。その状態を必要とするものを描画する前に、必要な状態をすべて設定します。

私はそこに "initShape"という関数があることを知っています。私はこれがあなたが意図していることをするとは思わない。

+0

initShapeは、図形の描画に使用されるすべての頂点、インデックス、法線を含むファイルを開きます。 私のonSurfaceCreatedのすべてのものは実際にonDrawFrameに属していますか?私が見たすべての例は、実際にはこのようにしています:)。私は先に進んでそれを動かして、それがすべて一緒になるようにします。 円筒の問題の球はどうですか?これが世話をすると思いますか? –

+0

onStart()のように、ジオメトリをロードする場所がおそらくあります。 常に複数のサーフェスが存在する可能性があるので、それぞれのサーフェスに対してジオメトリを再ロードしたいのですか? – HaMMeReD

+0

はい、私はそれらのチュートリアルを知っています。彼らはすべてそれが間違っていた。 OpenGLは状態マシンです。つまり、直前に何が必要なのかに状態ベクトルをリセットしなければなりません。そうしないと、何年も前に起こったことがあなたのお尻を噛む可能性があります。テクスチャの読み込みや頂点バッファオブジェクトへのデータの埋め込みなど、初期化には一度適しています。しかし、ビューポートと投影の設定を含めて、コード内で行う作業は、すべて表示機能に属します。 – datenwolf

1

デプスバッファが有効になっているEGLコンテキストがありますか? GLSurfaceViewを使用している場合は、おそらくSimpleEGLConfigChooser(false)のようなものを探しているでしょう。これはSimpleEGLConfigChooser(true)にする必要があります。

+0

EGL設定とは何ですか?私はアンドロイドの参照を見てきましたが、説明はあまり良くありません(私は実際には全く見ません)。 SimpleEGLConfigChooserの代わりに、おそらくsetEGLConfigChooserを意味しますか?私はセットを試して、それは違いを作るように見えますが、私はそれが何をしたかに私の指を置くことはできません:)。提案していただきありがとうございます。 –

+0

Wiki: "EGLは、OpenGL ES [...]とその基盤となるネイティブプラットフォームのウィンドウシステムとの間のインタフェースで、グラフィックコンテキスト管理、サーフェス/バッファバインディング、レンダリング同期を処理します。言い換えると、OpenGL ESには、カラー/深度/アルファ/ステンシルバッファサイズを含む '世界'が存在します。詳細を知りたい場合は、GLSurfaceViewのソースコードを見ないでください。あなたの正気性を保ちたいのであれば、P、googleで代わりにチュートリアルをしてください。 – Gilead

1

あなたのonDrawFrame()を見ますか?あなたの投影は何ですか、それは、法線を反転させることができ、見た目が面白く見せかけることができます。

深度バッファや深度テストの問題も可能です。

編集:深度テストはあなたの問題ではないようです。球と交差しているポリゴンから深度カリングを見ることができるからです。あなたのジオメトリが問題であるように見えます。

私はカメラを動かせるようにしていますが、あなたはそれを見て回って、何がうんざりしているのか把握することができます。

0

テクスチャを使用している場合は、使用しているブレンド機能を見てください。オーバレイ効果のようにオーバーラップするピクセルが乗算される可能性があります。これは上書きしないで、私が想定したいものです。

関連する問題