2016-06-17 21 views
1

私はARToolKit + jpct +アンドロイドの適応を発見しました。 は、しかし、今、私は問題を抱えている:私はこのチュートリアルで見た彼らに をタッチする必要があります:http://www.jpct.net/wiki/index.php?title=Picking をしかし、私のクラスは別の何か、非常に抽象化し、シンプルで、私は初心者だ..ですタッチ3DオブジェクトArToolKitJpctBaseLib

これはmainClassあり、私は

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; 
     } 
      .... 
} 

答えて

0

私はない活動に、GLSurfaceViewクラス上で動作しますが、そのメソッドをオーバーライドし、任意の場所にタッチリスナーの設定が表示されない...私のフレームバッファを見つけていません。

コンテンツビューを設定した後、作成時にタッチリスナーをフレームレイアウト(R.id.mainLayout)に設定できます。

@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 
} 

使用しているライブラリの全体的なアイデアは、ほとんどすべてのアプリケーションで同じになるだろうレンダラの作成など、すべての定型コードをカプセル化することです。

あなたはSurfaceViewにアクセスし、そこにそのメソッドを実装するためにそれを拡張したい場合は、この部分を上書きし、それを行うことができます解決https://github.com/plattysoft/ArToolKitJpctBaseLib/blob/master/ArJpctBaseLib/src/main/java/org/artoolkit/ar/base/ARActivity.java#L217

+0

ありがとうございました 私はそれを試みています。しかし、例ではコードがすべて一緒になっているので、難しいと感じています。 – andvazva

+0

出発点として使用している例は、70行のコード(インポートを含む)です。どのように、なぜそれがすべてではないのかわかりません。 ライブラリの目的は、AndroidでARToolkitを設定するための定型コードからあなたを抽象化することです。あなたはそれを変更する必要はありません。 – shalafi

1

! 私は何時間も過ごしましたが、ついに私が望むものを手に入れました。 ARToolKit(Android)マーカーにいくつかの3Dオブジェクトを描画し、それらのそれぞれをクリックします。ヘルプ

1

これが私の解決策であるため

ありがとう:

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

パトロンが追跡可能なオブジェクトでは、例えば、PATTヒロです。

objeto.setCollisionMode(Object3D.COLLISION_CHECK_OTHERS); 
      patron.addChild(objeto); 
      if (mWorld.getObjectByName(objeto.getName())==null) 
       mWorld.addObject(objeto); 

patron.addChild私は画面に多くのオブジェクトがあるためです。 objeto.setCollisionModeは、オブジェクトを衝突可能にするjcpt関数です。

次のステップ:タッチスクリーン(インターネットで詳細)

public boolean onTouch(View v, MotionEvent event) { 

次のステップ:

fbはフレームバッファです。 xposとyposは2D座標です。次に、 3Dトレースを取得するには、xposとyposからレイトレースを描画する必要があります。 オブジェクトはあなたが触っているオブジェクトです。

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); 
    } 
関連する問題