マイペースなプログラミング日記

DTMやプログラミングにお熱なd-kamiがマイペースに書くブログ

JavaFX 3Dを試してみる

Java8にはJavaFX8が入ってるんですって奥さん。何がなんだかよくわからないJavaFXだがとりあえず3Dができるらしいことはわかった。まずは自家製戦車を描画してみる。下記モデル読み込みライブラリのリンクからDownloadの項目にある[download]リンクからダウンロードを行ったファイルに含まれているjimColModelImporterJFX.jarを取り出しプロジェクトやらクラスパスやらに追加しておく。また下記d-kami特製自家製戦車の中身(.daeや.jpg)をソースコードと同じフォルダに突っ込んで準備完了。一応スクリーンショットも載せておく。

自家製戦車: http://d-kami.net/download/tank.zip
モデル読み込みライブラリ: http://www.interactivemesh.org/models/jfx3dimporter.html

あとはソースコードを載せるのみ。パッケージは指定してないので、好きな名前を入れておいてください。ファイル名はとりあえずTank.java

import javafx.application.Application;

import javafx.scene.Node;
import javafx.scene.Group;
import javafx.scene.Scene;

import javafx.scene.PerspectiveCamera;
import javafx.scene.paint.PhongMaterial;
import javafx.scene.paint.Color;

import javafx.scene.transform.Rotate;
import javafx.scene.transform.Translate;
import javafx.stage.Stage;

import com.interactivemesh.jfx.importer.col.ColModelImporter;

public class Tank extends Application {

    @Override
    public void start(Stage stage) {
        Group tank = new Group();
        
        loadModel(tank, "tankbody.dae");
        loadModel(tank, "tankc.dae");
        
        tank.getTransforms().addAll(new Rotate(45, Rotate.Y_AXIS), new Translate(0, -50, 200));
        
        PerspectiveCamera camera = new PerspectiveCamera(true);
        camera.setFieldOfView(60.0);
        camera.getTransforms().addAll(new Translate(0, -200, -400));
        camera.setFarClip(1000);

        Scene scene = new Scene(tank, 800, 600, true);
        scene.setCamera(camera);

        stage.setScene(scene);
        stage.setTitle("Tank");

        stage.show();
    }
    
    private void loadModel(Group parent, String fileName){
        ColModelImporter importer = new ColModelImporter();
        importer.read(fileName);
        parent.getChildren().addAll(importer.getImport());
    }

    public static void main(final String... args) {
        launch(args);
    }

}

JavaFXで3Dやってる人向けだとすると説明するところはColModelImporterぐらいだと思うが、ファイルを読み込んでgetImportするとNodeの配列が返ってくるので、それをGroupに追加していけばよいらしい。私がまだわかってないのであまり説明できないが、Cameraの位置は変えられてもターゲット自体は変えられなさそう?lookupは別の目的で使うらしいし