如何在ARCore中显示一个.obj?

问题描述 投票:0回答:2

在一个学校的项目中,我必须使用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);
}

先谢谢你的帮助。

android-studio augmented-reality arcore sceneform
2个回答
1
投票

我发这个帖子不是为了回答,而是我真的想看看能不能帮上忙,但还没有足够的信誉点来添加评论。我不知道你对ARCore和加载对象文件有多少经验。我自己两周前才开始学习Android编码,并直接跳入深渊写了一个ARCore应用。这是一个陡峭的学习曲线,但非常令人兴奋。我学到了很多东西。所以,即使我有25年以上的编码经验,我也是一个新手KotlinAndroidARCore编码者。

从你的问题中,我认为你已经用你下载的模型测试了你的代码,而且你的代码工作正常。我也假设两个模型在同一个文件夹位置,并且两个模型都创建了sfa-和sfb文件,对吗?

我确实从日志文件中看到 "sebastien.sfb (No such file or directory)"。这可能意味着没有创建.sfb文件,或者当您尝试导入该文件时,您引用了错误的文件夹。请检查以下内容。

  1. 在你的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.
    
  2. 典型的是,当我加载对象时,我使用如下代码。请注意,我没有使用Uri.parse,而是使用R.raw.sebastian,它直接引用sebastian.sfb文件所在的资源文件夹(resraw)。

    val sebastianStage = ModelRenderable.builder().setSource(this, R.raw.sebastian).build()
    

还有几个问题。

  1. 因为你使用的是一个.obj文件,它通常会伴随着一个.mtl文件。.obj文件会引用.mtl文件。这可以在文本编辑器中打开.obj文件时看到。您是否也许重命名了.obj和.mtl文件,因为.obj文件仍然会引用.mtl文件的旧文件名。您还必须更改.obj文件中对.mtl文件的引用。
  2. 你确定你得到的.obj文件没有损坏。如果你使用的是Windows 10,这很容易通过使用MicrosSoft 3D builder来检查,这是相对较小的容易使用和免费的。(https:/www.microsoft.comen-zap3d-builder9wzdncrfj3t6?activetab=pivot:overviewtab)

另外,一个免费3D模型的良好来源是 https:/poly.google.com


0
投票

主要问题是文件的大小。我遵循了一些指示 此处.

我有其他的警告和错误,我必须解决:我添加了一个库。'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'

我不知道为什么需要这些库,但加入这些库后,应用就能正常工作了......

© www.soinside.com 2019 - 2024. All rights reserved.