3D

【JavaFX】3Dで地形を作ろう!!

完成図

完成図はこのようになります。

考え方

このような地形を作る上での考え方を簡単にまとめてみます。

まず、タイトルの通りJavaFXのクラスを使用するのですが、使用するクラスは「TriangleMesh」クラスと「MeshView」クラスの2つとなります。

このクラスは、たくさんの頂点を結んで複雑なモデルを作成する際に用いられます。

例えば球体や直方体などの単純なモデルは、「Sphere」クラスや「Box」クラスを使いますが、今回作成するような地形モデルではそうはいきませんので、「MeshView」クラスを用いることになります。

また、地形のデータは今回はCSVファイルで用意しました。

このCSVファイルには高さのみが羅列されています。

X座標(列)・Z座標(行)にY座標(高さ)を指定することで3次元座標を組み合わせています。

 

CSVファイルの読み込み

基本となる雛形

まずは基本となるプログラムを作成していきます。(ライトやカメラの設定など)

(Main.java)

 

CSVファイルの読み込み

ではそのCSVファイルを実際に読み込んでいきましょう。

今回読み込む地形データはこちらになります。

[wpdm_package id=’1979′]

少し面倒くさいですが、難しいプログラムやトリッキーなプログラムは無いので、しっかりプログラムを理解してみましょう。

(Main.java)

 

CSVファイルには色々な書き方があると思いますが、今回はNumbersというMacに搭載されているアプリで生成したもので、一番ベターな書き方だと思います。

実際にCSVファイルを見てみればわかると思います。

 

地形モデルの作成

それでは実際に地形モデルを作成していきましょう。

やり方を簡単にまとめるとこうなります。

「TriangleMesh」クラスに「頂点座標」・「テクスチャ座標」・「フェイス情報」を登録する。

「MeshView」に「TriangleMesh」で登録した情報をあげる。

できあがった「MeshView」を描画する。

 

で、ここで大事なのが「TriangleMesh」に登録する3つの情報になります。

この情報に少しでも謝りがあると地形モデルは描画されませんので、しっかりとしたプログラムを組んでいく必要がarimasu.

頂点座標の登録

さて、まずは頂点座標を登録していきましょう。

頂点座標に必要なのは「X・Y・Z」座標ですね。

そしてその「Y座標」というのが、先ほど読み込んだCSVファイルに記述されている無数の数字になります。

これを地形の横幅×縦幅分用意します。

なのでプログラムは意外とあっさりしたものになります。

(Main.java)

 

地形用のテクスチャ画像を作成

さて、テクスチャ座標を登録していきましょう、というところですが、その前にテクスチャ画像を作成していきます。

このテクスチャ画像は地形の横幅×縦幅分の大きさに設定し、各座標、つまり1ピクセルごとに高さに応じた色を付加していきます。

(Main.java)

 

テクスチャ座標の登録

さて、テクスチャ画像を作成したので、テクスチャ座標の登録をしていきましょう。

このテクスチャ座標に必要な情報は計8つあります。

必要なのは、4隅のX・Y座標になります。なので計8つですね。

そして地形の横幅×縦幅分用意します。

(Main.java)

 

フェイスの登録

最後にフェイスの登録をしていきましょう。

ところでフェイスとはなんぞや?という疑問がもしかしたら生まれるかもしれません。

一言で言うと、フェイスとはモデルを構成する小さい三角形です。

例えばこの三角形を2つ組み合わせると正方形になりますよね。

その正方形を6つ用意するとどうなるでしょうか。

そうです、立方体が完成します。

このように、図形として最も角の少ない三角形を組み合わせることでモデルが完成するわけです。

それがフェイスです。

 

このフェイスに必要な情報は6つあります。

必要なのは「頂点番号・テクスチャ番号」の2セットを3つ分です。

この頂点番号やテクスチャ番号というのは、先ほど登録した頂点座標やテクスチャ座標が何番目に追加されたかによって、0から順に付加されたものです。

そして完成した三角形を2つ組み合わせ、1ピクセルの正方形を作り、無数に組み合わせていきます。

それを行なっているのが以下のプログラムになります。

(Main.java)

 

マテリアルの設定

最後にマテリアルを設定し、完成した地形モデルを表示させてみましょう。

(Main.java)

 

マウスによる回転移動の追加

最後にちょっとしてギミックとして、マウスによる回転移動を付け加えて、地形モデルをいろんな角度から見てましょう。

(Main.java)

 


【筆者オススメ!】
↓Javaをさらに勉強したい方へ(スポンサーリンク)



↓JavaFXをさらに勉強したい方へ(スポンサーリンク)

↓3Dプログラミングをさらに勉強したい方へ(スポンサーリンク)
ABOUT ME
IT系だんし
プログラミングが大好きな人。 趣味でゲームやツール製作をしながら、プログラミング記事を書き続けています。