我想请问一下Java3D中对于.obj模型文件的.mtl贴图文件怎么样同时装载.
也就是在装载.OBJ文件的同时导入其贴图文件.
网上找了很多资料,说是将.obj和.mtl放在同一目录下,默认的装载器会自动读取.mtl文件。问题是总算弄到装载器自动去读取.mtl文件这步上了,却报了下面这个异常:Exception in thread "main" java.lang.IllegalArgumentException: Empty region!
at javax.imageio.ImageReader.computeRegions(ImageReader.java:2689)
at com.sun.imageio.plugins.wbmp.WBMPImageReader.read(WBMPImageReader.java:184)
at javax.imageio.ImageIO.read(ImageIO.java:1422)
at javax.imageio.ImageIO.read(ImageIO.java:1282)
at com.sun.j3d.utils.image.TextureLoader$1.run(TextureLoader.java:304)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.j3d.utils.image.TextureLoader.<init>(TextureLoader.java:299)
at com.sun.j3d.loaders.objectfile.ObjectFileMaterials.readMapKd(ObjectFileMaterials.java:305)
at com.sun.j3d.loaders.objectfile.ObjectFileMaterials.readFile(ObjectFileMaterials.java:361)
at com.sun.j3d.loaders.objectfile.ObjectFileMaterials.readMaterialFile(ObjectFileMaterials.java:408)
at com.sun.j3d.loaders.objectfile.ObjectFile.loadMaterialFile(ObjectFile.java:525)
at com.sun.j3d.loaders.objectfile.ObjectFile.readFile(ObjectFile.java:589)
at com.sun.j3d.loaders.objectfile.ObjectFile.load(ObjectFile.java:1248)
at com.sun.j3d.loaders.objectfile.ObjectFile.load(ObjectFile.java:676)
at test.ObjLoader.createSceneGraph(ObjLoader.java:102)
at test.ObjLoader.<init>(ObjLoader.java:132)
at test.ObjLoader.main(ObjLoader.java:143)
有使用过Java3D模型装载的兄弟们能不能帮帮我呢?
也就是在装载.OBJ文件的同时导入其贴图文件.
网上找了很多资料,说是将.obj和.mtl放在同一目录下,默认的装载器会自动读取.mtl文件。问题是总算弄到装载器自动去读取.mtl文件这步上了,却报了下面这个异常:Exception in thread "main" java.lang.IllegalArgumentException: Empty region!
at javax.imageio.ImageReader.computeRegions(ImageReader.java:2689)
at com.sun.imageio.plugins.wbmp.WBMPImageReader.read(WBMPImageReader.java:184)
at javax.imageio.ImageIO.read(ImageIO.java:1422)
at javax.imageio.ImageIO.read(ImageIO.java:1282)
at com.sun.j3d.utils.image.TextureLoader$1.run(TextureLoader.java:304)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.j3d.utils.image.TextureLoader.<init>(TextureLoader.java:299)
at com.sun.j3d.loaders.objectfile.ObjectFileMaterials.readMapKd(ObjectFileMaterials.java:305)
at com.sun.j3d.loaders.objectfile.ObjectFileMaterials.readFile(ObjectFileMaterials.java:361)
at com.sun.j3d.loaders.objectfile.ObjectFileMaterials.readMaterialFile(ObjectFileMaterials.java:408)
at com.sun.j3d.loaders.objectfile.ObjectFile.loadMaterialFile(ObjectFile.java:525)
at com.sun.j3d.loaders.objectfile.ObjectFile.readFile(ObjectFile.java:589)
at com.sun.j3d.loaders.objectfile.ObjectFile.load(ObjectFile.java:1248)
at com.sun.j3d.loaders.objectfile.ObjectFile.load(ObjectFile.java:676)
at test.ObjLoader.createSceneGraph(ObjLoader.java:102)
at test.ObjLoader.<init>(ObjLoader.java:132)
at test.ObjLoader.main(ObjLoader.java:143)
有使用过Java3D模型装载的兄弟们能不能帮帮我呢?
我刚检查了一下,现在的模型有3类文件:
.obj,.mtl和.tga
.obj是模型本身
.mtl是模型的贴图描述文件
.tga是描述文件中引用的贴图图片上述异常好像是因为:
1.虽然3D模型装载的时候.obj和.mtl文件是需要放在同一目录下,但是该目录有限制,目前我发现该目录只能是项目的根目录,甚至都不能是子文件夹下.如果是子文件夹,那么装载器是找不到.mtl文件的.(也不能设置路径)
2.上述问题解决后,看那个异常:因为.tga文件的路径是默认在.mtl文件中定义,格式如下:newmtl Material_1
Ka 0.7 0.7 0.7
Kd 1 1 1
Ks 0 0 0
Ns 1
map_Kd mac_2.tga乍看好像只用把tga文件也放在.mtl文件同一目录下就可以了,但是虽然是这样放置的,还是会抛出上述异常.
于是,我修改了.mtl文件的内容,并将.tga文件放入了项目下的test目录下:newmtl Material_1
Ka 0.7 0.7 0.7
Kd 1 1 1
Ks 0 0 0
Ns 1
map_Kd test/mac_2.tga再次运行的时候上述异常正常的解决了,但是新的问题又来了,产生了如下异常:Exception in thread "main" com.sun.j3d.utils.image.ImageException: javax.imageio.IIOException: Can't read input file!
at com.sun.j3d.utils.image.TextureLoader$1.run(TextureLoader.java:306)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.j3d.utils.image.TextureLoader.<init>(TextureLoader.java:299)
at com.sun.j3d.loaders.objectfile.ObjectFileMaterials.readMapKd(ObjectFileMaterials.java:305)
at com.sun.j3d.loaders.objectfile.ObjectFileMaterials.readFile(ObjectFileMaterials.java:361)
at com.sun.j3d.loaders.objectfile.ObjectFileMaterials.readMaterialFile(ObjectFileMaterials.java:408)
at com.sun.j3d.loaders.objectfile.ObjectFile.loadMaterialFile(ObjectFile.java:525)
at com.sun.j3d.loaders.objectfile.ObjectFile.readFile(ObjectFile.java:589)
at com.sun.j3d.loaders.objectfile.ObjectFile.load(ObjectFile.java:1248)
at com.sun.j3d.loaders.objectfile.ObjectFile.load(ObjectFile.java:676)
at test.ObjLoader.createSceneGraph(ObjLoader.java:102)
at test.ObjLoader.<init>(ObjLoader.java:132)
at test.ObjLoader.main(ObjLoader.java:143)
Caused by: javax.imageio.IIOException: Can't read input file!
at javax.imageio.ImageIO.read(ImageIO.java:1275)
at com.sun.j3d.utils.image.TextureLoader$1.run(TextureLoader.java:304)
... 12 more不能读取输入文件,这是为什么呢?有经验的帮忙解决下....
并且把.mtl中的文件后缀由.tga改成了.sgi.
终于....终于....
不报错了.
但是画面一片空白~~~
我的.mtl描述中有5个贴图文件,并且有2幅大图.
于是我修改了.mtl文件中的内容,把贴图引用的.sgi文件改成了1幅并且该图片是一张小图.
终于...我又重新看到了画面中的模型.
并且现在,程序已经能正确的读取贴图文件,不抛出异常.然而我在窗口中法线了一些空白的区域,比对了一下和引用的贴图文件大小差不多,于是乎大胆假设,是不是引用的贴图文件存在问题,还是导出模型的时候贴图坐标转换发生了错误或者误差.导致了不能正常的贴图,后续的问题好像是3DMax和Maya相关的模型问题了,和Java程序的千丝万缕的联系已经到此结束了.
还是谢谢大家,上面也是我解决遇到的这个问题的整个过程.
好像关于这个问题现在暂时还没有资料,我也觉得整个过程挺恼人的,希望上面的文字对一些需要该类帮助的人们有所帮助.
稍后放上成功载入的贴图....HoHo~~