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',
}
我希望模型能够加载并显示其纹理,就像我在线下载的模型一样。 该模型实际上加载完全平滑,没有纹理。
答案 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",},
],
},
],