Применение динамической текстуры в трехмерной модели arcore - PullRequest
1 голос
/ 17 мая 2019

Я не могу применить текстуру к 3d-модели, которая конвертируется из плагина формы Google. я могу добавить текстуру только на модель "Энди", все пользовательские модели не принимают никакой текстуры.

Я пытался применить технику текстур, которую я нашел на github, вот ссылка, где я нашел https://github.com/google-ar/sceneform-android-sdk/issues/41

    CompletableFuture<Texture> futuretexture= Texture.builder().setSource(this, R.drawable.texture).build();
    ModelRenderable.builder()
            .setSource(this, R.raw.model)
            .build()
            .thenAcceptBoth(futuretexture, (renderable, texture) -> {
                andyRenderable = renderable;
                andyRenderable.getMaterial().setTexture(MaterialFactory.MATERIAL_TEXTURE, texture);
            })
            .exceptionally(
                    throwable -> {
                        Toast toast =
                                Toast.makeText(this, "Unable to load model_node renderable", Toast.LENGTH_LONG);
                        toast.setGravity(Gravity.CENTER, 0, 0);
                        toast.show();
                        return null;
                    });

я ожидал, что текстура, которую мы выбрали при нажатии кнопки, будет применена к проецируемой 3d модели в ядре Android

1 Ответ

0 голосов
/ 04 июня 2019

Не все модели имеют предопределенный сэмплер текстуры. Поэтому, если вы пытаетесь установить текстуру для модели, у которой нет какого-либо текстурного канала, вы должны сначала установить для нее собственный материал.

Когда вы конвертируете свою модель в sfb через Android Studio, вы можете указать пользовательский файл материала. Вот простой пример материала, где вы можете установить собственную текстуру:

material {
    name : "Textured material",
    parameters : [
        {
           type : sampler2d,
           name : texture
        }
    ],
    requires : [
        uv0
    ],
    shadingModel : lit,
    blending : opaque
}

fragment {
    void material(inout MaterialInputs material) {
        prepareMaterial(material);
        material.baseColor = texture(materialParams_texture, getUV0());
    }
}

Просто сохраните это как файл .mat, создайте sfb с этим материалом, и тогда ваш код сверху должен работать. Если вы хотите применить материал во время выполнения, это невозможно в данный момент без небольшого обходного пути. Просто создайте простую 3d модель (например, треугольник) и преобразуйте ее с этим материалом в sfb. Затем загрузите материал во время выполнения и скопируйте материал из него. Теперь, когда вы загружаете свою модель, которую хотите показать, вы можете просто переопределить исходный материал своим собственным.

...