Frage

Ich bin ein total Noob und ich versuche, ein kleines U-Boot ich in einem 3D-Modellierungsprogramm in opengl (Blender) gebaut anzuzeigen.

Das U-Boot ist baut einen langen Zylinder unter Verwendung mit einer Kugel an dem Ende davon schneidet.

Das Problem, das ich erhalte, ist, dass, wenn ich auf dem Ergebnis aussehen, kann ich die ganze Kugel durch den Zylinder sehen. Ich kann auch das Ende des Zylinders durch die Kugel sehen. Dies erscheint, wenn ich die Beleuchtung auf. Ich verwende ambient und diffuse Beleuchtung. Ich will nur die Hälfte der Kugel auf der Außenseite des Zylinders sehen, und ich will keine Innereien sehen.

Ich habe Gesicht Culling auf und entfernt die Vorderseiten der beiden Objekte, aber ich klar die Kugel sehen.

Im Folgenden werde ich meine onSurfaceCreated Funktion eingefügt, wo ich alle opengl Parameter einstellen. Alle Vorschläge sind willkommen!

@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);
}
War es hilfreich?

Lösung

Haben Sie versucht, zu überprüfen, ob es sich um eine Rückseiten ist Culling Problem? Prüfen Sie es durch die glEnable(GL_CULL_FACE) zu glDisable ändern, nur um zu überprüfen, ist es definitiv nicht. Es kann möglich sein, auf der gleiche Masche beiden Wickel Aufträge haben, so kann mit dem rechten Culling sein für einen Teil des Modells aber falsch für eine anderen -. Es ist am einfachsten, nur um sie zu deaktivieren Sie sicher, dass das nicht das Problem sein

Es ist entweder das, oder Ihre Oberfläche ohne Tiefenpuffer aus irgendeinem Grunde erstellt worden sein? Überprüfen Sie den EGLConfig Parameter sicher sein, dass nicht der Fall ist. Normalerweise wäre es mit einem Tiefenpuffer standardmäßig erstellt werden, aber es ist möglich, dass das Verhalten außer Kraft zu setzen.

Auch die Modellierung Dinge mit Innenflächen, die zu sehen sein werden nie werden nicht gute Dinge für Ihre Echtzeit-Performance tun. Sie sollten mit einem boolean ‚oder‘ Betrieb im Mixer zumindest, um loszuwerden, die Innenseite betrachten, aber letztlich ist es am besten Ihre Modelle mit vieler Sorgfalt und Aufmerksamkeit auf ihre Topologie Handwerk, nicht nur für Poly zählen, sondern auch dafür, wie gut sie zusammen passen in einen Dreiecksstreifen (die das Problem nicht entschuldigen Sie jetzt bekommen - die nur eine Notiz für die Zukunft ist)

Andere Tipps

Ich sehe, dass Sie denken immer noch in Bezug auf die „einige Szenengraph Initialisierung“. Das ist nicht, wie OpenGL funktioniert (gee, zum dritten Mal in Folge ist ich dies als Antwort schreiben). Alles, was Sie haben zu tun in onSurfaceCreated stopfen tatsächlich, gehören in die Anzeigeroutine. OpenGL ist kein Szenengraph. Sie setzen alle den Zustand Sie brauchen, rechts, bevor Sie das Zeug sind Zeichnung, die diesen Zustand erfordert.

Ich sehe, Sie haben die Funktion „initShape“ gibt. Ich glaube nicht, das tut, was Sie möchten.

Sind Sie sicher, dass Sie haben einen EGL Zusammenhang mit dem Tiefenpuffer aktiviert? Wenn Sie GLSurfaceView verwenden Sie wahrscheinlich auf der Suche nach so etwas wie SimpleEGLConfigChooser (false), die SimpleEGLConfigChooser sein sollte (true).

Lets sehen Ihre onDrawFrame ()? Was ist Ihr Vorsprung ist, es Normalen umgedreht werden kann und eine verkorkste Projektion macht es komisch aussehen.

Probleme mit dem Tiefenpuffer oder eine gründlichere Prüfung sind ebenfalls möglich.

Edit: Es sieht aus wie Tiefentest ist nicht Ihr Problem, da Sie Tiefe Keulung von Ihrem Polygon sehen können, dass die in der Sphäre schneidet. Es sieht aus wie Ihre Geometrie ist das Problem.

Ich würde es so machen Sie Ihre Kamera bewegen kann, dann kann man sich umschaut und herauszufinden, was mit ihm vermasselt.

Wenn Sie mit Texturen einen Blick auf die Mischfunktion haben Sie verwenden. Es könnte der Fall sein, dass Pixel, die Überlappung get multiplizierten wie in einem Overlay-Effekt nicht überschrieben, das ist, was Sie wollen, nehme ich an.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top