1
German corner / Re: Screen-Koordinaten in 3D-Koordinaten umwandeln
« on: February 19, 2013, 11:28:51 pm »
Ja das wars....DANKE DIR..!
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.
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;
}
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);
}
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);
}
...
}
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..!
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..!
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;
}
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);