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