[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 ...
随机推荐
- SpringMVC统一转换null值为空字符串的方法
在SpringMVC中,可以通过在<mvc:annotation-driven>中配置<mvc:message-converters>,把null值统一转换为空字符串,解决这个 ...
- [原创]Java性能优化权威指南读书思维导图2
[原创]Java性能优化权威指南读书思维导图2
- eclim CSearch macro 问题的解决过程备忘录
问题: CSearch 宏时. RuntimeException: Could not find file with URI because it is a relative path, and no ...
- PLSQL连接Oracle 数据库配置详解
1. 下载instantclient-basic-win32-11.2.0.1.0 (oracle官网下载地址:http://www.oracle.com/technetwork/topics/win ...
- PropertyGrid 重难点总结 转
PropertyGrid的界面组成与不同部分的名称如下图所示. 本博文不算是自己写作的,只是将PropertyGrid中的几项十分有用的功能的应用方面的文字进行一下总结,希望以后大家对Property ...
- Window Server 2008 R2 TFS2010 安装前的准备
前言 http://www.cnblogs.com/aehyok/p/3979707.html 这里简单介绍了安装windows Server 2008 R2系统,接下来就开始介绍安装Team Fou ...
- The system is running in low-graphics mode UB16
1.Ctrl+ALT+F1 进入控制台 2.输入用户名和密码进入系统 3.输入以下命令: cd /etc/X11 sudo cp xorg.conf.failsafe xorg.conf sudo r ...
- Gson 与 fastJson 在使用上的差异(fastJson的优点)
一.android 常用的json解析方式 Android 开发上常用的json解析方式有:Gson, fastJson,jackson. 因为jackjson jar包会比较大点(700+k),Gs ...
- inet_ntoa内存问题
最近写的一个程序,大致用到以下代码: WSADATA wsaData; WSAStartup (MAKEWORD( 2, 2 ),&wsaData); struct addrinfo *aiL ...
- [Python设计模式] 第2章 商场收银软件——策略模式
github地址: https://github.com/cheesezh/python_design_patterns 题目 设计一个控制台程序, 模拟商场收银软件,根据客户购买商品的单价和数量,计 ...