Java 触摸3D对象ArToolKitJpctBaseLib

Java 触摸3D对象ArToolKitJpctBaseLib,java,android,artoolkit,jpct,Java,Android,Artoolkit,Jpct,我发现了ARToolKit+jpct+android的一个改编版本: 我在屏幕上画了各种3D物体。 但现在我有个问题:我需要触摸它们 我看了这个教程: 但我的课程有些不同,非常抽象和简单,我是个新手 这是Main类,我找不到我的帧缓冲区 import android.os.Bundle; import android.view.MotionEvent; import android.widget.FrameLayout; import android.widget.Toast; impor

我发现了ARToolKit+jpct+android的一个改编版本:

我在屏幕上画了各种3D物体。 但现在我有个问题:我需要触摸它们 我看了这个教程: 但我的课程有些不同,非常抽象和简单,我是个新手

这是Main类,我找不到我的帧缓冲区

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;
        }
          ....
}
导入android.os.Bundle;
导入android.view.MotionEvent;
导入android.widget.FrameLayout;
导入android.widget.Toast;
导入com.threed.jpct.Loader;
导入com.threed.jpct.Object3D;
导入com.threed.jpct.Primitives;
导入com.threed.jpct.SimpleVector;
导入com.threed.jpct.Texture;
导入com.threed.jpct.TextureManager;
import com.threed.jpct.World;
导入org.artoolkit.ar.jpct.ArJpctActivity;
导入org.artoolkit.ar.jpct.TrackableLight;
导入org.artoolkit.ar.jpct.TrackableObject3d;
导入java.io.IOException;
导入java.util.List;
公共类realidaumentada扩展了ArJpctActivity{
private objecta=null;
私有TrackableObject3d cubo=null;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
/**
*在此活动的UI中使用框架布局。
*/
@凌驾
受保护的FrameLayout supplyFrameLayout(){
返回(FrameLayout)this.findViewById(R.id.mainLayout);
}
公共空间配置世界(世界世界){
设置环境光(150150150);
}
受保护的空对象(列表){
Object3D=null;
试一试{
cubo=new-TrackableObject3d(“single;Data/patt.hiro;80”,getCube());
//航天员A2=获取航天员A2();
宇航员a=获取宇航员a();
宇航员A.setCollisionMode(Object3D.COLLISION\u CHECK\u OTHERS);
}捕获(IOE异常){
e、 printStackTrace();
}
TrackableLight=新的TrackableLight();
光强度(0,0,255);
设置位置(新的SimpleVector(0,0,100));
库波。艾德莱特(光);
cubo.addChild(宇航员);
列表。添加(cubo);
}
私有Object3D getCube()引发IOException{
int标度=40;
Object3D=Primitives.getCube(比例);
//jpct中的立方体在创建时旋转45度。
object3D.rotateY((float)Math.PI/4);
setOrigin(新的SimpleVector(0,0,scale));
返回object3D;
}
private Object3D GetOutomina()引发IOException{
int标度=40;
Object3D[]宇航员=Loader.load3DS(getAssets().open(“宇航员1.3ds”),5);
宇航员[0].setOrigin(新SimpleVector(0,0270));
返回宇航员[0];
}
这种方法行不通
公共事件(MotionEvent me){
if(me.getAction()==MotionEvent.ACTION\u向下){
Toast.makeText(this,cubo.getXAxis().toString()+“”+String.valueOf(me.getX()),2000.show();
//Toast.makeText(this,String.valueOf(cubo.getCenter()),2000.show();
返回true;
}
....
}

我看不到您在任何地方设置touch listener,重写该方法在GLSURFACHEVIEW类上有效,而在活动上无效

在设置内容视图后,您可以在创建时将触摸侦听器设置为框架布局(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并扩展它以在那里实现该方法,您可以覆盖此部分:

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

感谢您的帮助

这是我的解决方案:

patron = new TrackableObject3d("single;Data/patt.hiro;80");
赞助人是一个可追踪的对象,例如patt hiro

 objeto.setCollisionMode(Object3D.COLLISION_CHECK_OTHERS);
            patron.addChild(objeto);
            if (mWorld.getObjectByName(objeto.getName())==null)
                mWorld.addObject(objeto);
因为我在屏幕上有许多对象。 setCollisionMode是一个使对象可冲突的jcpt函数

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

下一步:

fb是帧缓冲区,xpos和ypos是2d坐标, 必须从xpos和YPO绘制光线跟踪才能获得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);
     }

谢谢,我正在尝试。但我发现这很困难,因为在示例中,代码都在一起。您使用的示例作为起点是70行代码(包括导入),我不明白为什么它不应该放在一起。该库的目标是将您从样板代码中抽象出来,在Android上设置ARToolkit,您不需要修改它。
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);
     }