LWS でシーンを再生

Java Applet で LIGHTWAVE で作成した LWS シーンファイルを再生します。

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

プログラムの作成

  1. メモ帳などでタイプして applet_lws の名前で保存して下さい。
    //★ Lightwave(LWS) でシーンを再生します    前田 稔
    import java.applet.Applet;
    import java.awt.*;
    import javax.media.j3d.BranchGroup;
    import javax.media.j3d.Canvas3D;
    import javax.media.j3d.Transform3D;
    import javax.media.j3d.TransformGroup;
    import javax.media.j3d.View;
    import javax.vecmath.Matrix4d;
    import com.sun.j3d.loaders.lw3d.Lw3dLoader;
    import com.sun.j3d.loaders.Loader;
    import com.sun.j3d.loaders.Scene;
    import com.sun.j3d.utils.applet.MainFrame;
    import com.sun.j3d.utils.universe.SimpleUniverse;
    
    public class applet_lws extends Applet
    {
        private SimpleUniverse universe;
    
        // Applet 初期化
        public void init()
        {   setLayout(new BorderLayout());
    
            // Java3D 関係の設定
            GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
            Canvas3D canvas = new Canvas3D(config);
            add("Center", canvas);
    
            // SimpleUniverseを生成
            universe = new SimpleUniverse(canvas);
            View theView = universe.getViewer().getView();
            theView.setBackClipDistance(50000f);
    
            // Scene を生成
            universe.addBranchGraph(createSceneGraph(getCodeBase().toString(),"ballcone.lws"));
        }
    
        // Scene の生成
        public BranchGroup createSceneGraph(String url, String file)
        {   BranchGroup sceneRoot = new BranchGroup();
    
            // Construct the Lw3d loader and load the file
            Loader lw3dLoader = new Lw3dLoader(Loader.LOAD_ALL);
            Scene loaderScene = null;
            try
            {   java.net.URL u = new java.net.URL(url+file);
                loaderScene = lw3dLoader.load(u);
            }
            catch(Exception e)
            {   e.printStackTrace();
                System.exit(1);
            }
    
            // Now add the scene graph defined in the lw3d file
            if (loaderScene.getSceneGroup() != null)
            {   TransformGroup viewGroups[] = loaderScene.getViewGroups();
                // Get the Transform3D from the view and invert it
                Transform3D t = new Transform3D();
                viewGroups[0].getTransform(t);
                Matrix4d m = new Matrix4d();
                t.get(m);
                m.invert();
                t.set(m);
    
                // Now we've got the transform we want.
                TransformGroup sceneTransform = new TransformGroup(t);
                sceneTransform.addChild(loaderScene.getSceneGroup());
                sceneRoot.addChild(sceneTransform);
            }
            return sceneRoot;
        }
    
        public void destroy()
        {   universe.cleanup();  }
    }
    
  2. プロジェクトのフォルダーに次のファイルを格納して下さい。
    Applet ではローカルディスクにアクセス出来ないので、起動した URL からリソースを取得します。
    プログラムで使用した Lightwave のファイルは j3d-examples-1_5_2-src.zip(Java3D のセットアップ)の中に格納されています。
    ファイル名 説明
    ballcone.lws シーンの定義ファイル
    greenball.lwo lws で使用する緑の球のモデル
    redcone.lwo lws で使用する赤のコーンのモデル
  3. ソースプログラムをコンパイルして下さい。
    main() メソッドが定義されていないので警告が出ますが、無視して下さい。
    ウインドウサイズを 500*500 ぐらいに設定して、Java Applet を起動する HTMLファイルを作成して下さい。
    アプレットの実行は HTMLファイルをダブルクリックして起動します。
    アプレットを実行しようとするとセキュリティの警告画面が表示されますが、解除して下さい。
    ボールの周りをコーンが動けば完成です。

プログラムの説明

  1. このプログラムは j3d-examples-1_5_2-src.zip(Java3D のセットアップ) に格納されている LWS(LWO) を使っています。
    またサンプルプログラムの中の \examples\lightwave\ を参考に作成しました。
    LWS(LWO) をロードするので import 文に多少の違いはありますが「マウス操作で回転/移動」と同じ要領です。
  2. 起動した URL からリソースを取得するために createSceneGraph() にパラメータを設定します。
    getCodeBase() が URL で "ballcone.lws" がシーンファイルの名前です。
        // Applet 初期化
        public void init()
        {   setLayout(new BorderLayout());
                ・・・
            // Scene を生成
            universe.addBranchGraph(createSceneGraph(getCodeBase().toString(),"ballcone.lws"));
        }
        
  3. モデルをロードしてシーンを生成する createSceneGraph() メソッドです。
    BranchGroup を生成して、ここに描画するシーンを設定します。
    new Lw3dLoader(Loader.LOAD_ALL) でローダーを生成します。
    java.net.URL(url+file) で URL を取得して lw3dLoader.load(u) でロードします。
    LWS を解析して、シーンを再生する準備を整えます。
        // Scene の生成
        public BranchGroup createSceneGraph(String url, String file)
        {   BranchGroup sceneRoot = new BranchGroup();
    
            // Construct the Lw3d loader and load the file
            Loader lw3dLoader = new Lw3dLoader(Loader.LOAD_ALL);
            Scene loaderScene = null;
            try
            {   java.net.URL u = new java.net.URL(url+file);
                loaderScene = lw3dLoader.load(u);
            }
            catch(Exception e)
            {   e.printStackTrace();
                System.exit(1);
            }
    
            // Now add the scene graph defined in the lw3d file
            if (loaderScene.getSceneGroup() != null)
            {   TransformGroup viewGroups[] = loaderScene.getViewGroups();
                // Get the Transform3D from the view and invert it
                Transform3D t = new Transform3D();
                viewGroups[0].getTransform(t);
                Matrix4d m = new Matrix4d();
                t.get(m);
                m.invert();
                t.set(m);
    
                // Now we've got the transform we want.
                TransformGroup sceneTransform = new TransformGroup(t);
                sceneTransform.addChild(loaderScene.getSceneGroup());
                sceneRoot.addChild(sceneTransform);
            }
            return sceneRoot;
        }
    
        public void destroy()
        {   universe.cleanup();  }
        
  4. 「Java 3D にはこんな機能も備わっています」と言うデモンストレーションらしく、 Lightwave の古いバージョンで作成した LWS(LWO) しか使えないようです。
    私も幾つかのモデルをダウンロードして試しましたが、いずれも駄目で使えるのはサンプルに添付されているものだけでした。 (;_;)
    正常に描画できる LWO(古い形式 (^_^;) ) がダウンロード出来るサイトです。
    LWO のダウンロード
    ただし、LWS は Text Editor を使って自分で作成しなければなりません。
  5. Java3D のプログラムは「超初心者Jのava入門」から LWS でシーンを再生 を参照して下さい。

Java Game Program