[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 ...
随机推荐
- spyder 安装
https://www.cnblogs.com/pcat/p/5398997.html
- vim less vi 不显示富文本 ESC
如图: 使用 less -r xxx.log 即可显示如下
- [leetcode]Decode Ways @ Python
原题地址:https://oj.leetcode.com/problems/decode-ways/ 题意: A message containing letters from A-Z is bein ...
- linux下安装python dlib依赖
dlib是主要用于机器学习的库,封装了机器学习算法,可以非常方便的实现比如人脸识别,车辆识别,物体检测以其他很多功能,dlib默认使用C++进行开发,另外图像识别有一部分支持python接口开发,上手 ...
- WIN10平板 传递优化文件能否删除
在给系统准备做Ghost备份之前,一般会运行一次磁盘清理,但是WIN10系统多了一个传递优化文件(现在看到的体积很小,但其实可能是4-5G) 这个文件只是WIN10改进了系统更新策略产生的,就像是BT ...
- linux网络设备—mdio总线
一.结构体 struct mii_bus { const char *name; //总线名 char id[MII_BUS_ID_SIZE]; //id void *priv; //私有数据 int ...
- 微软BI 之SSIS 系列 - 两种将 SQL Server 数据库数据输出成 XML 文件的方法
开篇介绍 在 SSIS 中并没有直接提供从数据源到 XML 的转换输出,Destination 的输出对象有 Excel File, Flat File, Database 等,但是并没有直接提供 X ...
- 内联汇编中的asm和__asm__
基本的内联汇编代码: asm格式: asm("assembly code"): 使用替换的关键字: 如果必须的话,可以改变用于标识内联汇编代码段的关键字asm.ANSI C规范 ...
- C# System.Collections.ArrayList
using System; using System.Collections; public class SamplesArrayList { public static void Main() { ...
- linux实现共享内存同步的四种方法
https://blog.csdn.net/sunxiaopengsun/article/details/79869115 本文主要对实现共享内存同步的四种方法进行了介绍. 共享内存是一种最为高效的进 ...