我是ARToolKit的新手,我一直在使用Android的SimpleNativeCars示例。我已经训练了一个新标记并将其放在assets文件夹中,并尝试将其与我自己的模型相关联,该模型位于我的模型文件夹中。我已经在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;
}
答案 0 :(得分:1)
我注意到Android项目会对标记(在应用程序级别)和资产下的其他项目进行一些缓存。缓存系统链接到Manifest上的versionNumber,因此增加它应解决它,如果这是问题。
这是我添加新标记时的问题,但我没有使用NDK,所以可能不是你的情况。
答案 1 :(得分:0)
确保使用新的.obj和.mtl文件通过将内部版本号增加1来更新手机缓存。
您可以通过进入aRSimpleNativeCars模块中的 build.gradle 文件并增加defaultConfig部分下的 versionCode 字段的数量来执行此操作。
您的jniLibs似乎没有根据您的更改进行更新,因为您的代码似乎正常运行。
您需要确保安装了ndk-bundle(Android Studio最新版本会在 C:\ Users \“您的用户”\ AppData \ Local \ Android \ sdk \ ndk-bundle>中为您安装文件夹)并将其添加到PATH环境变量中。
这将允许您在 aRSimpleNativeCars 模块内的 jni 文件夹中运行 ndk-build 命令,更新jniLibs。
SideNote:由于不支持在Android Studio中调试C ++代码,我经常使用日志来检查我的更改是否成功完成。
答案 2 :(得分:0)
我遇到了同样的问题,我所做的只是卸载应用或清除应用数据,然后再次运行应用。
还有这个plugin帮助我使用快捷方式/usr/local/rvm/rubies/ruby-2.3.1
(windows / linux)或Ctrl+Alt+Shift+A
(OSX)
还要确保Ctrl+Shift+A
命令成功运行。