2016-04-06 9 views
3

私はコミュニティのほとんどの質問が少なくともいくつかのコードで行われるべきであることを知っています。しかし、私はここで完全に失われている、私はどこから始めるべきかも知らない。私がしたいことは、Vuforia ARライブラリを使用してLibGDX 3D modelInstancesをレンダリングすることです。しかし、私はVuforiaをmodelInstancesをレンダリングさせる方法や、カメラとしてlibGDXカメラを使用する方法を知りません。Vuforia ARライブラリでLibGDX modelInstanceをレンダリングするにはどうすればよいですか?

私は外部調査を行っていますが、有用な情報を見つけることができませんでした。私がこれを始める手助けをすることができる人はいますか?

答えて

1

だから、私は最終的に両方のライブラリを組み合わせることに成功しました。私がやっていることが最も効果的な働き方だとは分かりませんが、それは私のために働いています。

まずは、私はVuforiaのサンプルアプリケーションに基づいています。具体的には、FrameMarkersの例を使用します。

空のLibGDXプロジェクトを開き、Vuforia jarをインポートして、SampleApplicationControl、SampleApplicationException、SampleApplicationGLView、SampleApplicationSession、FrameMarkerRenderer、およびFrameMarkerをコピーしました。

次に、私はLibGDXのAndroidLauncherクラスにいくつかの属性を作成し、すべてのVuforiaスタッフを初期化:私はSampleApplicationSessionにsetmActivity()を作成したので

public class AndroidLauncher extends AndroidApplication implements SampleApplicationControl{ 
    private static final String LOGTAG = "FrameMarkers"; 


    // Our OpenGL view: 
    public SampleApplicationGLView mGlView; 
    public SampleApplicationSession vuforiaAppSession; 
    // Our renderer: 
    public FrameMarkerRenderer mRenderer; 
    MyGDX gdxRender; 
    // The textures we will use for rendering: 
    public Vector<Texture> mTextures; 
    public RelativeLayout mUILayout; 

    public Marker dataSet[]; 

    public GestureDetector mGestureDetector; 


    public LoadingDialogHandler loadingDialogHandler = new LoadingDialogHandler(
     this); 

    // Alert Dialog used to display SDK errors 
    private AlertDialog mErrorDialog; 

    boolean mIsDroidDevice = false; 
    @Override 
    protected void onCreate (Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     vuforiaAppSession = new SampleApplicationSession(this); 
     vuforiaAppSession.setmActivity(this); 
     AndroidApplicationConfiguration config = new  AndroidApplicationConfiguration(); 


     // Load any sample specific textures: 
     mTextures = new Vector<Texture>(); 
     loadTextures(); 
     startLoadingAnimation(); 
     vuforiaAppSession.initAR(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
     gdxRender = new MyGDX (vuforiaAppSession); 
     gdxRender.setTextures(mTextures); 
     initialize(gdxRender, config); 

     mGestureDetector = new GestureDetector(this, new GestureListener()); 

     mIsDroidDevice = android.os.Build.MODEL.toLowerCase().startsWith(
      "droid");  
} 

私が活動を設定する必要がありました。

その後、私はLibgdx ApplicationAdapterクラスを実装し、vuforiaAppSessionを属性として渡して、初期化したすべてのものにアクセスしました。

public class MyGDX extends ApplicationAdapter { 
    ModelInstance modelInstanceHouse; 
    private AnimationController controller; 
    Matrix4 lastTransformCube; 
    // Constants: 
    static private float kLetterScale = 25.0f; 
    static private float kLetterTranslate = 25.0f; 
    // OpenGL ES 2.0 specific: 
    private static final String LOGTAG = "FrameMarkerRenderer"; 
    private int shaderProgramID = 0; 
    private Vector<com.mygdx.robot.Texture> mTextures; 
    //SampleApplicationSession vuforiaAppSession; 
    PerspectiveCamera cam; 
    ModelBuilder modelBuilder; 
    Model model; 
    ModelInstance instance; 
    ModelBatch modelBatch; 
    static boolean render; 
    public SampleApplicationSession vuforiaAppSession; 

    public MyGDX (SampleApplicationSession vuforiaAppSession){ 
     super(); 
     this.vuforiaAppSession = vuforiaAppSession; 

    } 

最後に重要なことは、render()メソッドです。私はFrameMarkerRendererのレンダリングメソッドに基づいていました。カメラの起動時に起動される論理値を持ちます。そこで私は、vuforia ARの初期化とrender()メソッドの両方で変数を単純に変更しました。私はカメラを設置して単位行列を作り、modelViewMatrixでモデルを掛けなければなりませんでした。

@Override 
public void render() { 
    if (render) { 
     // Clear color and depth buffer 
     GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT); 
     // Get the state from Vuforia and mark the beginning of a rendering 
     // section 
     State state = Renderer.getInstance().begin(); 
     // Explicitly render the Video Background 
     Renderer.getInstance().drawVideoBackground(); 

     GLES20.glEnable(GLES20.GL_DEPTH_TEST); 

     // We must detect if background reflection is active and adjust the 
     // culling direction. 
     // If the reflection is active, this means the post matrix has been 
     // reflected as well, 
     // therefore standard counter clockwise face culling will result in 
     // "inside out" models. 
     GLES20.glEnable(GLES20.GL_CULL_FACE); 
     GLES20.glCullFace(GLES20.GL_BACK); 
     cam.update(); 
     modelBatch.begin(cam); 

     if (Renderer.getInstance().getVideoBackgroundConfig().getReflection() == VIDEO_BACKGROUND_REFLECTION.VIDEO_BACKGROUND_REFLECTION_ON) 

         GLES20.glFrontFace(GLES20.GL_CW); // Front camera 
     else 
      GLES20.glFrontFace(GLES20.GL_CCW); // Back camera 

     // Set the viewport 
     int[] viewport = vuforiaAppSession.getViewport(); 
     GLES20.glViewport(viewport[0], viewport[1], viewport[2], viewport[3]); 

     // Did we find any trackables this frame? 
     for (int tIdx = 0; tIdx < state.getNumTrackableResults(); tIdx++) 
     { 
      // Get the trackable: 
      TrackableResult trackableResult = state.getTrackableResult(tIdx); 
      float[] modelViewMatrix = Tool.convertPose2GLMatrix(
        trackableResult.getPose()).getData(); 

      // Choose the texture based on the target name: 
      int textureIndex = 0; 

      // Check the type of the trackable: 
      assert (trackableResult.getType() == MarkerTracker.getClassType()); 
      MarkerResult markerResult = (MarkerResult) (trackableResult); 
      Marker marker = (Marker) markerResult.getTrackable(); 
      textureIndex = marker.getMarkerId(); 
      float[] modelViewProjection = new float[16]; 
      Matrix.translateM(modelViewMatrix, 0, -kLetterTranslate, -kLetterTranslate, 0.f); 
      Matrix.scaleM(modelViewMatrix, 0, kLetterScale, kLetterScale, kLetterScale); 
      Matrix.multiplyMM(modelViewProjection, 0, vuforiaAppSession.getProjectionMatrix().getData(), 0, modelViewMatrix, 0); 
      SampleUtils.checkGLError("FrameMarkers render frame"); 
      cam.view.idt(); 
      cam.projection.idt(); 
      cam.combined.idt(); 
      Matrix4 temp3 = new Matrix4(modelViewProjection); 
      modelInstanceHouse.transform.set(temp3); 
      modelInstanceHouse.transform.scale(0.05f, 0.05f, 0.05f); 
      controller.update(Gdx.graphics.getDeltaTime()); 
      modelBatch.render(modelInstanceHouse); 
     } 
     GLES20.glDisable(GLES20.GL_DEPTH_TEST); 
     modelBatch.end(); 

} 

は、多くのコードをIt's、私はそれが両方のライブラリを統合起動しようとする人々に役立ちます願っています。私はこれが効率的だとは思わないが、それは私が来た唯一の解決策だ。

1

私は特にVuforia ARに精通していませんが、質問にはしばらく回答がないので、私はそれを打ち明けます。


LibGDXにおけるカメラは、基本的にちょうど2つの4x4の行列のラッパー、ビュー行列Camera#view、および投影行列であるCamer#projection(ワールド空間の変換のために使用される別のマトリックス、モデルマトリクスは、しかし、私は信じて、そこにありますLibGDXでは、この行列は既にビュー行列に組み込まれています[したがってCamera#viewは実際にはモデルビュー行列です])。

これからは、私が気づいていないより単純な解決策がない限り、VuforiaとLibGDX apisの間の予測に対処するために、これらの基礎となる行列を使用できるはずです。

(さらに読書をお勧めします:モデル、ビュー、3Dグラフィックスにおける射影行列)


次はVuforiaを使用してLibGDXの3D ModelInstancesをレンダリングしています。この問題の一般的な解決方法は、ModelInstanceをVuforiaが認識できるものに変換することです。これは、LibGDXモデルで表されるメッシュ/頂点データをVuforiaに直接供給することによって行われます。

IMOは、これについて最も良い方法は、VuforiaとLibGDXの両方に簡単に与えられるモデルデータのコア表現を使用することです(たとえば、両方が認識できる特定のファイル形式、ラップアップしてどちらかのAPIに与えるのが簡単な生のFloatBuffers)。参考までに、LibGDXは、Model#meshesまたはModelInstance#model#meshesでアクセス可能な、FloatBuffersのコレクションにモデルを頂点情報として格納します。

0

しかし、パブロの答えはちょっと違うアプローチ(LibGDXからのVuforiaの呼び出し、それ以外の方法ではない)とより完全な例に興味があれば、単純な3Dモデルレンダラーを使ったgithub repoです。

関連する問題