触摸3D对象ArToolKitJpctBaseLib

时间:2016-06-17 09:23:15

标签: java android artoolkit jpct

我找到了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;
        }
          ....
}

3 个答案:

答案 0 :(得分:1)

解决了! 我花了很多时间,但我终于得到了我想要的东西。 在ARToolKit(Android)标记上绘制几个3D对象,然后单击每个对象。

感谢您的帮助

答案 1 :(得分:1)

这是我的解决方案:

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

Patron是一个可跟踪的对象,就是patt hiro的例子。

 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是frameBuffer。 xpos和ypos是2D坐标。然后, 您必须从xpos和ypos绘制光线跟踪以获取3D坐标。 objeto是你正在触摸的对象。

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

答案 2 :(得分: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