Acerola3DのLG3D対応

Acerola3Dを LG3D(Project Looking Glass) で利用する話.

状況

lg3dでAcerola3Dが使えたら良いんじゃないかと思い,チャレンジしてみた.うごかせることは確認したけど, lg3d-coreに手を加えないといけないので,手軽さが×.

やりかた

lg3d-coreの修正

まず,lg3d-coreに手を加える.自分が試した環境はLinuxで lg3dのバージョンは lg3d--1-0-0-linux-i686-0612190933.tar.gz.それの lg3d-core.jarだけ自前の物で置き換えたら上手くいった.ソースは見当らなかったのでcvsでとってきてlg3d-core.jar だけ作って使用した.

org.jdesktop.lg3d.displayserver.net パッケージにはResourceURLStreamHandlerFactory.javaがあるので,以下のように変更.

$ diff ResourceURLStreamHandlerFactory.java.org ResourceURLStreamHandlerFactory.java
33c33,34
<         ResourceURLStreamHandler h = null;
---
>         //ResourceURLStreamHandler h = null;
>         URLStreamHandler h = null;
39a41,43
>         if (p.equalsIgnoreCase("x-rzip")) {
>             h = new RZipURLStreamHandler();
>         }

で,同じ場所にRZipURLStreamHandler.javaとRZipURLConnection.javaとという二つのファイルを追加する.

一応,この変更を加えて作ったlg3d-core.jarを置いておく.

linuxのver1.0のバイナリでだけ動作確認して上手くいってる.

lg3dのアプリの作成

一番簡単な例をあげる

import org.jdesktop.lg3d.wg.*;
import net.sf.elm_ve.a23.a3.*;
import javax.media.j3d.BranchGroup;
import javax.vecmath.Vector3f;
import java.net.URL;

public class A3 {
    Action3D action3D = null;
    public A3() {
        Frame3D frame = new Frame3D();
        Java3DGraph j3DGraph = createJava3DGraph();
        frame.addChild(j3DGraph);
        frame.setPreferredSize(new Vector3f(0.2f, 0.2f, 0.2f));
        frame.changeEnabled(true);
        frame.changeVisible(true);        
    }

    Java3DGraph createJava3DGraph() {
        Java3DGraph j3DGraph = new Java3DGraph();
        try {
            URL url = getClass().getClassLoader().getResource("axis.a3");
            action3D = Action3D.load(url);
            action3D.setScale(0.03);
            j3DGraph.addJ3dChild((BranchGroup)action3D.getNode());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return j3DGraph;
    }

    public static void main(String[] args) {
        A3 a3 = new A3();
    }
}

ソースの中の「axis.a3」がAcerola3Dファイル名.このファイルと「A3.class」と「A3.MF」と「A3.lgcfg」と適当なアイコン画像の「icon.gif」を用意する.以下A3.MFとA3.lgcfgの中身

A3.JF

Main-Class: A3
Config-File: A3.lgcfg
Class-Path: libs/acerola3d-all.jar

A3.lgcfg

<?xml version="1.0" encoding="UTF-8"?>
<java version="1.5.0" class="java.beans.XMLDecoder">
 <object class="org.jdesktop.lg3d.scenemanager.config.ApplicationDescription">
  <void property="exec">
   <string>java A3</string>
  </void>
  <void property="iconFilename">
   <string>icon.gif</string>
  </void>
  <void property="name">
   <string>A3</string>
  </void>
  <void property="classpathJars">
   <string>A3.jar</string>
  </void>
 </object>
</java>

で,最終的に以下のようにjarコマンドを使ってA3.jarファイルを作り, $LG3D_HOME/ext/app/の中にA3.jarファイルを移動し, $LG3D_HOME/ext/app/libs/の中にacerola3d-all.jarを置いておく.

$ jar cvfm A3.jar A3.MF A3.class A3.lgcfg axis.a3 icon.gif

以上でicon.gif画像がlg3dのデスクトップに現れるので,クリックして起動.

A3ViewerLG3D

普及させる気ならねたが必要だね.