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 - BFK

#1
Ja das wars....DANKE DIR..!
#2
Ja, hier der Code-Abschnitt..:


private SimpleVector convertScreenPixelsTo3D(int x, int y)
{

        SimpleVector direction = new SimpleVector( Interact2D.reproject2D3DWS(world.getCamera(), fb, x, y ) ).normalize();


        float distance = world.calcMinDistance(world.getCamera().getPosition(), direction, 10000 );
       
        SimpleVector point = new SimpleVector( direction );
        point.scalarMul( distance );
        point.add(world.getCamera().getPosition() );
       
       
        return point;
}
#3
Das ist ja das Komsiche. Nachdem das Object3D verschwindet, sehe ich, dass seine Position (also der Wert von getTranslation) immer zu gross ist, zum Beispiel sieht er so aus..:

(X,Y,Z): (7.578068E10,3.752948E11,0.0)

Meistens passiert es wenn ich das Objekt zu schnell bewege.
#4
Hallo,
Sorry, dass ich wieder nerven muss, aber damit ich keinen neuen Thread aufmache, hab ich mir gedacht meine Frage hier zu stellen.

Ich habe ein komisches Problem, wenn ich ein Object3D verschiebe. Und zwar verschiebt sich mein Object3D ohne Probleme, aber nach einer Weile verschwindet es von der Bildfläche.

Hier mal der Codeabschnitt:

public boolean onTouchEvent(MotionEvent me) {

if (me.getAction() == MotionEvent.ACTION_DOWN)
{
xpos = me.getX();
ypos = me.getY();

touched_poly = check_which_poly_clicked((int)xpos, (int)ypos);

if(touched_poly != null) // nutzer touches ein polygon
{
move = true;
}

return true;
}
if (me.getAction() == MotionEvent.ACTION_UP) {
move = false;

return true;
}

if (me.getAction() == MotionEvent.ACTION_MOVE)
{
xpos = me.getX();
ypos = me.getY();


return true;
}


return super.onTouchEvent(me);
}




...wobei ich erklären muss, dass "check_which_poly_clicked" eine Methode ist, die prüft, welches "Object3D" berührt wurde und es auch dann zurückliefert (wenn wirklich auf ein Objekt getouched wurde).

Meine "onDrawFrame"-Methode sieht dann so aus..:

public void onDrawFrame(GL10 gl) {


fb.clear(back);
world.renderScene(fb);
world.draw(fb);
fb.display();


if(move && touched_poly != null)
{
SimpleVector movePoint = convertScreenPixelsTo3D((int)xpos, (int)ypos);
movePoint.z = 0;

touched_poly.clearTranslation();
touched_poly.translate(movePoint);

}
...
}


Der obere Code funktioniert leider nicht einwandfrei. Wenn man zuviel das Objekt hin und her bewegt, verschwindet es irgendwann ganz. Was mache ich falsch..?
Wäre auf ein Hinweis dankbar..!
#5
Quote from: EgonOlsen on February 01, 2013, 09:51:12 PM
Leider beschreibst du nicht genau, wie sich das Problem bei dir äußert. Ich rate mal ein wenig: Du hast die Notification Bar sichtbar? In dem Fall beginnt der Bildschirm koordinatentechnisch unter der Leiste, aber die Touchkoordinaten starten erst darunter. Du musst die Größe der Leiste zu den Daten des Events addieren. Wenn es das nicht ist, beschreib doch bitte mal genauer, was das Problem ist.
Gut geraten...! Das war mein Problem. Bei Fullscreen funktioniert alles einwandfrei..!

Quote from: EgonOlsen on February 01, 2013, 09:51:12 PM
Das hängt letztendlich von deinen Anforderungen ab, aber irgendwas spezielles gibt es da nicht. jPCT interessiert sich nicht für Touchevents und arbeitet einfach mit den Werten, die du übergibst. Wo die herkommen, obliegt dir. Achte nur darauf, dass du nicht direkt in den Eventhandlern an jPCT-Objekten arbeitest, weil die Events parallel zum Renderthread laufen und du sonst alle Arten von "lustigen" Seiteneffekten bekommst. Es ist am besten, in den Eventhandler-Methoden nur Flags/Werte zu setzen und diese in onDrawFrame bzw. auszuwerten.
Werd ich mir merken..!

Und nochmals vielen, vielen DANK für deine Hilfe..!
#6
Hallo EgonOlsen und danke für deine schnelle Antwort..!

Habe dein Beispiel mal ausprobiert und es funktioniert einwandfrei.

Habe auch die getWorldPosition-Methode bei mir ausprobiert und die liefert die gleichen Werte.

Entweder ist mir Androids onTouch-Koordinaten zu ungenau oder ich weiss auch nicht was noch falsch sein kann.

Hätte aber noch ne Frage. Wenn ich ein Object3D per Hand verschieben will, welche Weise ist denn da am Besten..? Die standart ACTION_DOWN, ACTION_MOVE, ACTION_UP - Methode oder gibt es da was spezifisches für jPCT..?



#7
Hallo,
Ich experementiere gerade mit der jPCT-Engine ein wenig rum und stehe schon vor einem wesentlichen wichtigem Problem. Ich möchte gern Screen-Koordinaten in 3D-Koordinaten umwandeln (Das umgekehrte funktioniert einwandfrei). Mein Ziel ist es ein Object3D an der gedrückten stelle zu bewegen. Ich weiss es gibt viele Beiträge zu diesem Thema. Habe mir zum Beispiel den Picking-Beitrag gelesen http://www.jpct.net/wiki/index.php/Picking , aber auch andere Beiträge hier im Forum. Leider kriege ich das nicht zum Laufen. Vielleicht könnte mir jemand dabei helfen.

Hier erstmal der Code:

private SimpleVector convertScreenPixelsTo3D(int x, int y)
{
        SimpleVector direction = new SimpleVector( Interact2D.reproject2D3DWS(world.getCamera(), fb, x, y ) ).normalize();

        float distance = world.calcMinDistance(world.getCamera().getPosition(), direction, 10000 );
       
        SimpleVector point = new SimpleVector( direction );
        point.scalarMul( distance );
        point.add(world.getCamera().getPosition() );
       
       
        return point;
     }


Bei onTouch-Event "ACTION_DOWN" habe ich dann folgendes:

int x = (int)me.getX();
        int y = (int)me.getY();
       
        SimpleVector sv = convertScreenPixelsTo3D(x, y);
        Log.i(TEST-JPCT,"Point in Screen Pixels..: ("+x+","+y+")");
        Log.i(TEST-JPCT,"Point in 3D..: "+sv.toString());
       
        poly.clearTranslation();
        poly.translate(sv);


wobei "poly" ein Object3D ist.

Wie es aussieht sind die Berechnungen von "convertScreenPixelsTo3D" falsch, denn poly bewegt sich zwar, aber lerider nicht an der gewünschten (ge-touchten Stelle).

Was mache ich falsch..?