Как отобразить .obj в ARCore - PullRequest
       86

Как отобразить .obj в ARCore

0 голосов
/ 10 апреля 2020

Для школьного проекта я должен использовать ArCore для отображения .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);
}

Заранее благодарю за помощь.

Ответы [ 2 ]

0 голосов
/ 29 апреля 2020

Основной проблемой был размер файла. Я следовал некоторым инструкциям, данным здесь .

У меня были другие предупреждения и ошибки, которые я должен был устранить: я добавил библиотеку 'com.google.ar.sceneform:animation:1.15.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'

Я не знаю, почему они были востребованы, но добавление их заставило приложение работать ...

0 голосов
/ 23 апреля 2020

Я не публикую это как ответ, но я действительно хочу посмотреть, смогу ли я помочь, но у меня пока недостаточно репутации, чтобы добавлять комментарии. Я не знаю, какой у вас опыт работы с ARCore и загрузкой объектного файла. Я сам только взялся за Android кодирование две недели go и прыгнул прямо в глубокий конец написания приложения ARCore. Это была крутая кривая обучения, но очень захватывающая. Я выучил много. Итак, хотя у меня более 25 лет опыта кодирования, я новенький ie кодер Kotlin / Android / ARCore.

Из вашего вопроса я понимаю, что вы проверили свой код, используя загруженную модель, и ваш код работает нормально. Я также предполагаю, что обе модели находятся в одной папке и что для обеих моделей были созданы файлы sfa- и sfb, правильно?

Я вижу из файла журнала "sebastien.sfb (Нет такого файла или каталог). Это может означать, что файл .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, который напрямую ссылается на папку ресурсов (res \ raw), в которой находится файл sebastian.sfb.

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

Еще пара вопросов:

  1. Поскольку вы используете файл .obj, он обычно сопровождается файлом .mtl. Файл .obj ссылается на файл .mtl. Это можно увидеть при открытии файла .obj в текстовом редакторе. Возможно, вы переименовали файл .obj и .mtl, поскольку файл .obj по-прежнему будет ссылаться на старое имя файла .mtl. Вы также должны изменить ссылку на файл .mtl в файле .obj
  2. Вы уверены, что предоставленный файл .obj не поврежден. Если вы используете Windows 10, это легко проверить с помощью MicrosSoft 3D Builder, который относительно небольшой, простой в использовании и бесплатный. (https://www.microsoft.com/en-za/p/3d-builder/9wzdncrfj3t6?activetab=pivot: Overviewtab )

Кстати, хорошим источником бесплатных 3D-моделей является https://poly.google.com/

...