JInternalFrame+Java3Dの怪

 ゲームを作ろうとしているわけだが、表示したいモノごとにフレーム(というかウィンドウ)をいくつも作るのはスマートではない。一つのフレーム内の複数のレイヤーで表現するのが適当だろう。
 おお!JDesktopPaneと、JInternalFrameという仕組みがあるのか!これはカッコイイ。あとはJInternalFrameにJava3Dを表示させられれば行けるね。
という訳で、JInternalFrameにJava3Dを組み込んでみた。Java3Dの教科書

Java3D教科書 (I・O BOOKS)

Java3D教科書 (I・O BOOKS)

から、キューブが回転するだけのクラスを持ってくる。

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package testdesktop;

import com.sun.j3d.utils.geometry.ColorCube;
import com.sun.j3d.utils.universe.*;
import java.awt.BorderLayout;
import java.awt.GraphicsConfiguration;
import javax.media.j3d.*;
import javax.swing.JFrame;
import javax.swing.JDesktopPane;
import javax.swing.JInternalFrame;
import javax.vecmath.*;

/**
 *
 * @author akabane
 */
public class TestDesktop extends JFrame{
  public static void main(String[] args){
    TestDesktop frame = new TestDesktop();

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setBounds(10, 10, 500, 400);
    frame.setTitle("タイトル");
    frame.setVisible(true);
  }

  TestDesktop(){
    JDesktopPane desktop = new JDesktopPane();

    JInternalFrame iframe1 = new JInternalFrame();
    iframe1.setSize(150, 100);
    iframe1.setLocation(10, 10);
    iframe1.setVisible(true);

    IFrame2 iframe2 = new IFrame2();
    //Java3D組み込みのためクラス化した。

    desktop.add(iframe1);
    desktop.add(iframe2);

    getContentPane().add(desktop, BorderLayout.CENTER);
  }
}


class IFrame2 extends JInternalFrame{
   public IFrame2()  {
       
        //getContentPane(). //←これをつけても結果は同じ
                setLayout(new BorderLayout());
        GraphicsConfiguration config
         = SimpleUniverse.getPreferredConfiguration();
        Canvas3D canvas = new Canvas3D(config);
        //getContentPane(). //←これをつけても結果は同じ
                add(canvas,BorderLayout.CENTER);
        SimpleUniverse universe 
         = new SimpleUniverse(canvas);
        universe.getViewingPlatform().setNominalViewingTransform();
        
        BranchGroup root = new BranchGroup();
        Color3f lightColor = new Color3f(1.0f, 1.0f, 1.0f);
        BoundingSphere bs = new BoundingSphere();
        Vector3f lightDirection 
         = new Vector3f(4.0f, 5.0f, -10.0f);
        DirectionalLight light 
         = new DirectionalLight(lightColor, lightDirection);
        light.setInfluencingBounds(bs);
        root.addChild(light);
        
        TransformGroup tg = new TransformGroup();
        ColorCube cube = new ColorCube(0.5f);
        tg.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
        Alpha alpha = new Alpha(-1,3000);//無限回数3秒1回転
        RotationInterpolator rip 
         = new RotationInterpolator(alpha, tg);
        rip.setSchedulingBounds(bs);
        tg.addChild(cube);
        tg.addChild(rip);
        root.addChild(tg);
        universe.addBranchGraph(root);
       
        setSize(350, 300);
        setLocation(30, 30);
        setVisible(true);
    }
}

↓結果

 ぎょわぁぁぁ!?
 一瞬だけレイヤーに表示されて、すぐにフレーム(というかウィンドウ)の外で回転を始めたぞ!?
 なんじゃこりゃぁぁぁぁぁ!?
 おまけに一つ目のレイヤーを選択すると、二つ目のレイヤーの(枠とかツールバーとかの)上にはなるが、Java3D表示部分の方が更に上になってしまってる。レイヤーの上下関係がおかしなことになってるぜ!!

 ”Java3Dはswingと相性が悪い”って聞いてた(冒頭の教科書で言ってました)けど、これ程とはっ・・・!
 それとも、swingと組み合わせるためにはそれなりの修正をしないといけないのか?そりゃ、以前さんざんこき下ろした教科書からソース持ってくる俺も節操がないが、一応swing対応のコードを持ってきたんだけどな・・・。


 だからさぁ、こういう「応用をしようとすると途端にうまく行かなくなる」の、どうにかしてくれないかなぁ。
 初心者の登山ガイドブックには、山の道筋だけじゃなく
・冷えるから防寒着必須
・水場が無いから水必須
・山の天気は変わり易いから麓での観天望気で中止も視野に
 とか書いてあるわけでしょ?
 でもプログラミングの教科書ときたら道筋どころか
「必要な装備品」
「坂道・岩場の歩き方」
「ヤマビコの時ヤッホーと言う時には両手を口に添える」
 とかそういう事しか書いてないんだよっ!これじゃ道に迷うのは当然だし、必ず(ではないが高確率で)遭難する。
 まあ、プログラミングで「道筋」ってのはもうソースのことだから、千差万別の目的のソースを全部本に書くわけにはいかない訳だけど、せめて「命にかかわる事項」「避けるべき事柄」について書いといてくれないかなぁ・・・。
 ”Java3Dはswingと相性が悪い”ってのもさ、それだけじゃ何がダメで何がいいのかサッパリ分からんだろ。


教科書にはそういう
「最低限やってはいけない事」とか、
「どうして相性が悪いのかの理由」とかを
書いとけ!


 そうすりゃ個々で判断・回避できるから、無駄な犠牲を払わなくて済むのに・・・(怒)。こういうのは上級者の知識じゃないんだよ。初心者にこそ必要ものなの。
 そりゃあさ、ツアーコンダクターに引率された団体客のように、本に書かれたソースを打ち込むだけの観光客なら何も知らなくていいけどさ、いざ自分だけで登ろうとしたら山(技術)の危険について何も知らない初心者は下らない理由で遭難死(バグ除去不能)するんだよ。そして死んだらもうプログラミングの世界には(わけが分からないから)戻ってこない。


 それともナニか?プログラミング技術者ってのは初心者の新規参入が面白くないのか?初心者が高い山の頂上に到達するのが気に入らないのか?初心者はその辺の中腹で野垂れ死にすればいいと思ってんのか?だから教科書には何も注意事項を書かないのか?「面白いですよ」「楽しいですよ」と美辞麗句を並べるだけ並べて、何の注意喚起もしないのは、「やってはいけない」本を出さないのは、”俺たちの経営するプログラミングの学校や通信講座に入らずに独習する初心者は山に入ったら遭難すればいい”と思ってるからだろう!