MQO モデルを描画

Metasequoia で作成した MQO ファイルを入力して3Dモデルを描画します。

前田稔の超初心者のプログラム入門

プログラムの作成

  1. ネットで Metasequoia で作成した MQO ファイルを描画するプログラムを見つけました。感謝 (●^o^●)
    実行するには MQOLoader.java が必要です。
    次のページからダウンロードして下さい。
    java3dでMetasequoiaのモデル(MQO)をロードする
    ダウンロードした MQOLoaderTest.java でも動くのですが、任意のフォルダーに格納されたモデルも描画できるように少し手を加えます。
  2. MQOLoader を使って描画するメインプログラムです。
    メモ帳などでタイプして View_Mqo.java の名前で保存して下さい。
    // Metasequoia のモデルを描画  JFrame を継承
    import java.awt.*;
    import javax.swing.*;
    import javax.media.j3d.*;
    import javax.vecmath.*;
    import com.sun.j3d.utils.universe.*;
    import com.sun.j3d.utils.geometry.*;
    import com.sun.j3d.loaders.*;
    import java.io.*;
    import com.sun.j3d.utils.behaviors.vp.*;
    
    public class View_Mqo extends JFrame
    {
        static String  Model_name= "C:\\DATA\\Model\\gradriel_pose.mqo";
    
        private Canvas3D mCanvas3D;
        private SimpleUniverse mUniverse;
        private BoundingSphere mBounds;
    
        // main Method
        public static void main(String[] args)
          throws FileNotFoundException, IncorrectFormatException, ParsingErrorException
        {   new View_Mqo();  }
    
        // Constructor
        public View_Mqo()
          throws FileNotFoundException, IncorrectFormatException, ParsingErrorException
        {
            // JFrame の初期化
            super("Metasequoia View");
            setSize(512,512);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            // Java3D 関係の設定
            this.mCanvas3D = new Canvas3D(SimpleUniverse.getPreferredConfiguration());
            this.mUniverse = new SimpleUniverse(this.mCanvas3D);
            this.mBounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 1000.0);
    
            this.initializeUniverse();
    
            this.setLayout(new BorderLayout());
            this.add(mCanvas3D, BorderLayout.CENTER);
            this.setPreferredSize(new Dimension(512, 512));
    
            setVisible(true);
        }
    
        // Universe の初期化
        private void initializeUniverse()
          throws FileNotFoundException, IncorrectFormatException, ParsingErrorException
        {   this.mUniverse.addBranchGraph(this.createSceneGraph());
            this.mUniverse.getViewingPlatform().setNominalViewingTransform();
            Transform3D tTransform3D = new Transform3D();
            this.mUniverse.getViewingPlatform().getViewPlatformTransform().getTransform(tTransform3D);
            System.out.println(tTransform3D);
            tTransform3D.setTranslation(new Vector3d(0d, 0d, 500d));
            System.out.println(tTransform3D);
            this.mUniverse.getViewingPlatform().getViewPlatformTransform().setTransform(tTransform3D);
            this.mUniverse.getViewingPlatform().setViewPlatformBehavior(this.createViewPlatformBehavior());
            this.mUniverse.getViewer().getView().setBackClipDistance(1000.0);
            this.mUniverse.getViewer().getView().setTransparencySortingPolicy(View.TRANSPARENCY_SORT_GEOMETRY);
            this.mUniverse.getViewer().getView().setDepthBufferFreezeTransparent(false);
        }
    
        // View の設定
        private ViewPlatformBehavior createViewPlatformBehavior()
        {   OrbitBehavior tOrbitBehavior = new OrbitBehavior(mCanvas3D, OrbitBehavior.REVERSE_ALL);
            tOrbitBehavior.setSchedulingBounds(mBounds);
            tOrbitBehavior.setZoomFactor(100d);
            tOrbitBehavior.setTransFactors(100d, 100d);
            return tOrbitBehavior;
        }
    
        // Scene の生成
        private BranchGroup createSceneGraph()
          throws FileNotFoundException, IncorrectFormatException, ParsingErrorException
        {   BranchGroup root = new BranchGroup();
    
            // Light の設定
            Light light = new DirectionalLight();
            light.setInfluencingBounds(mBounds);
            root.addChild(light);
            // 環境光
            AmbientLight alight = new AmbientLight();
            alight.setInfluencingBounds(mBounds);
            root.addChild(alight);
    
            Scene tLoad = new MQOLoader().load(Model_name);
            root.addChild(tLoad.getSceneGroup());
            return root;
        }
    }
    
  3. 次のソースコードがモデルデータ(MQO モデル)の定義です。
    static String Model_name= "C:\\DATA\\Model\\gradriel_pose.mqo";
    Metasequoia(MQO)のモデルは もとがし さんのページから取得しました。

MQOLoader.java の修正

  1. 任意のフォルダーに格納されているモデルを描画するには MQOLoader.java を少し修正する必要があります。
    java.io.*; をインポートして下さい。
    //★ 追加修正コード
    import java.io.*;
  2. Override されている load(String aFilename) を次のソースコードで置き換えて下さい。
    モデルの名前を String aFilename で受け取るメソッドに少し修正を加えます。
        @Override
        public Scene load(String aFilename)
            throws FileNotFoundException, IncorrectFormatException, ParsingErrorException
        {
            FileReader tFileReader = new FileReader(aFilename);
            try
            {   File    file = new File(aFilename);
                java.net.URI  uri = file.toURI();
                mBaseURL = uri.toURL();
                return load(tFileReader);
            }
            catch (IOException e)
            {   System.out.println("File Open Error" + aFilename);  }
            finally
            {   try
                {   tFileReader.close();  }
                catch (IOException e)
                {   System.out.println("File Open Error" + aFilename);  }
            }
            return load(tFileReader);
        }
        

プログラムの説明

  1. このプログラムは Metasequoia で作成した MQO ファイルを入力して3Dモデルを描画します。
    私のプログラムとはスタイルが違うのですが、元のソースを尊重して作成しました。
    基本的な説明は マウスで操作する を参照して下さい。
    Model_name, mCanvas3D, mUniverse, mBounds を大域領域で宣言して下さい。
        public class View_Mqo extends JFrame
        {
            static String  Model_name= "C:\\DATA\\Model\\gradriel_pose.mqo";
    
            private Canvas3D mCanvas3D;
            private SimpleUniverse mUniverse;
            private BoundingSphere mBounds;
        
  2. main() メソッドでは throws(スロウズ)を記述して下さい。
    throws の説明は 標準入力→標準出力(行単位) を参照して下さい。
        // main Method
        public static void main(String[] args)
          throws FileNotFoundException, IncorrectFormatException, ParsingErrorException
        {   new View_Mqo();  }
        
  3. Constructor では JFrame の初期化, Java3D 関係の設定に続いて initializeUniverse() で描画環境を設定します。
        // Constructor
        public View_Mqo()
          throws FileNotFoundException, IncorrectFormatException, ParsingErrorException
        {
            // JFrame の初期化
            super("Metasequoia View");
            setSize(512,512);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            // Java3D 関係の設定
            this.mCanvas3D = new Canvas3D(SimpleUniverse.getPreferredConfiguration());
            this.mUniverse = new SimpleUniverse(this.mCanvas3D);
            this.mBounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 1000.0);
    
            this.initializeUniverse();
    
            this.setLayout(new BorderLayout());
            this.add(mCanvas3D, BorderLayout.CENTER);
            this.setPreferredSize(new Dimension(512, 512));
    
            setVisible(true);
        }
        
  4. Universe の初期化をする initializeUniverse() メソッドです。
        // Universe の初期化
        private void initializeUniverse()
          throws FileNotFoundException, IncorrectFormatException, ParsingErrorException
        {   this.mUniverse.addBranchGraph(this.createSceneGraph());
            this.mUniverse.getViewingPlatform().setNominalViewingTransform();
            Transform3D tTransform3D = new Transform3D();
            this.mUniverse.getViewingPlatform().getViewPlatformTransform().getTransform(tTransform3D);
            System.out.println(tTransform3D);
            tTransform3D.setTranslation(new Vector3d(0d, 0d, 500d));
            System.out.println(tTransform3D);
            this.mUniverse.getViewingPlatform().getViewPlatformTransform().setTransform(tTransform3D);
            this.mUniverse.getViewingPlatform().setViewPlatformBehavior(this.createViewPlatformBehavior());
            this.mUniverse.getViewer().getView().setBackClipDistance(1000.0);
            this.mUniverse.getViewer().getView().setTransparencySortingPolicy(View.TRANSPARENCY_SORT_GEOMETRY);
            this.mUniverse.getViewer().getView().setDepthBufferFreezeTransparent(false);
        }
        
  5. View を設定する createViewPlatformBehavior() メソッドです。
    モデルの描画サイズを View の設定で調整しています。
        // View の設定
        private ViewPlatformBehavior createViewPlatformBehavior()
        {   OrbitBehavior tOrbitBehavior = new OrbitBehavior(mCanvas3D, OrbitBehavior.REVERSE_ALL);
            tOrbitBehavior.setSchedulingBounds(mBounds);
            tOrbitBehavior.setZoomFactor(100d);
            tOrbitBehavior.setTransFactors(100d, 100d);
            return tOrbitBehavior;
        }
        
  6. Scene を生成する createSceneGraph() メソッドです。
    new MQOLoader().load(Model_name); でモデルをロードします。
        // Scene の生成
        private BranchGroup createSceneGraph()
          throws FileNotFoundException, IncorrectFormatException, ParsingErrorException
        {   BranchGroup root = new BranchGroup();
    
            // Light の設定
            Light light = new DirectionalLight();
            light.setInfluencingBounds(mBounds);
            root.addChild(light);
            // 環境光
            AmbientLight alight = new AmbientLight();
            alight.setInfluencingBounds(mBounds);
            root.addChild(alight);
    
            Scene tLoad = new MQOLoader().load(Model_name);
            root.addChild(tLoad.getSceneGroup());
            return root;
        }
        

超初心者のプログラム入門(Java2)