JAVA3D загрузить файл .obj, экспортированный из блендера - PullRequest
0 голосов
/ 23 мая 2018

Я пытаюсь загрузить файл .obj из блендера в Java3D, но всегда возникает ошибка:

com.sun.j3d.utils.image.ImageException: javax.imageio.IIOException: Не удается получить вводпоток из URL!

Самое странное из всего этого - то, что когда я загружаю модель из Интернета, все в порядке, но когда я импортирую тот же файл в Blender, а затем экспортирую его (без каких-либо изменений), он не работает.

    import java.applet.*;
    import java.awt.*;

    import javax.media.j3d.*;
    import javax.vecmath.*;

    import com.sun.j3d.utils.applet.MainFrame;
    import com.sun.j3d.utils.universe.SimpleUniverse;
    import com.sun.j3d.utils.universe.PlatformGeometry;
    import com.sun.j3d.utils.behaviors.keyboard.*;

    import com.sun.j3d.loaders.Scene;

    import com.sun.j3d.loaders.objectfile.ObjectFile;

    import java.io.*;

    import java.awt.event.KeyListener;
    import java.awt.event.KeyEvent;

    public class Mykeynavbeh extends Applet implements KeyListener {

     private SimpleUniverse universe = null;
     private Canvas3D canvas = null;
     private TransformGroup viewtrans = null;

     private TransformGroup tg = null;
     private Transform3D t3d = null;
     private Transform3D t3dstep = new Transform3D();
     private Matrix4d matrix = new Matrix4d();

     public Mykeynavbeh() {
      setLayout(new BorderLayout());
      GraphicsConfiguration config = SimpleUniverse
        .getPreferredConfiguration();

      canvas = new Canvas3D(config);
      add("Center", canvas);
      universe = new SimpleUniverse(canvas);

      BranchGroup scene = createSceneGraph();
      universe.getViewingPlatform().setNominalViewingTransform();

      universe.getViewer().getView().setBackClipDistance(100.0);

      canvas.addKeyListener(this);

      universe.addBranchGraph(scene);
     }

     private BranchGroup createSceneGraph() {
      BranchGroup objRoot = new BranchGroup();

      BoundingSphere bounds = new BoundingSphere(new Point3d(), 10000.0);

      viewtrans = universe.getViewingPlatform().getViewPlatformTransform();

      KeyNavigatorBehavior keyNavBeh = new KeyNavigatorBehavior(viewtrans);
      keyNavBeh.setSchedulingBounds(bounds);
      PlatformGeometry platformGeom = new PlatformGeometry();
      platformGeom.addChild(keyNavBeh);
      universe.getViewingPlatform().setPlatformGeometry(platformGeom);

      objRoot.addChild(createLadybird());

      Background background = new Background();
      background.setColor(0.75f, 0.69f, 0.680f);
      background.setApplicationBounds(bounds);
      objRoot.addChild(background);

      return objRoot;
     }

     private BranchGroup createLadybird() {

      BranchGroup objRoot = new BranchGroup();
      tg = new TransformGroup();
      t3d = new Transform3D();

      tg.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);

      t3d.setTranslation(new Vector3d(-0.15, -0.3, -5.0));
      t3d.setRotation(new AxisAngle4f(0.0f, 0.0f, 0.0f, 0.0f));
      t3d.setScale(1.0);

      tg.setTransform(t3d);

      ObjectFile loader = new ObjectFile(ObjectFile.RESIZE);
      Scene s = null;

      File file = new java.io.File("model/female2.obj");

      try {
       s = loader.load(file.toURI().toURL());
      } catch (Exception e) {
       System.err.println(e);
       System.exit(1);
      }

      tg.addChild(s.getSceneGroup());

      objRoot.addChild(tg);
      objRoot.addChild(createLight());

      objRoot.compile();

      return objRoot;

     }

     private Light createLight() {
      DirectionalLight light = new DirectionalLight(true, new Color3f(1.0f,
        1.0f, 1.0f), new Vector3f(-0.3f, 0.2f, -1.0f));

      light.setInfluencingBounds(new BoundingSphere(new Point3d(), 10000.0));

      return light;
     }

     public static void main(String[] args) {
      Mykeynavbeh applet = new Mykeynavbeh();
      Frame frame = new MainFrame(applet, 800, 600);
     }

     public void keyTyped(KeyEvent e) {
      char key = e.getKeyChar();

      if (key == 'd') {
       t3dstep.set(new Vector3d(0.0, 0.0, -0.1));
       tg.getTransform(t3d);
       t3d.mul(t3dstep);
       tg.setTransform(t3d);
      }

      if (key == 's') {

       t3dstep.rotY(Math.PI / 32);
       tg.getTransform(t3d);
       t3d.get(matrix);
       t3d.setTranslation(new Vector3d(0.0, 0.0, 0.0));
       t3d.mul(t3dstep);
       t3d.setTranslation(new Vector3d(matrix.m03, matrix.m13, matrix.m23));
       tg.setTransform(t3d);

      }

      if (key == 'f') {

       t3dstep.rotY(-Math.PI / 32);
       tg.getTransform(t3d);
       t3d.get(matrix);
       t3d.setTranslation(new Vector3d(0.0, 0.0, 0.0));
       t3d.mul(t3dstep);
       t3d.setTranslation(new Vector3d(matrix.m03, matrix.m13, matrix.m23));
       tg.setTransform(t3d);

      }

      if (key == 'r') {

       t3dstep.rotX(Math.PI / 32);
       tg.getTransform(t3d);
       t3d.get(matrix);
       t3d.setTranslation(new Vector3d(0.0, 0.0, 0.0));
       t3d.mul(t3dstep);
       t3d.setTranslation(new Vector3d(matrix.m03, matrix.m13, matrix.m23));
       tg.setTransform(t3d);

      }

      if (key == 'v') {

       t3dstep.rotX(-Math.PI / 32);
       tg.getTransform(t3d);
       t3d.get(matrix);
       t3d.setTranslation(new Vector3d(0.0, 0.0, 0.0));
       t3d.mul(t3dstep);
       t3d.setTranslation(new Vector3d(matrix.m03, matrix.m13, matrix.m23));
       tg.setTransform(t3d);

      }

      if (key == 'e') {
       t3dstep.set(new Vector3d(0.0, 0.1, 0.0));
       tg.getTransform(t3d);
       t3d.mul(t3dstep);
       tg.setTransform(t3d);
      }

      if (key == 'c') {
       t3dstep.set(new Vector3d(0.0, -0.1, 0.0));
       tg.getTransform(t3d);
       t3d.mul(t3dstep);
       tg.setTransform(t3d);
      }
     }

     public void keyReleased(KeyEvent e) {
     }

     public void keyPressed(KeyEvent e) {
     }
    }

1 Ответ

0 голосов
/ 22 августа 2018

Пожалуйста, попробуйте выполнить следующие действия:

[1] Откройте файл .mtl и убедитесь, что все пути текстур относительно, как здесь:

map_Kd female02_1.jpg

Не так:

map_Kd C: \ Users \ Имя пользователя \ MyJava3D \ Female02 \ model \ female02_1.jpg (абсолютный путь)

На моих компьютерах, если пути текстуры не верны, этоошибка возникает в Java3D 1.5.1.В Java3D 1.6.0 ошибки не возникает, но текстуры не отображаются.

Вы говорите о female02.obj в Sweet Home 3D?(Я просто догадываюсь по имени файла "female2.obj.") Если это так, необходимы [2] и [3].

[2] Для нескольких текстур отметьте «Объекты как группы OBJ»и «Группы материалов» (в левом нижнем углу) перед экспортом модели.В противном случае текстуры не будут отображаться.

[3] Для файла .obj текстуры могут отображаться некорректно.Если это так, переверните все нормали снаружи.

Блендер 2.77:

Для каждой части (волосы, лицо, платье, ....)

1) В режиме объектащелкните правой кнопкой мыши деталь.

2) Нажмите клавишу Tab, чтобы войти в режим редактирования.

3) В окне 3D вида несколько раз нажмите Ctrl-n.

4) Нажмите клавишу Tab, чтобы войти в режим объектов.

5) Повторите шаги 1) - 4) выше.

[4] Также закомментируйте все строки, начинающиеся с 'o 'в экспортированном файле .obj.В противном случае возникает следующая ошибка: com.sun.j3d.loaders.ParsingErrorException: нераспознанный токен, строка ~

...