Ресурсы Sceneform не показывают текстуры

снимок экрана с проблемой Я создаю очень простое приложение с помощью Sceneform, которое на данный момент имеет только одно действие с видом сцены, к которому я добавил рендеринг. Я хочу загрузить простую модель планеты, которую я создал в блендере и экспортировал как файл obj в качестве рендеринга. Однако объект загружается и отображается, но не имеет никакой текстуры или рельефного отображения, он просто серый. Мне нужно знать, что не так с моим кодом, из-за которого текстура не загружается. Я не получаю сообщений об ошибках при отладке приложения или об ошибках в logcat.

Когда я использую файл obj для камня, который я скачал в Интернете, он работает нормально, объект отображается с его текстурами. Однако когда я использую ту же процедуру для импорта и отображения модели, которую я создал в блендере и экспортировал как объект, я сталкиваюсь с проблемой. Я проверил наличие ошибок в файлах mtl, sfb и obj для своей модели, используя файлы для камня, которые, как мне известно, работают в качестве эталона, и, несмотря на то, что, казалось бы, не имеет никаких различий, кроме названных файлов и настроек материала, я все еще могу у меня нет текстуры для отображения на моей модели.

Я также добавил текстуру к визуализируемому объекту непосредственно в файле MainActivity.java, используя завершаемую будущую текстуру и метод .setTexture (). (Наконец, стоит отметить, что я попытался экспортировать как fbx вместо этого и имел ту же проблему)

MainActivity.java:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
CompletableFuture<Texture> merSurFuture = Texture.builder().setSource(this, R.drawable.mercury_global_map).build();
ModelRenderable.builder().setSource(this, Uri.parse("mercuryobj.sfb") )
        .build()
        .thenAcceptBoth(merSurFuture, (renderable, texture )  -> {
            mObjRenderable = renderable;
            mObjRenderable.getMaterial().setTexture("baseColor", texture);
            SceneView sceneView = findViewById(R.id.scene_view);
            sceneView.setBackgroundColor(Color.BLACK);
            Scene scene = sceneView.getScene();

            //adding a node to the sceneview
            Node node = new Node();
            node.setParent(scene);
            node.setName("sun");
            node.setRenderable(renderable);
            node.setLocalPosition(new Vector3(0f,-0.5f,-1f));
        })
        .exceptionally(throwable -> {
            Toast toast = Toast.makeText(this, "unable to load sun", Toast.LENGTH_LONG);
            toast.setGravity(Gravity.CENTER, 0, 0);
            toast.show();
            return null;

        });

mtl файл:

`# Blender MTL File: 'Mercury.blend'
 # Material Count: 1

 newmtl Material.001
 Ns 96.078431
 Ka 1.000000 1.000000 1.000000
 Kd 0.800000 0.800000 0.800000
Ks 0.000000 0.000000 0.000000
Ke 0.000000 0.000000 0.000000
Ni 1.000000
d 1.000000
illum 1
map_Bump -bm 0.000030 mercury_topo.png
map_Ks Mercury_global_map.png
map_Kd Mercury_global_map.png
map_Ka Mercury_global_map.png

`

obj соответствующие строки:

mtllib mercurymtl.mtl
o Mercury_Sphere
...
usemtl Material.001
s 1

sfb файл:

{
materials: [
{
  name: 'Material.001',
  parameters: [
    {
      baseColor: 'Mercury_global_map',
    },
    {
      baseColorTint: [
        0.80000000000000004,
        0.80000000000000004,
        0.80000000000000004,
        1,
      ],
    },
    {
      metallic: 0,
    },
    {
      roughness: 1,
    },
    {
      opacity: null,
    },
  ],
  source: 'build/sceneform_sdk/default_materials/obj_material.sfm',
},
],
model: {
attributes: [
  'Position',
  'Orientation',
],
collision: {},
file: 'sampledata/mercuryobj.obj',
name: 'mercuryobj',
recenter: 'root',
scale: 0.20496,
},
samplers: [
{
  file: 'sampledata\\Mercury_global_map.png',
  name: 'Mercury_global_map',
  params: {
    usage_type: 'Data',
  },
  pipeline_name: 'Mercury_global_map.png',
 },
],
version: '0.54:2',
}

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


person JacobGunn    schedule 11.07.2019    source источник
comment
@JaobGunn есть новости по этому поводу?   -  person Nouman Ch    schedule 19.09.2019
comment
ты решил это?   -  person Abhishek    schedule 25.09.2020
comment
Спасибо!!! Ваш пример мне очень помог   -  person DIRTY DAVE    schedule 17.03.2021


Ответы (3)


Делай это так:

samplers: [
   {
     file: 'sampledata/Tex_Beagle.png',
     name: 'Tex_Beagle',
     pipeline_name: 'Tex_Beagle.png',
     injections: [
      {usage: "BaseColor",},
    ],
   },
 ],

И примените Tex_Beagle в качестве baseColor в параметрах вашего материала :)

person BEN_BINARY    schedule 09.11.2020
comment
Если у вас возникнут проблемы, не стесняйтесь обращаться ко мне - person BEN_BINARY; 13.01.2021

Слишком поздно, но в документации говорится, что текстуры не могут быть автоматически импортированы в актив, в этом случае они должны быть определены в файле sfa.

Во вновь преобразованном файле sfa вы можете добавить текстуру (файл изображения) в массив samplers, а затем в блоке injections объявить его использование как Normal (добавление деталей в вашу сетку).

  samplers: [
   {
     file: 'sampledata\\Tex_Beagle.png',
     name: 'Tex_Beagle',
     pipeline_name: 'Tex_Beagle.png',
     injections: [
      {usage: "Normal",},
    ],
   },
 ],
person Oush    schedule 04.12.2019

Удалите "\" this "/" и ctrl + s и повторите попытку ...

Измените так:

samplers: [
   {
     file: 'sampledata/Tex_Beagle.png',
     name: 'Tex_Beagle',
     pipeline_name: 'Tex_Beagle.png',
     injections: [
      {usage: "Normal",},
    ],
   },
 ],
person Kishan Solanki    schedule 13.03.2020