LWS でシーンを再生

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

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

プログラムの作成

  1. メモ帳などでタイプして View_Lws.java の名前で保存して下さい。
    //★ Lightwave(LWS) でシーンを再生します    前田 稔
    import java.awt.*;
    import javax.swing.*;
    import javax.media.j3d.*;
    import javax.vecmath.*;
    import com.sun.j3d.loaders.lw3d.Lw3dLoader;
    import com.sun.j3d.loaders.Loader;
    import com.sun.j3d.loaders.Scene;
    import com.sun.j3d.utils.universe.SimpleUniverse;
    
    public class View_Lws extends JFrame
    {
        private String filename = "C:\\TMP\\j3d-examples\\src\\resources\\geometry\\ballcone.lws";
    
        // Main method
        public static void main(String args[])
        {   new View_Lws();  }
    
        // Constructor
        public View_Lws()
        {
            // JFrame の初期化
            super("View  Lightwave LWS");
            setSize(500,500);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            CreateScene();
    
            // Java3D 関係の設定
            GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
            Canvas3D canvas = new Canvas3D(config);
            add(canvas);
    
            // SimpleUniverseを生成
            SimpleUniverse universe = new SimpleUniverse(canvas);
            View theView = universe.getViewer().getView();
            theView.setBackClipDistance(50000f);
    
            // Scene を生成
            universe.addBranchGraph(CreateScene());
    
            setVisible(true);
        }
    
        // Scene の生成
        public BranchGroup CreateScene()
        {   BranchGroup sceneRoot = new BranchGroup();
    
            // Lw3d loader を生成して LWS をロード
            Loader lw3dLoader = new Lw3dLoader(Loader.LOAD_ALL);
            Scene loaderScene = null;
            try
            {   loaderScene = lw3dLoader.load(filename);  }
            catch(Exception e)
            {   e.printStackTrace();
                System.exit(1);
            }
    
            // シーン再生情報を設定
            if (loaderScene.getSceneGroup() != null)
            {   TransformGroup viewGroups[] = loaderScene.getViewGroups();
                Transform3D t = new Transform3D();
                viewGroups[0].getTransform(t);
                Matrix4d m = new Matrix4d();
                t.get(m);
                m.invert();
                t.set(m);
    
                TransformGroup sceneTransform = new TransformGroup(t);
                sceneTransform.addChild(loaderScene.getSceneGroup());
                sceneRoot.addChild(sceneTransform);
            }
    
            // 背景色の設定
            BoundingSphere bounds = new BoundingSphere(new Point3d(),100.0);
            Color3f bgColor = new Color3f(0.05f, 0.05f, 0.5f);
            Background bgNode = new Background(bgColor);
            bgNode.setApplicationBounds(bounds);
            sceneRoot.addChild(bgNode);
            return sceneRoot;
        }
    }
    
  2. j3d-examples-1_5_2-src.zip を解凍して C:\TMP に格納して下さい。
    詳細は Java3D のプログラムを動かす を参照して下さい。
    "C:\\TMP\\j3d-examples\\src\\resources\\geometry\\ballcone.lws" が入力する LWS ファイルですが、 この中から greenball.lwo と redcone.lwo を参照しています。
    ballcone.lws がシーンを定義したファイルで greenball.lwo と redcone.lwo が3Dモデルのファイルです。
    ボールの周りをコーンが動けば完成です。

プログラムの説明

  1. このプログラムは Java3D のサンプル(j3d-examples-1_5_2-src.zip)に格納されている LWS(LWO) を使っています。
    またサンプルの中の \examples\lightwave\ を参考に作成しました。
    LWS(LWO) をロードするので import 文に多少の違いはありますが「マウス操作で回転/移動」と同じ要領です。
    基本的な説明は マウス操作で「回転/移動」 を参照して下さい。
  2. モデルをロードしてシーンを生成する CreateScene() メソッドです。
    BranchGroup を生成して、ここに描画するシーンを設定します。
    new Lw3dLoader() でローダーを生成して lw3dLoader.load(filename); でロードします。
    LWS を解析して、シーンを再生する準備を整えます。
        // Scene の生成
        public BranchGroup CreateScene()
        {   BranchGroup sceneRoot = new BranchGroup();
    
            // Lw3d loader を生成して LWS をロード
            Loader lw3dLoader = new Lw3dLoader(Loader.LOAD_ALL);
            Scene loaderScene = null;
            try
            {   loaderScene = lw3dLoader.load(filename);  }
            catch(Exception e)
            {   e.printStackTrace();
                System.exit(1);
            }
    
            // シーン再生情報を設定
            if (loaderScene.getSceneGroup() != null)
            {   TransformGroup viewGroups[] = loaderScene.getViewGroups();
                Transform3D t = new Transform3D();
                viewGroups[0].getTransform(t);
                Matrix4d m = new Matrix4d();
                t.get(m);
                m.invert();
                t.set(m);
    
                TransformGroup sceneTransform = new TransformGroup(t);
                sceneTransform.addChild(loaderScene.getSceneGroup());
                sceneRoot.addChild(sceneTransform);
            }
    
            // 背景色の設定
            BoundingSphere bounds = new BoundingSphere(new Point3d(),100.0);
            Color3f bgColor = new Color3f(0.05f, 0.05f, 0.5f);
            Background bgNode = new Background(bgColor);
            bgNode.setApplicationBounds(bounds);
            sceneRoot.addChild(bgNode);
            return sceneRoot;
        }
        
  3. ポリゴンには色が設定されていて、カラーで描画されるのですが、残念ながら Lightwave の古いバージョンで作成したものしか使えないようです。
    私も幾つかのモデルをダウンロードして試しましたが、いずれも駄目で使えるのはサンプルに添付されているものだけでした。 (;_;)
    そこで思い出したのが「ネットやろうぜの LightWave 4.0 のディスク」です。 (^◇^;)
    この中に沢山の LWS(LWO)が格納されていて、約半分ぐらいは動くことを確認しました。 (●^o^●)
  4. 読者諸氏は「LightWave 4.0 のディスク」などはお持ちで無いのでお困りでしょう。
    そこでこのシステムの活用方法を考えてみました。
    LWS のファイルは TEXT 形式で書かれていて、エディッタなどでその内容を作成(修正)することができます。
    本格的なシーンの作成は無理にしても、単に LWO モデルを表示するだけなら難しくは無いはずです。
    おまけにモデルやカメラの向きや座標も LWS で設定できるので、使いようによっては OBJ より便利かも知れません。
    と言う訳で LWS の古い形式を調べることにしました。

LWS を作成してモデルを描画

  1. 手始めに greenball.lwo と redcone.lwo を描画する LWS を作成してみました。
    LWO と同じフォルダーに格納して下さい。
    greenball.lwo を描画する LWS です。
    LWSC
    1
    
    FirstFrame 1
    LastFrame 1
    FrameStep 1
    FramesPerSecond 30.000000
    
    LoadObject greenball.lwo
    ShowObject 8 7
    ObjectMotion (unnamed)
      9
      1
      40 0 0 0 0 0 1 1 1
      0 0 0 0 0
    EndBehavior 1
    ShadowOptions 7
    
    AmbientColor 255 255 255
    AmbIntensity 0.250000
    
    AddLight
    LightName Light
    ShowLight 0 7
    LightMotion (unnamed)
      9
      1
      0 0 0 60 30 0 1 1 1
      0 0 0 0 0
    EndBehavior 1
    LightColor 255 255 255
    LgtIntensity 1.000000
    LightType 0
    ShadowCasting 1
    
    ShowCamera 1 7
    CameraMotion (unnamed)
      9
      1
      0 0 -120.0 0 0 0 1 1 1
      0 0 0 0 0
    EndBehavior 1
    ZoomFactor 3.200000
    RenderMode 2
    RayTraceEffects 0
    Resolution 1
    PixelAspectRatio 0
    SegmentMemory 2200000
    Antialiasing 0
    AdaptiveSampling 0
    FilmSize 2
    FieldRendering 0
    MotionBlur 0
    DepthOfField 0
    
    SolidBackdrop 1
    BackdropColor 0 0 0
    ZenithColor 0 40 80
    SkyColor 120 180 240
    GroundColor 50 40 30
    NadirColor 100 80 60
    FogType 0
    DitherIntensity 1
    AnimatedDither 0
    
    DataOverlayLabel 
    
    ViewMode 5
    ViewAimpoint 0.000000 0.000000 0.000000
    ViewDirection 0.000000 -0.174533 0.000000
    ViewZoomFactor 3.200000
    LayoutGrid 8
    GridSize 2.000000
    ShowMotionPath 1
    ShowSafeAreas 0
    ShowBGImage 0
    ShowFogRadius 0
    ShowRedraw 0
    
  2. redcone.lwo を描画する LWS です。
    LWSC
    1
    
    FirstFrame 1
    LastFrame 1
    FrameStep 1
    FramesPerSecond 30.000000
    
    LoadObject redcone.lwo
    ShowObject 8 7
    ObjectMotion (unnamed)
      9
      1
      40 -50 0 0 0 0 1 1 1
      0 0 0 0 0
    EndBehavior 1
    ShadowOptions 7
    
    AmbientColor 255 255 255
    AmbIntensity 0.250000
    
    AddLight
    LightName Light
    ShowLight 0 7
    LightMotion (unnamed)
      9
      1
      0 0 0 60 30 0 1 1 1
      0 0 0 0 0
    EndBehavior 1
    LightColor 255 255 255
    LgtIntensity 1.000000
    LightType 0
    ShadowCasting 1
    
    ShowCamera 1 7
    CameraMotion (unnamed)
      9
      1
      0 0 -120.0 0 0 0 1 1 1
      0 0 0 0 0
    EndBehavior 1
    ZoomFactor 3.200000
    RenderMode 2
    RayTraceEffects 0
    Resolution 1
    PixelAspectRatio 0
    SegmentMemory 2200000
    Antialiasing 0
    AdaptiveSampling 0
    FilmSize 2
    FieldRendering 0
    MotionBlur 0
    DepthOfField 0
    
    SolidBackdrop 1
    BackdropColor 0 0 0
    ZenithColor 0 40 80
    SkyColor 120 180 240
    GroundColor 50 40 30
    NadirColor 100 80 60
    FogType 0
    DitherIntensity 1
    AnimatedDither 0
    
    DataOverlayLabel 
    
    ViewMode 5
    ViewAimpoint 0.000000 0.000000 0.000000
    ViewDirection 0.000000 -0.174533 0.000000
    ViewZoomFactor 3.200000
    LayoutGrid 8
    GridSize 2.000000
    ShowMotionPath 1
    ShowSafeAreas 0
    ShowBGImage 0
    ShowFogRadius 0
    ShowRedraw 0
    
  3. ここまでは順調に運んだのですが、また新たな問題が発生しました。 (;_;)
    それは新しいバージョンでは LWO の形式も変わっているらしく、幾つかのサイトからダウンロードしたモデルはエラーになりました。
    正常に描画できる LWO(古い形式 (^_^;) ) がダウンロードできるサイトです。
    LWO のダウンロード
    ただし、LWS は Text Editor を使って自分で作成しなければなりません。

【NOTE】

  1. 古い形式の LWS, LWO を使えば一応動くのですが「Java 3D にはこんな機能も備わっています」と言うデモンストレーションのようで、 モデルはカラーで描画されるのですが、テクスチャ機能は働いていないようです。
    一昔前の古い形式はネットでも見かけなくなり、本格的に Lightwave のモデルを描画するには、各自でプログラムしなければならないようです。 (;_;)
    腕に自信のある方は挑戦してみて下さい。 (^_^;)
    またもっと良い方法や新しい情報があればメールして下さい。

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