[Artoolkit] ARSimpleNativeCarsProj for Multi Markers Tracking

效果简直了,但代码架构有点坑,慢慢道来。

 

 


 

libc++_shared.so应该是c++的库;libARWrapperNativeCaresExample.so也有对应的c++文件;那么,libARWrapper.so从哪里来?下一章节讲。

 


 

ARSimpleNativeCarsActivity

Java层的封装,注意ARActivity。

 

public abstract class ARActivity extends Activity implements CameraEventListener {}

public class ARSimpleNativeCarsActivity extends ARActivity {

    private SimpleNativeRenderer simpleNativeRenderer = new SimpleNativeRenderer();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);
    }

    public void onStop() {
        SimpleNativeRenderer.demoShutdown();

        super.onStop();
    }

    @Override
    protected ARRenderer supplyRenderer() {  // ARACTIVITY到底是何方神圣?它的设计理念是什么?
        return simpleNativeRenderer;
    }

    @Override
    protected FrameLayout supplyFrameLayout() {
        return (FrameLayout) this.findViewById(R.id.mainLayout);

    }
}

[ARActivity] 的理解很重要!不过,先来看 [SimpleNativeRenderer]。 <-- 【一对好兄弟!】


public class SimpleNativeRenderer extends ARRenderer {    // 重在实现 ARRenderer 的接口

    // Load the native libraries.
    static {
        System.loadLibrary("c++_shared");
        System.loadLibrary("ARWrapper");
        System.loadLibrary("ARWrapperNativeCarsExample");
    }

    private FPSCounter counter = new FPSCounter();

/****************************************************************/
public static native void demoInitialise(); public static native void demoShutdown();  // --> 在哪里用到了呢? public static native void demoSurfaceCreated(); public static native void demoSurfaceChanged(int w, int h); public static native void demoDrawFrame();
/****************************************************************/
/** * By overriding {@link #configureARScene}, the markers and other settings can be configured * after the native library is initialised, but prior to the rendering actually starting. * Note that this does not run on the OpenGL thread. Use onSurfaceCreated/demoSurfaceCreated * to do OpenGL initialisation. */ @Override public boolean configureARScene() { SimpleNativeRenderer.demoInitialise(); return true; } @Override public void onSurfaceChanged(GL10 gl, int w, int h) { super.onSurfaceChanged(gl, w, h); SimpleNativeRenderer.demoSurfaceChanged(w, h); } @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { super.onSurfaceCreated(gl, config); SimpleNativeRenderer.demoSurfaceCreated(); } @Override public void draw(GL10 gl) { SimpleNativeRenderer.demoDrawFrame(); if (counter.frame()) Log.i("demo", counter.toString()); } }

 

KudanAR - Android: 一个日本的可以作为comment的wiki,不错的样子。

The ARActivity class is an extension of the Activity class, used for displaying the camera feed and AR content. Make sure any activities in your project used to display AR content are extensions of ARActivity.

The ARRenderer is a singleton class used for rendering the camera image and AR content on screen.

 


 接下来,让我欣赏下NDK的实现:

NDK

 

1. 主要是加载marker, model。( ** 与NFT应该有所不同,需进一步分析 ** )

JNIEXPORT void JNICALL JNIFUNCTION_DEMO(demoInitialise(JNIEnv* env, jobject object)) { 
    
    const char *model0file = "Data/models/Porsche_911_GT3.obj";       // 3D model
    const char *model1file = "Data/models/Ferrari_Modena_Spider.obj";
  ////////////////////////////////////////////////////////////////////////////////////////////////////// models[
0].patternID = arwAddMarker("single;Data/hiro.patt;80");    // Marker arwSetMarkerOptionBool(models[0].patternID, ARW_MARKER_OPTION_SQUARE_USE_CONT_POSE_ESTIMATION, false); arwSetMarkerOptionBool(models[0].patternID, ARW_MARKER_OPTION_FILTERED, true); models[0].obj = glmReadOBJ2(model0file, 0, 0); // context 0, don't read textures yet. if (!models[0].obj) { LOGE("Error loading model from file '%s'.", model0file); exit(-1); } glmScale(models[0].obj, 0.035f); //glmRotate(models[0].obj, 3.14159f / 2.0f, 1.0f, 0.0f, 0.0f); glmCreateArrays(models[0].obj, GLM_SMOOTH | GLM_MATERIAL | GLM_TEXTURE); models[0].visible = false;
////////////////////////////////////////////////////////////////////////////////////////////////////// models[
1].patternID = arwAddMarker("single;Data/kanji.patt;80"); arwSetMarkerOptionBool(models[1].patternID, ARW_MARKER_OPTION_SQUARE_USE_CONT_POSE_ESTIMATION, false); arwSetMarkerOptionBool(models[1].patternID, ARW_MARKER_OPTION_FILTERED, true); models[1].obj = glmReadOBJ2(model1file, 0, 0); // context 0, don't read textures yet. if (!models[1].obj) { LOGE("Error loading model from file '%s'.", model1file); exit(-1); } glmScale(models[1].obj, 0.035f); //glmRotate(models[1].obj, 3.14159f / 2.0f, 1.0f, 0.0f, 0.0f); glmCreateArrays(models[1].obj, GLM_SMOOTH | GLM_MATERIAL | GLM_TEXTURE); models[1].visible = false; }

 

2. 似乎也没做什么。

JNIEXPORT void JNICALL JNIFUNCTION_DEMO(demoSurfaceCreated(JNIEnv* env, jobject object)) {
    glStateCacheFlush(); // Make sure we don't hold outdated OpenGL state.
    for (int i = 0; i < NUM_MODELS; i++) {
        if (models[i].obj) {
            glmDelete(models[i].obj, 0);  // init GLMmodel这个结构体 -->
            models[i].obj = NULL;
        }
    }
}
typedef struct ARModel {
    int patternID;
    ARdouble transformationMatrix[16];
    bool visible;
    GLMmodel* obj;
} ARModel;

 

3. 有了unity,是不是就可以忽略这些了呢?需求证。

JNIEXPORT void JNICALL JNIFUNCTION_DEMO(demoDrawFrame(JNIEnv* env, jobject obj)) {
    
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    // Set the projection matrix to that provided by ARToolKit.
    float proj[16];
    arwGetProjectionMatrix(proj);
    glMatrixMode(GL_PROJECTION);
    glLoadMatrixf(proj);
    glMatrixMode(GL_MODELVIEW);
    
    glStateCacheEnableDepthTest();
    glStateCacheEnableLighting();    
    glEnable(GL_LIGHT0);
    
    for (int i = 0; i < NUM_MODELS; i++) {        
        models[i].visible = arwQueryMarkerTransformation(models[i].patternID, models[i].transformationMatrix);        
            
        if (models[i].visible) {                    
            glLoadMatrixf(models[i].transformationMatrix);        
            
            glLightfv(GL_LIGHT0, GL_AMBIENT, lightAmbient);
            glLightfv(GL_LIGHT0, GL_DIFFUSE, lightDiffuse);
            glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);
            
            glmDrawArrays(models[i].obj, 0);
        }
    }
}

  

看来,arBaseLib的分析是重点。 

posted @ 2017-02-26 16:40  郝壹贰叁  阅读(1003)  评论(1编辑  收藏  举报