Sceneform资产没有纹理

时间:2019-07-11 15:43:25

标签: android-studio arcore sceneform

screenshot of issue 我正在使用Sceneform构建一个非常简单的应用程序,该应用程序目前只有一个带有SceneView的活动,并向其中添加了可渲染对象。 我想加载一个我在Blender上创建并导出为obj文件作为可渲染对象的行星的简单模型。 但是,对象会加载和显示,但根本没有纹理或凹凸贴图,只是灰色。我需要知道代码有什么问题,导致纹理无法加载。 调试应用程序或logcat时出现错误消息。

当我将obj文件用于在互联网上下载的岩石时,此方法工作正常,该对象及其纹理将显示出来。 但是,当我使用完全相同的过程来导入和显示在Blender上创建并导出为obj的模型时,遇到了问题。 我已经通过使用我知道工作的岩石文件作为参考来检查了模型的mtl,sfb和obj文件中的错误,尽管看起来似乎没有什么区别,除了调用的文件和材质设置,我仍然可以不会在模型上显示纹理。

我还通过使用可完成的将来纹理和.setTexture()方法在MainActivity.java文件中直接将纹理添加到了可渲染对象中。 (最后值得注意的是,我尝试将其导出为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',
}

我希望模型能够加载并显示其纹理,就像我在线下载的模型一样。 该模型实际上加载完全平滑,没有纹理。

3 个答案:

答案 0 :(得分:1)

这样做:

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

并将'Tex_Beagle'作为baseColor应用于材质的参数中:)

答案 1 :(得分:0)

为时已晚,但是documentation指出纹理可能不会自动导入到资源中,在这种情况下,应在sfa文件中对其进行定义。

在新转换的sfa文件中,可以将纹理(图像文件)添加到samplers数组中,然后在injections块中将其用法声明为 Normal < / strong>(向网格物体添加细节)

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

答案 2 :(得分:0)

删除“ \”此“ /”和ctrl + s,然后重试...

更改如下:

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