忍者ブログ

軽Lab

 Javaを中心とした、プログラミング関係のナレッジベース

Home > JavaFX入門 > JavaFX 3Dモデルデータの取込

JavaFX 3Dモデルデータの取込

JavaFXにおいて3Dモデルデータを取り込む機能は用意されていないが、3Dモデルデータのインポートライブラリ『JavaFX™ 3D Model Importers』がInteractiveMesh.orgから公開されている。ライセンスはとても緩く設定されている(商用可能も可能。ただし、ライセンス表記などは必要)ため、利用可能な範囲も広いと思われる。

■ 取込可能な3Dモデルデータ

現時点(2015年10月12日)で、JavaFX™ 3D Model Importersにて取り込み可能なモデルデータは以下の通りである。

ファイル形式 拡張子 内容
Autodesk 3DS Max *.3ds CADソフトで有名なAutodeskで利用される拡張子
Collada *.dae
*.zae
ソニー・コンピュータエンタテインメントがPlayStation 3とPlayStation Portable向けの開発用公式フォーマットとして策定
JavaFX 3D FXML Models *.fxml JavaFXの3DオブジェクトをFXMLファイルにエクスポートしたもの
OBJファイル *.obj Advanced Visualizerというソフトの拡張子。数多くの3Dソフトが対応しているファイル形式
Standard Triangulated Language *.stl スリーディー・システムズの3Dソフトで利用される拡張子
X3D *.x3d *.x3dz ISOが定めたXMLベースの3次元コンピュータグラフィックスを表現するためのファイルフォーマット

■ EclipseにおけるJavaFX™ 3D Model Importersライブラリの設定方法

InteractiveMesh.orgの『[download]』からライブラリをダウンロードし、適当な場所にファイルを解凍する。今回はプロジェクトフォルダ直下に作成したlibフォルダ以下に展開した。ライセンスに関するファイルなどが同梱されているので、利用の前には目を通しておく必要がある。

Eclipseで利用するには、プロジェクトのメニューの「プロジェクト - プロパティ - Javaのビルドパス - ライブラリー」にて、「外部Jarの追加」にて解凍したライブラリファイル(*.jarファイル)をすべて指定して「OK」ボタンを押す。


■ OBJファイルを取り込むサンプル

3D Model Importersを利用してJavaFXにOBJファイルを取り込むサンプルコードを以下に示す。サンプルでは3つのOBJファイルを読み込み出力する。

◇サンプルコード
package application_fx_functional;

import java.io.File;

import com.interactivemesh.jfx.importer.ImportException;
import com.interactivemesh.jfx.importer.obj.ObjModelImporter;

import javafx.application.Application;
import javafx.geometry.Point3D;
import javafx.scene.Group;
import javafx.scene.LightBase;
import javafx.scene.Node;
import javafx.scene.PerspectiveCamera;
import javafx.scene.PointLight;
import javafx.scene.Scene;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

public class Test3DModelImport extends Application {

    public static void main(String[] args)
    {
        launch( args );
    }

    /**
     * 【シーングラフ構成】
     *  root
     *  ┣ Group(model1)
     *  ┃ ┣ メッシュ1
     *  ┃ ┣ …
     *  ┃ ┗ メッシュn
     *  ┣ Group(model2)
     *  ┃ ┣ メッシュ1
     *  ┃ ┣ …
     *  ┃ ┗ メッシュn
     *  ┗ Group(model3)
     *    ┣ メッシュ1
     *    ┣ …
     *    ┗ メッシュn
     */
    @Override
    public void start(Stage primaryStage) throws Exception
    {
        // シーングラフの構成
        Group   root        = new Group();
        
        // モデルデータの取り込み
        for( int i = 1 ; i <= 3 ; i++ )
        {
            // モデル取込
            String  fileName    =  "3dmodel/Perfume_Global_Site_Project_003/model" + i +".obj";
            String  url         = new File( fileName ).toURI().toString();
            Node    model       = createModelFromObj( url );
            
            // 3Dモデルを回転
            model.setRotationAxis( new Point3D( 0.0 , 1.0 , 0.0 ) );
            model.setRotate( 135.0 );
            root.getChildren().add( model );
            
        }
        
        // シーンの作成
        // 3Dシーンの奥行きを表現するため、Zバッファを有効にする
        Scene   scene       = new Scene( root , 1000 , 750 , true );
        scene.setFill( Color.BLACK );
        
        // カメラ設定
        PerspectiveCamera   camera  = new PerspectiveCamera( true );
        camera.setFarClip( 3000 );
        camera.setTranslateZ( -1500 );
        scene.setCamera( camera );
        
        // 光源設定
        LightBase   light       = new PointLight();
        light.setTranslateZ( -1500 );
        root.getChildren().add( light );
        
        // ウィンドウ表示
        primaryStage.setScene( scene );
        primaryStage.show();
        
    }
    
    /**
     * URL指定でOBJファイルからメッシュを作成する
     * @param url
     * @return
     */
    public Node createModelFromObj( String url )
    {
        // 戻り値の3Dモデルグループを作成
        Group   root   = new Group();
        
        // 3Dモデルのインポーターを作成
        ObjModelImporter    importer    = new ObjModelImporter();
        
        // インポータにモデル・ファイルを設定
        try{
            importer.read( url );
        }catch( ImportException e ){
            e.printStackTrace();
        }
        
        // 3Dモデルを取込
        Node[]  meshes  = importer.getImport();
        root.getChildren().addAll( meshes );
        
        // インポータを閉じる
        importer.close();
        
        return root;
    }
}
◇リソース
Perfume Grobal Siteにて配布していた3Dモデルファイル(model1~3.obj)を利用

◇フォルダ階層
 プロジェクト
 ┣ src
 ┃ ┗ Test3DModelImport.java
 ┣ 3dmodel
 ┃ ┗ Perfume_Global_Site_Project_003
 ┃   ┣ model1.obj
 ┃   ┣ model2.obj
 ┃   ┗ model3.obj
 ┗ lib
  ┗ JFX3DModelImporters_EA_2014-02-09
     ┗ jimObjModelImporterJFX.jar

◇実行結果


◇解説
  1. 3Dモデルの取り込みはcreateModelFromObj関数で行っている(90行目~113行目)。関数内ではOBJファイルを取り込むObjModelImporterクラスを作成し、getImport関数によってJavaFXで出力可能なNode型データの配列として読み込んでいる(106行目)
  2. 取り込んだデータはシーングラフに登録することにより、画面出力される(59行目)
  3. 3Dモデルを出力する際にはZバッファを有効にしておかないと、前後関係がおかしな画像が出力されるため注意が必要である(65行目)

なお、インポータは各ファイル形式で異なるクラスを利用している。OBJファイルの取込はObjModelImporterクラス、daeファイルの取込はColModelImporterクラス等、適切なクラスを選択する必要がある。

■ 参照

  1. InteractiveMesh.org -> ライブラリの配布元サイト
  2. Perfume Grobal Site -> 3Dモデルを配布しているサイト
Home > JavaFX入門 > JavaFX 3Dモデルデータの取込

- ランダム記事 -
- PR -

コメント

プロフィール

管理者:
 連絡はContactよりお願いします。

PR