2016-06-17 2 views
1

나는 ARToolKit + jpct + 안드로이드의 적응을 발견했다. 는하지만 지금은 문제가 : 나는이 튜토리얼보고 그들에게 접촉해야합니다 http://www.jpct.net/wiki/index.php?title=Picking 을하지만 내 클래스는 뭔가 다른, 매우 추상화 간단하고 나는 안돼서입니다 ..터치 3D 객체 ArToolKitJpctBaseLib

이것은 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 (안드로이드) 마커에 여러 개의 3D 개체를 그린 다음 각각의 개체를 클릭하십시오. 도움

1

이 내 솔루션에 대한

감사 :

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

후원자가 추적 가능한 객체 인은 예를 들어 패티의 히로입니다.

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에서 raytrace를 그리고 3D 좌표를 얻기 위해 ypos를 그려야합니다. 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); 
    } 
관련 문제