在一个学校的项目中,我必须使用ArCore来显示一个.obj,这个.obj是我为之做项目的一个客户给我的。一开始我试着用我在一个免费许可证网站上找到的一个随机的.obj来显示,效果还不错,但是每次我试着用客户的.obj来显示,它都告诉我不能加载,我真的不知道该怎么办。
下面是logcat中的错误。
2020-04-10 21:08:28.745 28542-29004/com.example.artest E/ModelRenderable: Unable to load Renderable registryId='sebastien.sfb'
java.util.concurrent.CompletionException: java.io.FileNotFoundException: sebastien.sfb (No such file or directory)
at com.google.ar.sceneform.utilities.SceneformBufferUtils.inputStreamToByteBuffer(SourceFile:48)
这里是我的代码。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
arFragment = (ArFragment) getSupportFragmentManager().findFragmentById(R.id.ux_fragment);
createScene();
}
private void createScene() {
mScene = arFragment.getArSceneView().getScene();
ModelRenderable.builder()
.setSource(this, Uri.parse("sebastien.sfb"))
.build()
.thenAccept(renderable -> onRenderableLoaded(renderable))
.exceptionally(throwable -> {
Log.i("Sceneform", "failed to load model");
return null;
});
}
void onRenderableLoaded(ModelRenderable model) {
Node modelNode = new Node();
modelNode.setRenderable(model);
modelNode.setParent(mScene);
modelNode.setLocalPosition(new Vector3(0, 0, 0));
mScene.addChild(modelNode);
}
先谢谢你的帮助。
我发这个帖子不是为了回答,而是我真的想看看能不能帮上忙,但还没有足够的信誉点来添加评论。我不知道你对ARCore和加载对象文件有多少经验。我自己两周前才开始学习Android编码,并直接跳入深渊写了一个ARCore应用。这是一个陡峭的学习曲线,但非常令人兴奋。我学到了很多东西。所以,即使我有25年以上的编码经验,我也是一个新手KotlinAndroidARCore编码者。
从你的问题中,我认为你已经用你下载的模型测试了你的代码,而且你的代码工作正常。我也假设两个模型在同一个文件夹位置,并且两个模型都创建了sfa-和sfb文件,对吗?
我确实从日志文件中看到 "sebastien.sfb (No such file or directory)"。这可能意味着没有创建.sfb文件,或者当您尝试导入该文件时,您引用了错误的文件夹。请检查以下内容。
在你的build.gradle(app)文件中 应该有定义对象文件为资产的代码,类似于下面的代码。当编译我们的代码时,这将为你构建.sfa和.sfb文件。此外,还值得删除sebastian.sfa &sebastian.sfb文件(如果它们已经存在的话),让它们重新创建。
sceneform.asset('sampledata/sebastien.obj',
// 'Source Asset Path' specified during
// import. This will typically be the
// app/sampledata folder since resources in
// this file is not compiled into your
// application
'default', // 'Material Path' specified during import.
'sampledata/sebastien.sfa', // '.sfa Output Path' specified during import.
'src/main/res/raw/sebastien') // '.sfb Output Path' specified during import.
典型的是,当我加载对象时,我使用如下代码。请注意,我没有使用Uri.parse,而是使用R.raw.sebastian,它直接引用sebastian.sfb文件所在的资源文件夹(resraw)。
val sebastianStage = ModelRenderable.builder().setSource(this, R.raw.sebastian).build()
还有几个问题。
另外,一个免费3D模型的良好来源是 https:/poly.google.com
主要问题是文件的大小。我遵循了一些指示 此处.
我有其他的警告和错误,我必须解决:我添加了一个库。'com.google.ar.sceneform:animation:1.15.0'
(但我不认为这个是必须的)我添加了一些库,比如.NET Framework 2.0、.NET Framework 3.0、.NET Framework 4.0、.NET Framework 5.0等。
'com.google.android.gms:play-services-plus:17.0.0'
'com.google.android.gms:play-services-base:17.2.1'
'com.google.android.gms:play-services-location:17.0.0'
我不知道为什么需要这些库,但加入这些库后,应用就能正常工作了......