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


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[].patternID = arwAddMarker("single;Data/hiro.patt;80");    // Marker
arwSetMarkerOptionBool(models[].patternID, ARW_MARKER_OPTION_SQUARE_USE_CONT_POSE_ESTIMATION, false);
arwSetMarkerOptionBool(models[].patternID, ARW_MARKER_OPTION_FILTERED, true); models[].obj = glmReadOBJ2(model0file, , ); // context 0, don't read textures yet.
if (!models[].obj) {
LOGE("Error loading model from file '%s'.", model0file);
exit(-);
} glmScale(models[].obj, 0.035f);
//glmRotate(models[0].obj, 3.14159f / 2.0f, 1.0f, 0.0f, 0.0f);
glmCreateArrays(models[].obj, GLM_SMOOTH | GLM_MATERIAL | GLM_TEXTURE);
models[].visible = false;
//////////////////////////////////////////////////////////////////////////////////////////////////////
models[].patternID = arwAddMarker("single;Data/kanji.patt;80");
arwSetMarkerOptionBool(models[].patternID, ARW_MARKER_OPTION_SQUARE_USE_CONT_POSE_ESTIMATION, false);
arwSetMarkerOptionBool(models[].patternID, ARW_MARKER_OPTION_FILTERED, true); models[].obj = glmReadOBJ2(model1file, , ); // context 0, don't read textures yet.
if (!models[].obj) {
LOGE("Error loading model from file '%s'.", model1file);
exit(-);
} glmScale(models[].obj, 0.035f);
//glmRotate(models[1].obj, 3.14159f / 2.0f, 1.0f, 0.0f, 0.0f);
glmCreateArrays(models[].obj, GLM_SMOOTH | GLM_MATERIAL | GLM_TEXTURE);
models[].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 = ; i < NUM_MODELS; i++) {
if (models[i].obj) {
glmDelete(models[i].obj, );  // init GLMmodel这个结构体 -->
models[i].obj = NULL;
}
}
}
typedef struct ARModel {
int patternID;
ARdouble transformationMatrix[];
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[];
arwGetProjectionMatrix(proj);
glMatrixMode(GL_PROJECTION);
glLoadMatrixf(proj);
glMatrixMode(GL_MODELVIEW); glStateCacheEnableDepthTest();
glStateCacheEnableLighting();
glEnable(GL_LIGHT0); for (int i = ; 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, );
}
}
}

看来,arBaseLib的分析是重点。

[Artoolkit] ARSimpleNativeCarsProj for Multi Markers Tracking的更多相关文章

  1. 本人AI知识体系导航 - AI menu

    Relevant Readable Links Name Interesting topic Comment Edwin Chen 非参贝叶斯   徐亦达老板 Dirichlet Process 学习 ...

  2. 【AR实验室】ARToolKit之Example篇

    0x00 - 前言 PS : 我突然意识到ARToolKit本质可能就是一个可以实时求解相机内外参的解决方案. 拿到一个新的SDK,90%的人应该都会先跑一下Example.拿到ARToolKit的S ...

  3. [Artoolkit] ARToolKit's SDK Structure on Android

    Most applications on Android are developed in Java, and Android provides a rich framework of classes ...

  4. [Artoolkit] Framework Analysis of nftSimple

    What is nftSimple? Loads NFT dataset names from a configuration file. The example uses the “Pinball. ...

  5. [Artoolkit] Marker of nftSimple

    重点看:markers.dat 的解析原理 1. int main(int argc, char** argv) { ]; const char *cparam_name = "Data2/ ...

  6. [译] AR SDK的种类比你想得要多!这里介绍七个棒棒哒

    作者:Eddie Offermann 原文:There are dozens more Augmented Reality SDKs than you think! Here are seven gr ...

  7. [Artoolkit] kpmMatching & Tracking of nftSimple

    1. kpmMatching thread main() --> loadNFTData() --> trackingInitInit() --> In static void *t ...

  8. 【AR实验室】ARToolKit之制作自己的Marker/NFT

    0x00 - 前言 看过example后,就会想自己动动手,这里改改那里修修.我们先试着添加自己喜欢的marker/nft进行识别. 比如我做了一个法拉利的marker: 还有网上找了一个法拉利log ...

  9. [Artoolkit] Marker Training

    Link: Documentation About the Traditional Template Square Marker Limitations (重要) Traditional Templa ...

随机推荐

  1. javascript中break与continue,及return的区别

    a).在循环体中, break是跳出整个循环,不执行以后的循环语句: continue是结束本次循环语句,进入下一个循环: b). 在if判断句,结束该函数的执行时,用 return: c). 在函数 ...

  2. og4j日志文件乱码问题的解决方法

    现象:在默认语言非中文(或者说默认语言不支持中文的)的Windows.Linux.Unix上,用log4j打印日志,出现乱码,常见的就是一堆问号. 解决方法: 如果是log4j.properties为 ...

  3. 10个提升MySQL性能的小技巧

    从工作量分析到索引的三条规则,这些专家见解肯定会让您的MySQL服务器尖叫. 在所有的关系数据库中,MySQL已经被证明了完全是一头野兽,只要通知停止运行就绝对不会让你多等一秒钟,使你的应用置于困境之 ...

  4. mysql yum安装

    # 下载yum源的rpm包wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm# 安装rpm包rpm - ...

  5. maven学习二(dependencies)

    在前面一篇文章maven学习一(HelloWorld工程)已经对maven有了基本介绍,本文开始介绍maven依赖,通过如何如何增加log4j来学习maven的dependencies no-depe ...

  6. Intellij IDEA 通过数据库表逆向生成带注释的实体类文件超级详细步骤,附详细解决方案

    参考:https://blog.csdn.net/qq_34371461/article/details/80571281  https://blog.csdn.net/mqchenrong/arti ...

  7. [Python设计模式] 第9章 如何准备多份简历——原型模式

    github地址:https://github.com/cheesezh/python_design_patterns 题目 设计一个简历类,必须有姓名,可以设置性别和年龄,即个人信息,可以设置曾就职 ...

  8. volitile关键字

    1.volatile关键字的两层语义 一旦一个共享变量(类的成员变量.类的静态成员变量)被volatile修饰之后,那么就具备了两层语义: 1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修 ...

  9. CentOS7中ELK6.2.3安装

      一.配置主机名 hostnamectl set-hostname elk vim /etc/sysconfig/network修改HOSTNAME=elk 安装Java环境:yum install ...

  10. 【PMP】项目风险管理~重点知识

    1.什么是风险,项目的风险从哪里来? 开展项目,不仅要面对各种制约因素和假设条件,而且还要应对可能相互冲突和不断变化的相关方期望.组织应该有目的的以可控方式去冒项目风险,以便平衡风险和回报,并创造价值 ...