Main Menu
Menu

Show posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.

Show posts Menu

Messages - Netski

#1
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.. :)
#2
3-Dimensionale-Kompassnadel. Lese mir den rest gleich nochmal intensiver durch.
#3
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?
#4
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. :(
#5
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);
#6
Die meisten Dinge sind nun erledigt. Danke soweit.

Ich suche jetzt nach einer Möglichkeit mit Paint quasi im dreidimensionalem Raum zeichnen zu können. D.h. ich habe irgendwo ein Objekt und möchte an diesem Objekt z.B. ein Text anzeigen lassen, welcher immer wie ein Billboard zum Benutzer hinzeigt. Hierbei würde der Text folglicherweise kleiner/größer werden je nach Entfernung.

Oder gibt es eine Möglichkeit, die Koordinaten der Objekte im 3D-Raum auf die Bildschirm-Koordinaten zu transformieren?
Z.B. Objekt A liegt bei (0,0,0); Camera bei (1,0,0) und Camera schaut in Richtung (-1,0,0). Frage nun das Objekt nach den Bildschirm koordinaten und müsste in diesem Falle etwas wie (200,150) bekommen bei einem Bildschirm mit 400px Breite und 300px Höhe.
Würde die Kamera nun bei (1,1,0) liegen, käme vllt etwas heraus wie (200, 290).
#7
Ja ich Blicke durch diesen Urwald derzeit auch noch nicht durch.
Habe das Programm nun umgeformt:
FView beinhaltet direkt glsurface & renderer.
Das ganze läuft nun erheblich schneller. Dennoch habe ich immer noch ein Problem: Das Modell wird nicht immer geladen. Manchmal wird es erst geladen, wenn ich die Activity neu aufrufe.
Ich lade folgendermaßen:

modelLoadingStream = getResources().openRawResource(
R.raw.compasscone);
circle = Object3D.mergeAll(Loader.load3DS(modelLoadingStream,
10));

Es kommt mir so vor, als wenn er onDrawFrame früher erreicht, als das er das Objekt geladen hat. Erst mit dem Objekt arbeitet (translationen rotationen etc) und während dessen es nicht mehr richtig läd. Ich möchte nicht anfangen mit Semaphoren oder sonstigen nun anzufangen...


//edit
Also, wenn ich die Activity neu aufrufe, bezieht er sich auf das static Objekt, initialisiert den renderer, läd dort aber die Modelle nicht neu. Woher bezieht er dann die Objekte nach dem Activity-Neustart, wenn onSurfaceChanged(wo die Objekte geladen werden) nicht mehr vollständig durchlaufen wird aufgrund von if(master==null)... ??

Wenn ich das mit dem master==null weglasse, durchläuft er ja sicher onSurfaceChanged und sollte die Objekte laden. Laut Logcat tut er dies auch. Dennoch werden die Objekte nich angezeigt... bin ratlos.!
#8
Okay ich stoße wohl doch wieder auf Grenzen. Aber programmierer auch das erste Mal für Android Systeme.

Hier mein Problem bzw. erst mein Systemaufbau:

Aus einer Activity A starte ich über startActivity per Knopfdruck eine Activity B oder wir nennen sie FView.
Diese FView hat im Hintergrund zum einen eine Kamera, die im Layout an ein CamViewFrame (Framelayout) gehängt wird und funktioniert ohne Probleme.
Desweiteren wird in der FView ein "private GLSurfaceView mGLView;" angelegt und dies in der onCreate instantiiert (mGLView = new GLSurfaceView(getApplication());)
Dazu habe ich ein weiteres FrameLayout (camDrawFrame), welchem ich 1) per addView die mGLView anhänge und 2) erstelle ich ein "drawBoard" aus einer Klasse Drawing und übergebe diesem ebenfalls das mGLView (und mache auch camDrawFrame.addView(drawBoard).
Die Drawing Klasse erzeugt den Renderer und gleichzeitig eine onDraw.
Des weiteren hat die FView noch Sensoren implementiert.

Problem: Erwartet wird ein 3D Objekt welches sich bewegt anhand der Sensoren, Kamera, div. 2D Text der div. Werte des Sensors/3D Objektes anzeigt.
Es kommt beim ersten mal aufrufen: Kein 3D Objekt (drawFrame wird aber aufgerufen), Sensorwerte werden angezeigt (auch immer aktualisiert) und Kamera läuft.
Also fehlt mir jetzt das 3D-Objekt, welches sich eigentlich nach den Sensoren bewegen sollte.
Dann drücke ich auf zurück, und starte FView ein zweites mal direkt: Diesmal gibt es ein 3D-Objekt, welches sich aber nicht bewegt. Zudem werden die Werte nicht mehr aktualisiert auf dem Bildschirm. Jedoch zeigt mit Logcat noch an, dass sich der Sensor ändert(in der FView) und auch drawFrame aufgerufen wird - in der drawFrame ändert sich jetzt aber der Sensor angeblich nicht mehr (immer gleicher Wert).

Also ich bin seit Stunden am suchen und finde nicht mehr meinen Fehler. Wahrscheinlich sehr ich den Wald vor lauter Bäumen nicht mehr und der Fehler liegt irgendwo da wo ich ihn nicht erahne. Hoffe hier kann mir wer helfen. Vielleicht ist mein gesamter Aufbau schon hinfällig. Ich wüsste aber nicht wie ich es sons machen soll.


//Habe jetzt einiges geändert. FView ist eine Activity und implementiert LocationListener und SensorEventListener; Das Layout besteht aus einem GLSurfaceView und einem SurfaceView. Problem ist nun, Camera geht aufs SurfaceView, aber wie/wo den Renderer anhängen?
#9
Jap, funktioniert nun alles soweit.
Das einzige was mich stört ist, dass es sehr ruckelig läuft. Die Bewegung der Kamera erfolgt ja auf der Grundlage eines SensorEvents (Sensordaten ändern sich -> onDraw ändert Position der Kamera).
Bei dieser Art der Translation (Kamera bewegt sich) verhält sich das Programm sehr ruckelig.
Allerdings kann ich gleichzeitig über Touch meinen Kreis drehen (ist noch zu Testzwecken drin) und dabei rotiert der Kreis sehr flüssig.
Gleiches Schema bei beiden: Sensor registriert etwas, ändert Werte, draw zeichnet etwas anhand der Werte. Bei Touch flüssig, bei Motion schlecht.

Idee: Motionsensor bekommt eine ziemlich inhomogene Werteverteilung "10, 15, 30, 44, 60" und genau daran wird die Position in jedem Frame angepasst -> Sprünge von 10 auf 15 sehen wie Ruckeln aus?
Lösung: "MoveTo" für die Kamera, Kamera mit einer Geschwindigkeit x in die Richtung bewegen in kleinen Schritten.
Frage: Logisch oder eher Unfug und ich beachte wieder etwas der jpct-api nicht?


Problem gelöst soweit.
moveCamera verflüssigt das ganze.
Danke für die Hilfe. Wird aber sicherlich nicht das letzte Mal sein, dass ich mich melde :)
#10
Okay, war ein eher dummer Fehler von mir. Habe nur immer in den falschen Logcat filter geschaut.

Nächstes: Wechselt die Kamera ihren "Up" Vektor sobald sie den z-0 Punkt überschreitet?
Ich hoffe ich kann Beschreiben was ich beobachte:

Mein Kreis liegt im 0-Punkt. Kamera startet "über" ihr: also mit den Koordinaten 0/0/50 und bewegt sich dann circa in Richtung 0/10/0 und schaue mit der Kamera immer in Richtung Kreismittelpunkt. Dabei beobachte ich den Kreis anfangs von Oben, beleuchtet wird der Kreis derzeit von unten. Also sehe ich einen dunklen Kreis. Nahe dem z=0(also ich bin noch z>0) sehe ich, dass der Kreis von unten beleuchtet wird. Also: obere Kante Dunkel, untere Kante hell! Sobald kamera-z<0 wird, dreht sich anscheinend die Kamera. Erwarten würde ich folgendes: Die Kante oben bleibt dunkel und untere Kante bleibt hell. Jedoch vertauscht sich dies. Zudem ist das erwartete Bild nicht jenes, in welchem sich der Kreis bei z<0 nach oben hin "wegbiegt" - also die Kante die mir näher ist, sollte nach oben hin verschwinden (gekommen von unten). Man beobachtet als Benutzersicht nur, dass sich die Kamera auf z=0 bewegt, sich um 180° auf der y-achse dreht (ich bewege die kamera in Richtung z zum Kreismittelpunkt und x zum Kreisrand).

Also was ist mit der Kamera los? Oder bin ich wieder aufm Denkfehlertripp?



edit: Kamera rotation um Z um 135° hat es fast gefixxt. Aber scheint mir irgendwie unlogisch. Da z doch die Vertikale-achse ist...
#11
Okay... gibt es irgendwo gescheite Beispiele/Dokus für die Implementierung von .3ds/.obj in jpct? Habe mit blender/sketchup/3dsmax jeweils .3ds/.obj erstellt, jedoch ohne erfolg geladen. Auch verschiedenste Artikel im Forum/Wiki helfen nicht sonderlich weiter.
#12
Jap, das funktioniert. Danke schonmal.

Problem jetzt: Ist man im Kreis (phi=0) sieht man genau auf die Kante vom Kreis (Wie im Flächenland :)). Aber leider verschwindet dann ja die Kante, da die Höhe des planes = 0 ist. Auch unterhalb des Planes fehlt dann die Fläche. Was nun? :(
#13
Hallo!
Ich entwickel derzeit ein Teil für eine AR-Navigation, welche je nach Neigungswinkel (Handy im Horizontalen) nach vorne (also Kamera schaut auf den Boden (90°), oder gerade aus vom Benutzer weg: 0°) ein Kreis auf dem Bildschirm anzeigt.
Der Kreisradius definiert sich theoretisch aus: r(phi)=(90-x)/x - daraus ergibt sich: Bei phi=0 sieht man eine gerade Linie auf dem Bildschirm, bei phi=90 (blick nach unten) sieht man den gesamten Kreis.
Anders ausgedrückt: Man schwebt sozusagen in den Mittelpunkt des Kreises und schaut auf die Kreislinie oder man schwebt über den Kreis und sieht auf den gesamtem Kreis.

Soweit zur Thematik.
Nun zum Problem:
Meine erste Lösung wurde relativ gut mit Paint() gelöst. Kreis zeichnen usw. funktioniert super, sobald jedoch phi=0 wird, wird der Radius beliebig groß, was zu Ungenauigkeiten bei weiteren Berechnungen führt.
Vielleicht hat jemand dazu schon eine passende Lösung parat.

Mein zweiter Lösungsansatz: mit 3D-API
Da bin ich auf die JPCT Api gestoßen und konnte alles recht einfach implementieren. Problem jetzt: Ich kann kein Kreis zeichnen. Nach langem suchen im Forum / Google etc. bin ich auf Beiträge gestoßen wie "Plane machen und Textur eines Kreises drauf". Gut - Habe mir eine Textur gemacht bzw. einen Kreis 512x512 (bzw. beliebig 2^x*2^x) mit einem Roten Kreis drin der bis zu den Kanten des Images geht.

Erstelle mir eine Plane, weise die Textur zu und stelle fest, dass die Plane irgendwie immer nur einen kleineren Ausschnitt anzeigt (geschätzt schneidet die Plane die äußeren 10-20pixel des Bildrandes ab: also fügt er eine 490x490 pixel Datei ein..)

Code: (cube heißt nur noch cube, bedeutet aber natürlich nicht cube)

Texture texture = new Texture(BitmapHelper.rescale(
BitmapHelper.convert(parent.getResources().getDrawable(R.drawable.circle))
, 512,512));
TextureManager.getInstance().addTexture("circle", texture);
cube = Primitives.getPlane(1, 10);
cube.calcTextureWrapSpherical();
          cube.setTexture("circle");
...
7


Wäre super wenn mir jemand weiterhelfen kann. Vielleicht hab ich auch zweimal den falschen Lösungsansatz verwendet.
Danke!