2016-06-17 41 views
1

我發現的ARToolKit + jpct +安卓的改編:觸摸3D對象ArToolKitJpctBaseLib

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

我沒有看到你設置觸摸聽者的任何地方,覆蓋該方法適用於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

+0

謝謝 我在努力。但是我發現這很困難,因爲在這些例子中代碼都是在一起的。 – andvazva

+0

你用作起點的例子是70行代碼(包括導入),我沒有看到它應該如何或爲什麼不應該在一起。 該庫的目標是從樣板代碼中抽象出您在Android上設置ARToolkit,您不需要修改它。 – shalafi

1

解決了! 我花了很多小時,但我終於得到了我想要的。 在ARToolKit(Android)標記上繪製幾個3D對象,然後單擊它們中的每一個。

感謝您的幫助

1

這是我的解決方案:

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

贊助是一個可追蹤的對象,是例如PATT弘。

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是幀緩衝。 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); 
    }