[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());
}
}
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的更多相关文章
- 本人AI知识体系导航 - AI menu
Relevant Readable Links Name Interesting topic Comment Edwin Chen 非参贝叶斯 徐亦达老板 Dirichlet Process 学习 ...
- 【AR实验室】ARToolKit之Example篇
0x00 - 前言 PS : 我突然意识到ARToolKit本质可能就是一个可以实时求解相机内外参的解决方案. 拿到一个新的SDK,90%的人应该都会先跑一下Example.拿到ARToolKit的S ...
- [Artoolkit] ARToolKit's SDK Structure on Android
Most applications on Android are developed in Java, and Android provides a rich framework of classes ...
- [Artoolkit] Framework Analysis of nftSimple
What is nftSimple? Loads NFT dataset names from a configuration file. The example uses the “Pinball. ...
- [Artoolkit] Marker of nftSimple
重点看:markers.dat 的解析原理 1. int main(int argc, char** argv) { ]; const char *cparam_name = "Data2/ ...
- [译] AR SDK的种类比你想得要多!这里介绍七个棒棒哒
作者:Eddie Offermann 原文:There are dozens more Augmented Reality SDKs than you think! Here are seven gr ...
- [Artoolkit] kpmMatching & Tracking of nftSimple
1. kpmMatching thread main() --> loadNFTData() --> trackingInitInit() --> In static void *t ...
- 【AR实验室】ARToolKit之制作自己的Marker/NFT
0x00 - 前言 看过example后,就会想自己动动手,这里改改那里修修.我们先试着添加自己喜欢的marker/nft进行识别. 比如我做了一个法拉利的marker: 还有网上找了一个法拉利log ...
- [Artoolkit] Marker Training
Link: Documentation About the Traditional Template Square Marker Limitations (重要) Traditional Templa ...
随机推荐
- Java中使用Timer和TimerTask实现多线程
转自:http://www.bdqn.cn/news/201305/9303.shtml 摘要:Timer是一种线程设施,用于安排以后在后台线程中执行的任务.可安排任务执行一次,或者定期重复执行,可以 ...
- ecshop 添加后台页面以及设置权限
转自 http://blog.csdn.net/tgh1981/article/details/10394059 ecshop 添加新页面 给ecshop后台增加管理功能页面 比如我们增加一个统计报表 ...
- Python学习笔记(十四):模块高级
以Mark Lutz著的<Python学习手册>为教程,每天花1个小时左右时间学习,争取两周完成. --- 写在前面的话 2013-7-23 21:30 学习笔记 1,包导入是把计算机上的 ...
- (转)Render Path
Render Path定义Render Path,就是采取的光照流程. Render Path设置可以在Edit-> Project Settings->Player 里设定,见下图.也可 ...
- IE10、IE11使用 __doPostBack 出现未定义问题
在公司的老项目中分页控件使用了 __doPostBack 方式,在IE兼容模式下正常,在IE10.IE11中 __doPostBack 出现未定义问题. 百度查阅资料得知,这是微软NET环境下的一个B ...
- MySql之查询基础与进阶
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/8283547.html 一:基本查询 SELECT [DISTINCT] 列1,列2,列3... FROM 表 ...
- CentOS 6.5系统上安装SVN服务器端的方法及目录访问权限配置(转总结)
SVN其实就是Subversion,分为服务器端和客户端.之前在网上搜了很多方法,都有各种问题,经过自己搜集整理以及实际尝试,总算有个比较靠谱的方法.本文主要介绍CentOS 6.5系统上安装SVN服 ...
- C#去除HTML标签
public static string ReplaceHtmlTag(string html, int length = 0) { string strText = System.Text.Regu ...
- 转 全面理解Javascript闭包和闭包的几种写法及用途
转自:http://www.cnblogs.com/yunfeifei/p/4019504.html 好久没有写博客了,过了一个十一长假都变懒了,今天总算是恢复状态了.好了,进入正题,今天来说一说ja ...
- FFmpeg: AVFormatContext 结构体分析
AVFormatContext 结构体分析这个结构体描述了一个媒体文件或媒体流的构成和基本信息.这是FFMpeg中最为基本的一个结构,是其他所有结构的根,是一个多媒体文件或流的根本抽象.主要成员释义: ...