1

ARToolKit + jpct + android の適応を見つけました:

https://github.com/plattysoft/ArToolKitJpctBaseLib

画面上にさまざまな 3D オブジェクトを描画します。しかし今、私は問題を抱えています: 私はそれらに触れる必要があります。私はこのチュートリアルを見ました : http://www.jpct.net/wiki/index.php?title=Picking初心者です..

これは 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;
        }
          ....
}
4

3 に答える 3

1

解決しました!何時間も費やしましたが、ついに欲しいものを手に入れました。ARToolKit(Android) マーカーにいくつかの 3D オブジェクトを描画し、それぞれをクリックします。

助けてくれてありがとう

于 2016-06-21T22:24:25.030 に答える
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
}

使用しているライブラリの全体的なアイデアは、ほぼすべてのアプリで同じになる Renderer を作成するなど、すべてのボイラープレート コードをカプセル化することです。

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

于 2016-06-20T09:23:48.750 に答える