2016-06-17 14 views
1

fand ich eine Anpassung von ARToolKit + jpct + Android:Touch-3D-Objekt ArToolKitJpctBaseLib

https://github.com/plattysoft/ArToolKitJpctBaseLib

ich verschiedene 3D-Objekte auf dem Bildschirm zeichnen haben. Aber jetzt habe ich das Problem: Ich brauche sie Ich sah dieses Tutorial zu berühren: http://www.jpct.net/wiki/index.php?title=Picking Aber meine Klasse ist etwas anderes, ist sehr abstrahiert und einfach und ich bin ein Neuling ..

Dies ist der Mainclass, ich meine nicht ... Framebuffer

gefunden
import android.os.Bundle; 
import android.view.MotionEvent; 
import android.widget.FrameLayout; 
import android.widget.Toast; 


import com.threed.jpct.Loader; 
import com.threed.jpct.Object3D; 
import com.threed.jpct.Primitives; 
import com.threed.jpct.SimpleVector; 
import com.threed.jpct.Texture; 
import com.threed.jpct.TextureManager; 
import com.threed.jpct.World; 

import org.artoolkit.ar.jpct.ArJpctActivity; 
import org.artoolkit.ar.jpct.TrackableLight; 
import org.artoolkit.ar.jpct.TrackableObject3d; 

import java.io.IOException; 
import java.util.List; 

public class RealidadAumentada extends ArJpctActivity{ 
    private Object3D astronauta = null; 
    private TrackableObject3d cubo = null; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

    } 

/** 
* Use the FrameLayout in this Activity's UI. 
*/ 
@Override 
protected FrameLayout supplyFrameLayout() { 
    return (FrameLayout)this.findViewById(R.id.mainLayout); 
} 

public void configureWorld(World world) { 
    world.setAmbientLight(150, 150, 150); 

} 

protected void populateTrackableObjects(List<TrackableObject3d> list) { 
    Object3D astronauta2 = null; 

    try { 
     cubo = new TrackableObject3d("single;Data/patt.hiro;80", getCube()); 
     //astronauta2 = getAstronauta2()); 
     astronauta = getAstronauta(); 
     astronauta.setCollisionMode(Object3D.COLLISION_CHECK_OTHERS); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    TrackableLight light = new TrackableLight(); 
    light.setIntensity(0, 0, 255); 
    light.setPosition(new SimpleVector(0, 0, 100)); 
    cubo.addLight(light); 

    cubo.addChild(astronauta); 

    list.add(cubo); 

} 

private Object3D getCube() throws IOException { 
    int scale = 40; 
    Object3D object3D = Primitives.getCube(scale); 
    // Cubes in jpct are rotated by 45 degrees when created. 
    object3D.rotateY((float) Math.PI/4); 
    object3D.setOrigin(new SimpleVector(0, 0, scale)); 
    return object3D; 
} 

    private Object3D getAstronauta() throws IOException { 
     int scale = 40; 
     Object3D[] astronaut = Loader.load3DS(getAssets().open("astronaut1.3ds"), 5); 
     astronaut[0].setOrigin(new SimpleVector(0, 0, 270)); 

     return astronaut[0]; 
    } 


    This method doesnt work 
    public boolean onTouchEvent(MotionEvent me) { 
     if (me.getAction() == MotionEvent.ACTION_DOWN) { 
      Toast.makeText(this, cubo.getXAxis().toString()+"  "+String.valueOf(me.getX()),2000).show(); 
      // Toast.makeText(this,String.valueOf(cubo.getCenter()),2000).show(); 
      return true; 
     } 
      .... 
} 

Antwort

0

ich sehe nicht, dass Sie den Touch-Hörer überall Einstellung überschreiben diese Methode arbeitet auf der GLSurfaceView Klasse, nicht auf die Aktivität.

Sie können beim Festlegen der Inhaltsansicht einen Berührungslistener für das Rahmenlayout (R.id.mainLayout) festlegen.

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    findViewById(R.id.mainLayout).setOnTouchListenr(this); 

} 

@Override 
public onTouch(View v, MotionEvent event) { 
    // Your implementation of touch goes here, not in onTouchEvent 
} 

Die ganze Idee der Bibliothek, die Sie verwenden, ist alle Standardcode zu verkapseln, wie ein Renderer zu schaffen, die das gleiche für fast jede Anwendung sein wird.

Wenn Sie die Surface zugreifen möchten und erweitern sie diese Methode dort zu implementieren, können Sie es tun, diesen Teil zu überschreiben: https://github.com/plattysoft/ArToolKitJpctBaseLib/blob/master/ArJpctBaseLib/src/main/java/org/artoolkit/ar/base/ARActivity.java#L217

+0

Vielen Dank Ich versuche das. Aber ich finde es schwierig, weil in den Beispielen der Code alle zusammen ist. – andvazva

+0

Das Beispiel, das Sie als Ausgangspunkt verwenden, ist 70 Zeilen Code (einschließlich Importe), ich sehe nicht, wie oder warum es nicht alles zusammen sein sollte. Das Ziel der Bibliothek ist es, Sie von dem Standardcode zu abstrahieren, um ARToolkit auf Android zu setzen, Sie sollten es nicht ändern müssen. – shalafi

1

gelöst! Ich verbrachte viele Stunden, aber ich bekam endlich, was ich wollte. Zeichnen Sie mehrere 3D-Objekte auf einem ARToolKit (Android) -Marker und klicken Sie dann auf jeden von ihnen.

Danke für die Hilfe

1

Dies ist meine Lösung:

patron = new TrackableObject3d("single;Data/patt.hiro;80"); 

Patron ist ein verfolgbaren Objekt ist das Beispiel patt hiro.

patron.addChild, weil ich viele Objekte auf dem Bildschirm habe. objeto.setCollisionMode ist eine jcpt-Funktion, die das Objekt kollisionsfähig macht.

Der nächste Schritt: Touchscreen (weitere Informationen im Internet)

public boolean onTouch(View v, MotionEvent event) { 

Nächster Schritt:

fb ist der Framebuffer. xpos und ypos sind die 2D-Koordinaten. Dann, Sie müssen ein Raytrace von Xpos und Ypos zeichnen, um die 3D-Koordinaten zu erhalten. Objeto ist das Objekt, das Sie berühren.

case MotionEvent.ACTION_UP: 

    int xpos = (int) event.getX(); 
    int ypos = (int) event.getY(); 
    SimpleVector dir = Interact2D.reproject2D3DWS(mWorld.getCamera(), fb, xpos, ypos); 
    SimpleVector norm = dir.normalize(); 
    Object[] res = mWorld.calcMinDistanceAndObject3D(mWorld.getCamera().getPosition(), norm, 1000); 
    Object3D objeto = (Object3D) res[1]; 
    float f = mWorld.calcMinDistance(mWorld.getCamera().getPosition(), norm, 1000); 

    if (f != Object3D.COLLISION_NONE) { 
     //Interact with object 
     String nombre = objeto.getName(); 
     Vibrator vib = (Vibrator) getSystemService(VIBRATOR_SERVICE); 
     vib.vibrate(100); 
    }