【问题标题】:.obj/.gltf 3D model won't show in ARCore.obj/.gltf 3D 模型不会在 ARCore 中显示
【发布时间】:2021-12-18 08:46:36
【问题描述】:

我按照在线教程创建了一个可以在 AR 中显示我的 3D 模型的 AR 应用程序。

我将 .obj 和 .gltf 3d 模型文件放在我的资产文件夹中,

当我点击一个平面时,placeObject() 方法应该运行并将我的模型(selectObject)放在这个地方。

但是当我在手机上测试它时,在检测到飞机并点击屏幕后,什么也没发生,我检查了我的 logcat,它在我点击时显示错误:

2021-11-04 01:55:46.629 11172-12363/com.example.arcoretest E/ModelRenderable: Unable to load Renderable registryId='testscene.obj'
    java.util.concurrent.CompletionException: java.lang.AssertionError: No RCB file at uri: testscene.obj
        at java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:278)
        at java.util.concurrent.CompletableFuture.completeThrowable(CompletableFuture.java:284)
        at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1629)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:920)
     Caused by: java.lang.AssertionError: No RCB file at uri: testscene.obj
        at com.google.ar.sceneform.rendering.LoadRenderableFromSfbTask.byteBufferToSfb(LoadRenderableFromSfbTask.java:191)
        at com.google.ar.sceneform.rendering.LoadRenderableFromSfbTask.lambda$downloadAndProcessRenderable$0$com-google-ar-sceneform-rendering-LoadRenderableFromSfbTask(LoadRenderableFromSfbTask.java:121)

我不确定问题出在哪里,是我的 uri 错误还是我应该使用其他 3d 模型格式? (我试过 .obj/.fbx/.gltf 但它们都不起作用) (我不能使用 .sfb 或 .sfa ,我不能再使用 sceneform 插件将文件转换为 sfa/sfb,因为它已被弃用)

这是我的成绩依赖项:

{

实现 'com.google.ar.sceneform.ux:sceneform-ux:1.15.0'

实现'com.google.ar:core:1.15.0'

实现 'com.google.ar.sceneform:assets:1.15.0' ... }

我的 mainActivity.java:

package com.example.arcoretest;

import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;

import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;

import com.google.ar.core.Anchor;
import com.google.ar.core.HitResult;
import com.google.ar.core.Plane;
import com.google.ar.sceneform.AnchorNode;
import com.google.ar.sceneform.rendering.ModelRenderable;
import com.google.ar.sceneform.rendering.Renderable;
import com.google.ar.sceneform.ux.ArFragment;
import com.google.ar.sceneform.ux.TransformableNode;

public class MainActivity extends AppCompatActivity {
    private ArFragment fragment;
    private Uri selectObject;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        selectObject = Uri.parse("testscene.obj");

        fragment = (ArFragment) getSupportFragmentManager().findFragmentById(R.id.sceneFormFragment);

        //when tapped on a plane, code below will run
        fragment.setOnTapArPlaneListener(
                (HitResult hitResult, Plane plane, MotionEvent motionEvent)->{
                    Anchor anchor = hitResult.createAnchor();
                    placeObject(fragment,anchor,selectObject);
                }
        );
    }

    //this method put 3d model in scene
    private void placeObject(ArFragment fragment, Anchor anchor,Uri model){
        ModelRenderable.builder()
                .setSource(fragment.getContext(),model)
                .build()
                .thenAccept( renderable -> addNodeToScene(fragment,anchor,renderable))
                .exceptionally((throwable -> {
                    AlertDialog.Builder builder = new AlertDialog.Builder(this);
                    builder.setMessage(throwable.getMessage())
                            .setTitle("Error!");
                    AlertDialog dialog = builder.create();
                    dialog.show();
                    return null;
        }));
    }
    private void addNodeToScene(ArFragment fragment, Anchor anchor, Renderable renderable){
        AnchorNode anchorNode = new AnchorNode(anchor);
        TransformableNode node = new TransformableNode(fragment.getTransformationSystem());
        node.setRenderable(renderable);
        node.setParent(anchorNode);
        fragment.getArSceneView().getScene().addChild(anchorNode);
        node.select();
    }

} 

然后我将 3d 模型文件放在 assets 文件夹中,如下所示:

【问题讨论】:

    标签: java android-studio augmented-reality arcore sceneform


    【解决方案1】:

    我建议更新到最新版本的SceneForm。这是一个社区维护的版本,具有 ArCore、Filament 和 Android 的最新依赖项。对于您的用例,3d-model-viewer 示例可能很有趣。

    【讨论】:

    • 谢谢!看来我必须赞助他们使用它,这是可以理解的。有没有关于这个版本的详细教程?我想做的只是在 AR 中展示我的简单 3d 模型并旋转它
    • 我发布的内容可以免费使用。赞助只是为了帮助开发团队进一步改进这个库,但你不必这样做。
    • 酷!有没有关于这个版本的详细教程?我想做的只是在 AR 中展示我的简单 3d 模型并让用户旋转它
    • 只是Medium的入门。
    • 谢谢!我一定会调查的
    猜你喜欢
    • 2020-07-23
    • 2021-03-10
    • 2019-05-11
    • 1970-01-01
    • 2021-04-21
    • 2022-08-10
    • 2019-10-11
    • 2022-04-28
    • 2021-04-06
    相关资源
    最近更新 更多