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

这是我的解决方案:

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

赞助人.addChild 因为我在屏幕上有很多对象。objeto.setCollisionMode 是一个使对象可碰撞的 jcpt 函数。

下一步:触摸屏(互联网上的更多信息)

    public boolean onTouch(View v, MotionEvent event) {

下一步:

fb 是帧缓冲区。xpos 和 ypos 是二维坐标。然后,您必须从 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);
     }
于 2017-07-11T21:46:07.590 回答
1

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

谢谢您的帮助

于 2016-06-21T22:24:25.030 回答
0

我没有看到您在任何地方设置触摸侦听器,覆盖该方法适用于 GLSurfaceView 类,而不适用于 Activity。

设置内容视图后,您可以在创建时为框架布局 (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

于 2016-06-20T09:23:48.750 回答