如何将模型与Android的ARToolKit中的标记关联?

如何将模型与Android的ARToolKit中的标记关联?,android,artoolkit,Android,Artoolkit,我是ARToolKit的新手,我一直在使用Android的SimpleNativeCars示例。我已经训练了一个新的标记,并将其放在“资产”文件夹中,并尝试将其与“模型”文件夹中我自己的模型相关联。我已经在ARWrapperNativeCars.cpp文件中这样做了,就像其他模型和标记一样,但它无法识别它。我还尝试将两个示例模型更改为其相反的标记,但仍然没有任何效果。我已经搜索了这个网站和网络,但找不到这个问题的答案。谁能告诉我我错过了什么 下面是我试图解决这个问题的方法 谢谢 #define

我是ARToolKit的新手,我一直在使用Android的SimpleNativeCars示例。我已经训练了一个新的标记,并将其放在“资产”文件夹中,并尝试将其与“模型”文件夹中我自己的模型相关联。我已经在ARWrapperNativeCars.cpp文件中这样做了,就像其他模型和标记一样,但它无法识别它。我还尝试将两个示例模型更改为其相反的标记,但仍然没有任何效果。我已经搜索了这个网站和网络,但找不到这个问题的答案。谁能告诉我我错过了什么

下面是我试图解决这个问题的方法

谢谢

#define NUM_MODELS 3
static ARModel models[NUM_MODELS] = {2};

static float lightAmbient[4] = {0.1f, 0.1f, 0.1f, 1.0f};
static float lightDiffuse[4] = {1.0f, 1.0f, 1.0f, 1.0f};
static float lightPosition[4] = {0.0f, 0.0f, 1.0f, 0.0f};

JNIEXPORT void JNICALL JNIFUNCTION_DEMO(demoInitialise(JNIEnv* env, jobject object)) {

const char *model0file = "Data/models/Ferrari_Modena_Spider.obj";
const char *model1file = "Data/models/Porsche_911_GT3.obj";
const char *model2file = "Data/models/Keith.obj";

models[0].patternID = arwAddMarker("single;Data/patt.hiro;80");
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/patt.kanji;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;

models[2].patternID = arwAddMarker("single;Data/patt.job;80");
arwSetMarkerOptionBool(models[2].patternID, ARW_MARKER_OPTION_SQUARE_USE_CONT_POSE_ESTIMATION, false);
arwSetMarkerOptionBool(models[2].patternID, ARW_MARKER_OPTION_FILTERED, true);

models[2].obj = glmReadOBJ2(model2file, 0, 0); // context 0, don't read textures yet.
if (!models[2].obj) {
    LOGE("Error loading model from file '%s'.", model2file);
    exit(-1);
}
glmScale(models[2].obj, 0.035f);
//glmRotate(models[1].obj, 3.14159f / 2.0f, 1.0f, 0.0f, 0.0f);
glmCreateArrays(models[2].obj, GLM_SMOOTH | GLM_MATERIAL | GLM_TEXTURE);
models[2].visible = false;

}

我注意到Android项目对标记(在应用程序级别)和资产下的其他项目进行了一些缓存。缓存系统链接到清单上的versionNumber,因此增加它应该可以解决这个问题(如果这是问题的话)


添加新标记时,这是我的问题,但我没有使用NDK,因此这可能不是您的情况。

请确保通过将内部版本号增加1,使用新的.obj和.mtl文件更新手机缓存

您可以通过进入aRSimpleNativeCars模块中的build.gradle文件并增加defaultConfig部分下的versionCode字段的数量来完成此操作

您的JNIlib似乎没有随着您的更改而更新,因为您的代码似乎工作正常

您需要确保已安装ndk捆绑包(Android Studio最新版本在C:\Users\“your user”\AppData\Local\Android\sdk\ndk捆绑包文件夹中为您安装此捆绑包),并将其添加到PATH环境变量中

这将允许您在arImplementativeCars模块内的jni文件夹中运行ndk build命令,更新jniLibs


SeNeNoTo:由于在Android工作室中没有调试C++代码的支持,所以我经常使用日志来检查我的更改是否成功。p> 我遇到了同样的问题,我所做的就是卸载应用程序清除应用程序数据,然后再次运行应用程序

这也帮助我使用快捷方式
Ctrl+Alt+Shift+A
(windows/linux)或
Ctrl+Shift+A
(OSX)更快地完成


还要确保
ndk build
命令成功运行

我注意到当应用程序运行时,我的模型的.mtl文件与模型文件夹中的.obj文件一起找不到。它确实找到了我的标记文件,但在应用程序运行时没有加载。我尝试了你的解决方案,但似乎没有帮助。我知道清单中的版本号,但当我运行应用程序时,我可以在logcat中看到我的资产文件夹中的所有项目都被缓存。我遇到的问题是,一旦缓存了所有内容并加载了本机库,它似乎只加载了示例附带的前两个.patt文件。我将检查本机库,看看是否可以在那里找到解决方案。