Plane, Texture... Probleme.. Oder andere Idee?

Started by Netski, October 26, 2012, 04:07:23 PM

Previous topic - Next topic

Netski

Funktioniert wunderbar.

Leider leide ich immer noch am gleichen Problem.
Beim ersten Start der Activity rendert er die gesamte 3d-Scene nicht. Erst wenn ich einmal zurück gehe und die Activity zum zweiten Mal starte (wobei er doch eh wieder die Static nimmt) rendert er die 3d-Scene.
onsurfacechanged und ondrawframe werden aber immer aufgerufen. Aufbau ist wie in http://www.jpct.net/wiki/index.php/Hello_World_for_Android

Hier mal zwei Logs. Die erste ist vom ersten Start der Activity.
Quote11-19 12:59:21.257: V/status(27385): renderer()
11-19 12:59:21.267: V/status(27385): fview resume
11-19 12:59:21.707: D/libEGL(27385): loaded /system/lib/egl/libGLES_android.so
11-19 12:59:21.717: D/libEGL(27385): loaded /system/lib/egl/libEGL_adreno200.so
11-19 12:59:21.777: D/libEGL(27385): loaded /system/lib/egl/libGLESv1_CM_adreno200.so
11-19 12:59:21.777: D/libEGL(27385): loaded /system/lib/egl/libGLESv2_adreno200.so
11-19 12:59:21.857: V/status(27385): onsurfacechanged
11-19 12:59:21.967: I/jPCT-AE(27385): OpenGL vendor:     Qualcomm
11-19 12:59:21.967: I/jPCT-AE(27385): OpenGL renderer:   Adreno
11-19 12:59:21.967: I/jPCT-AE(27385): OpenGL version:    OpenGL ES-CM 1.1
11-19 12:59:21.967: I/jPCT-AE(27385): OpenGL renderer initialized (using 2 texture stages)
11-19 12:59:21.987: I/jPCT-AE(27385): Adding Lightsource: 0
11-19 12:59:21.987: I/jPCT-AE(27385): Loading file from InputStream
11-19 12:59:22.017: I/jPCT-AE(27385): Expanding buffers...16384 bytes
11-19 12:59:22.017: I/jPCT-AE(27385): Expanding buffers...24576 bytes
11-19 12:59:22.017: I/jPCT-AE(27385): File from InputStream loaded...21747 bytes
11-19 12:59:22.017: I/jPCT-AE(27385): Processing new material Material.002!
11-19 12:59:22.017: I/jPCT-AE(27385): Processing new material Material.001!
11-19 12:59:22.017: I/jPCT-AE(27385): Processing object from 3DS-file: Cone
11-19 12:59:22.037: I/jPCT-AE(27385): Object 'Cone_jPCT0' created using 62 polygons and 33 vertices.
11-19 12:59:22.037: I/jPCT-AE(27385): Processing object from 3DS-file: Torus
11-19 12:59:22.117: I/jPCT-AE(27385): Object 'Torus_jPCT1' created using 1272 polygons and 636 vertices.
11-19 12:59:22.127: I/jPCT-AE(27385): Loading file from InputStream
11-19 12:59:22.127: I/jPCT-AE(27385): File from InputStream loaded...549 bytes
11-19 12:59:22.127: I/jPCT-AE(27385): Processing new material Material.001!
11-19 12:59:22.127: I/jPCT-AE(27385): Processing object from 3DS-file: Icosphere
11-19 12:59:22.127: I/jPCT-AE(27385): Object 'Icosphere_jPCT3' created using 20 polygons and 12 vertices.
11-19 12:59:22.257: I/jPCT-AE(27385): Normal vectors calculated in 120ms!
11-19 12:59:22.397: D/dalvikvm(27385): GC_CONCURRENT freed 955K, 53% free 3197K/6791K, external 2137K/2665K, paused 2ms+3ms
11-19 12:59:22.427: I/jPCT-AE(27385): Loading Texture...
11-19 12:59:22.427: I/jPCT-AE(27385): Texture loaded...131072 bytes/256*128 pixels!
11-19 12:59:22.427: I/jPCT-AE(27385): Loading Texture...
11-19 12:59:22.437: I/jPCT-AE(27385): Texture loaded...32768 bytes/64*128 pixels!
11-19 12:59:22.437: I/jPCT-AE(27385): Memory usage before compacting: 3369 KB used out of 6791 KB. Max. memory available to the VM is 32768 KB.
11-19 12:59:22.467: D/dalvikvm(27385): GC_EXPLICIT freed 139K, 53% free 3230K/6791K, external 2309K/2665K, paused 30ms
11-19 12:59:22.497: D/dalvikvm(27385): GC_EXPLICIT freed 41K, 54% free 3188K/6791K, external 2062K/2575K, paused 29ms
11-19 12:59:22.647: I/jPCT-AE(27385): Memory usage after compacting: 3190 KB used out of 6791 KB. Max. memory available to the VM is 32768 KB.
11-19 12:59:22.727: I/jPCT-AE(27385): Subobject of object 2/object4 compiled to indexed fixed point data using 186 vertices in 29ms!
11-19 12:59:22.777: I/jPCT-AE(27385): Subobject of object 2/object4 compiled to indexed fixed point data using 3816 vertices in 47ms!
11-19 12:59:22.777: I/jPCT-AE(27385): Object 2/object4 compiled to 2 subobjects in 116ms!
11-19 12:59:22.777: I/jPCT-AE(27385): Object 'object4' uses multiple texture sets!
11-19 12:59:22.777: I/jPCT-AE(27385): Object object6 hasn't been build yet. Forcing build()!
11-19 12:59:22.777: I/jPCT-AE(27385): Normal vectors calculated in 1ms!
11-19 12:59:22.777: I/jPCT-AE(27385): Subobject of object 4/object6 compiled to flat fixed point data using 60 vertices in 3ms!
11-19 12:59:22.777: I/jPCT-AE(27385): Object 4/object6 compiled to 1 subobjects in 3ms!
11-19 12:59:22.787: I/jPCT-AE(27385): Creating buffers...
11-19 12:59:22.787: I/jPCT-AE(27385): VBO created for object 'object4'
11-19 12:59:23.207: I/jPCT-AE(27385): Creating buffers...
11-19 12:59:23.207: I/jPCT-AE(27385): VBO created for object 'object4'
11-19 12:59:23.207: I/jPCT-AE(27385): Creating buffers...
11-19 12:59:23.207: I/jPCT-AE(27385): VBO created for object 'object6'
11-19 12:59:23.307: I/dalvikvm(27385): Total arena pages for JIT: 11
11-19 12:59:23.757: I/dalvikvm(27385): Total arena pages for JIT: 12
11-19 12:59:29.867: D/dalvikvm(27385): GC_CONCURRENT freed 507K, 49% free 3465K/6791K, external 2229K/2575K, paused 2ms+7ms


Quote11-19 12:59:39.137: V/status(27385): copied from master
11-19 12:59:39.157: V/status(27385): renderer()
11-19 12:59:39.167: V/status(27385): fview resume
11-19 12:59:39.277: V/status(27385): onsurfacechanged
11-19 12:59:39.277: I/jPCT-AE(27385): Visibility lists disposed!
11-19 12:59:39.317: I/jPCT-AE(27385): All texture data unloaded from gpu!
11-19 12:59:39.317: I/jPCT-AE(27385): Disposing VBOs!
11-19 12:59:39.317: I/jPCT-AE(27385): Renderer disposed!
11-19 12:59:39.327: I/jPCT-AE(27385): OpenGL vendor:     Qualcomm
11-19 12:59:39.327: I/jPCT-AE(27385): OpenGL renderer:   Adreno
11-19 12:59:39.327: I/jPCT-AE(27385): OpenGL version:    OpenGL ES-CM 1.1
11-19 12:59:39.327: I/jPCT-AE(27385): OpenGL renderer initialized (using 2 texture stages)
11-19 12:59:39.327: I/jPCT-AE(27385): OpenGL context has changed(2)...recovering for renderer 1/0!
11-19 12:59:39.327: I/jPCT-AE(27385): Creating buffers...
11-19 12:59:39.457: I/jPCT-AE(27385): OpenGL context has changed(2)...recovering for renderer 1/0!
11-19 12:59:39.457: I/jPCT-AE(27385): Creating buffers...
11-19 12:59:39.467: I/jPCT-AE(27385): OpenGL context has changed(2)...recovering for renderer 1/0!
11-19 12:59:39.467: I/jPCT-AE(27385): Creating buffers...

Einen Unterschied gibts doch noch. In der Oncreate der FView:

...
if (master != null) {
copy(master);
}
super.onCreate(savedInstanceState);

setContentView(R.layout.activity_f_view);

             FrameLayout fviewFL = ((FrameLayout) findViewById(R.id.fview));
...
glsurfaceview = new GLSurfaceView(this);

glsurfaceview.setEGLConfigChooser(8, 8, 8, 8, 16, 0);
glsurfaceview.getHolder().setFormat(PixelFormat.TRANSLUCENT);

renderer = new MyRenderer();


friendviewFL.addView(glsurfaceview);

EgonOlsen

Pfft...keine Ahnung. Die Logs sehen soweit ok aus. Zumindest object4 und object6 werden auch tatsächlich zur GPU geschickt, sollten also irgendwie sichtbar sein. Probiere doch bitte mal, die Initialisierung so zu machen, wie das HelloWorld-Beispiel es tut, also ohne den TRANSLUCENT-Kram mit mit 16bit Farbtiefe.

Ich kann mich nur wiederholen:

Quote
Ich würde den ganzen Kram mal auf eine Activity und ohne irgendwelchen Camera-Zampano eindampfen und wenn das vernünftig läuft, darauf aufbauend die fehlenden Dinge ergänzen. Dann sieht man besser, wo das Problem liegt.

Netski

Puuh.... habe alles immer weiter zerbröselt. Ich habe nun folgenden Effekt: Beim 1. Start läd er 3d-Objekte+Camera wie gewollt. Bei jedem folgenden Mal, läd er NUR die 3D-Objekte, wenn ich das Handy zuvor Vertikal halte. Starte ich meine Activity während ich das Handy Horizontal halte, läd er sie nicht mehr.
Habe es nur mit der folgendenen Reihenfolge hinbekommen und mir geht langsam der Nerv groß :(:

setContentView(R.layout.activity_f_view);
SurfaceView camsurface = (SurfaceView)findViewById(R.id.SurfaceCam);
camsurface = new CamView(this,camsurface.getHolder());

        glsurfaceview = (GLSurfaceView)findViewById(R.id.SurfaceGL);

glsurfaceview.setEGLConfigChooser(8, 8, 8, 8, 16, 0);
glsurfaceview.getHolder().setFormat(PixelFormat.TRANSLUCENT);

renderer = new MyRenderer();

glsurfaceview.setRenderer(renderer);

surfacegl / surfacecam sind parallel in einem framelayout..

Es ist einfach nur noch unbegreiflich. :(

EgonOlsen

Wie gesagt: Ich würde es abspecken, um das Problem einzugrenzen. So ist das alles Stochern im Nebel.

Netski

Naja habe das Problem nicht lösen können. Werde es wohl irgendein workaround bauen müssen.

Andere Frage:
Wie kann ich ein 3D-Objekt anhand von Bildschirm-Koordinaten fest an dem Bildschirm kleben. Egal wie die Kamera sich bewegt.
Also Objekt a soll an Bildschirm Position 20,20 stets angezeigt werden immer mit der gleichen Größe.

Mit Interact2d3d kann ich ja screen-koordinaten anhand der Kamera und des FB's zu 3D-Koordinaten umrechnen lassen. Dabei muss ich mit Sicherheit die Methode mit z-Komponente wählen, leider blicke ich nicht wie diese Methode die z-Komponente interpretiert. Ich dachte das z sei für die "Entfernung des Objektes zum Bildschirm". Aber wenn ich die Kamera bewege, bewegt sich mein Objekt dennoch unvorhersehbar rum.

Was ist falsch?

EgonOlsen

Die Methoden interpretieren z als Tiefe an dem Punkt, an dem die 2D-Koordinate umgerechnet in 3d liegt. Ein Punkt in 2d entspricht ja unendlichen vielen 3d-Koordinaten, deswegen benötigt man zwingend Z, um einen davon zu erwählen. Gibt man z nicht an, wird 1 angenommen. Was aber zu beachten ist: Die Methoden berechnen einen RICHTUNGSVEKTOR und zwar entweder vom Ursprung im Cameraspace (bei den Methoden ohne "WS") oder von der aktuellen Position der Kamera aus (bei den Methoden mit WS). Um daraus eine Position im Worldspace zu ermitteln, muss eine der Methoden mit "WS" verwendet und zusätzlich die Kameraposition addiert werden.
Letztendlich halte ich das für die meisten Anwendungen für gar nicht nötig. Alternativen sind: Ausgehend  von Position und Orientierung der Kamera die Objekte vor jedem Renderdurchlauf ausrichten (damit bekommt man aber keine exakte Positionierung an x/y hin) oder die Objekte in einer eigenen World-Instanz benutzen, in der sich die Kamera nicht verändert. Dazu wäre es aber wichtig zu wissen, was genau das für Objekte sein sollen, die du da rendern willst!?

Netski

3-Dimensionale-Kompassnadel. Lese mir den rest gleich nochmal intensiver durch.

EgonOlsen

Dafür würde ich die entsprechenden Objekte einfach in eine zusätzliche World setzen und in den gleichen FrameBuffer rendern.

Netski

Jop, habe es so gemacht. Funktioniert sehr gut, kompass sitzt nun friedlich links oben in der Ecke.

Das vorherige Problem ist nun auch gelöst... nach langer Zeit:
Starte ich die App während ich das Handy in "Portrait" halte, zeigt er keine 3D-Objekte an, beim Start während Landscape schon. Danach kann man das Handy ruhig drehen und wenden, es verändert sich nichts.
Mein Aufbau ist nun folgender:
-------------------------------------------
AbsoluteLayout
+ FrameLayout (id:CamSurface)
+ FrameLayout (id:GLSurface)
-------------------------------------------
und Füge folgendes in der Activity hinzu:

setContentView(R.layout.activity);
camPrev = new CamView(this);
((FrameLayout) findViewById(R.id.CamSurface)).addView(camPrev);

glsurfaceview = new GLLayer(this);
((FrameLayout) findViewById(R.id.GLSurface)).addView(glsurfaceview);

drawv = new Drawing(this);
((FrameLayout) findViewById(R.id.GLSurface)).addView(drawv);


Anschließend fehlte im GLLayer:

this.setZOrderOnTop(true);

Jetzt geht alles.. :)