» 詳しい使用方法や、エラーで展開できない際の対応方法などはこちら
[公式ガイドサンプル] 立体モデルを生成して3D空間に配置する
このプログラムは、 「 VCSSL 3DCG開発ガイド 」 の 「 モデルの生成・配置と各種標準モデル 」 の回に登場するサンプルコードです。 ここでは、そのサンプルコードを実行環境ごとダウンロードして、実際に実行してみる事ができます。 プログラミングガイド的な詳しい解説については、上記ページをご参照ください。
スポンサーリンク
使用方法
ダウンロードと展開(解凍)
まず、PC(スマホは未対応)で上の画面の「 ダウンロード 」ボタンを押してください。 するとZIP形式で圧縮されたファイルがダウンロードされます。
その後、ZIPファイルを右クリックして「すべて展開」や「ここに展開」などで展開(解凍)してください。 展開が成功すると、ZIPファイルと同じ名前のフォルダができ、その中にZIPファイルの中身が入っています。
» 展開がエラーで止まってしまう場合や、ファイル名が文字化けしてしまう場合は…
プログラムの起動
Windows をご使用の場合
上記でZIPファイルを展開したフォルダ内にある、以下のバッチファイルをダブルクリック実行してください:
もしプログラムを書き変えながら使いたい場合は、代わりに「 VCSSL_Editor__プログラム編集はこちら.bat 」を実行してください。
正常に起動できると、初回のみ、Java実行環境を入手するか等を尋ねられるので、適時答えて済ませると、プログラムが起動します。 2回目以降はすぐに起動します。
Linux 等をご使用の場合
ZIPファイルを展開したフォルダ内へコマンドライン端末で cd して、以下の通り入力して実行してください:
(プログラムの内容を書き変えながら使いたい場合は、代わりに VCSSL_Editor.jar を実行)
» javaコマンドが使用できない等のエラーが表示される場合は…
起動後
起動すると、3DCGの表示ウィンドウが表れ、そこに3D空間の内容が表示されます(下図)。 表示ウィンドウ上で、マウスでの視点操作や拡大・縮小も可能です。
今回のサンプルコードでは、上図の通り、 3D空間内に球や立方体、円錐や円柱などの基本的な立体モデルを配置しています。 立体モデルは、前回のサンプルコードで扱った「ポリゴン」を組み合わせて自作する事もできますが、 基本的な形状のものは標準で用意されていて、簡単に生成・配置できます。
モデルの内面や裏面を描画するには?
なお、上の図をよく見ると、右のほうにある、ふたの無い円筒モデルの内面が描画されていませんね。 他にも、底の無い円錐モデルの内面や、円盤モデルの内面は、標準では描画されません。
これは、通常はあまり見る機会の無い、立体の内面/裏面の描画を省いて負荷を軽減する「カリング」という機能が、標準で働いているからです。 カリングは、必要に応じて無効化する事もできます。詳細は下のコード解説の最後で触れます。 カリングを無効化すると、下図のようにちゃんと内面/裏面も描画されるようになります:
面の細かさについて
ところで、立体モデルの表面に注目すると、 球や円錐など、本来は曲面であるべき面がカクカクしていますね。 これは、立体モデルの面が、 細かい三角形や四角形のポリゴン(前回のサンプルコード参照) を組み合わせて構成されているためです。
近代的な3DCG関連のソフトでは、ふつうはこのようなポリゴンのカクカクを目立たなくする機能があるのですが、 残念ながらVCSSLには(少なくとも今のところは)ありません。 VCSSLの描画機能は、簡易&即席用途に的を絞ったもので、 現状では「フラットシェーディング」という単純な方式の描画しかサポートされていません。 これは、1枚のポリゴンを1色でベタ塗りするもので、必然的にポリゴンの境界は折り紙のようにカクカクになります。
滑らかな曲面を使用したい場合は、素直に本格的な3DCGソフトを使用するのがおすすめです。 ただ、VCSSLで即席で描いた内容を、どうしても滑らかに描画したい、という場合は、 やや強引ですが、立体モデルで使用するポリゴンの数を増やすという方法もあります。 ポリゴンの数は、立体モデル生成関数の引数で指定できます(参照)。 これを思いっきり増やすと:
このように、立体モデルの曲面がなめらかになります。半面、描画処理は重くなり、重さがある程度を超えると、マウス処理がカクついたりもします。 特にVCSSLでは、プラットフォームに依存しないポータブルな実行環境で動作する事を重視するため、 少なくとも現状では、3DCGの内部処理にGPUは使用されず、光線や陰影の計算も含めて基本的にCPUで処理されます。 そのため、一般的な3D環境の基準からすると、処理はだいぶ重めの部類に入ります。 従ってこの方法は、一枚絵の画像の作成には有用かもしれませんが、アニメーションなどには向かない、あくまでもややゴリ押しの方法です。
スポンサーリンク
コード解説
このプログラムのコードはVCSSLで記述されています。
内容を書き変えて改造したい場合には、 プログラムのコード「 Model.vcssl 」をテキストエディタで開いて改造してください。 スクリプト言語なので、コンパイラなどの別ソフトは不要で、コードを書き換えるだけでOKです。 VCSSLはC系の単純な文法の言語なので、C言語などに触れた事のある方なら簡単に読めると思います。
コード全体は以下の通りです。
以上です。50行程度のコードですね。 立体モデル1個ずつの生成・配置に要している行は、それぞれ2〜3行ほどです。
このコードは 「 VCSSL 3DCG開発ガイド 」 の 「 モデルの生成・配置と各種標準モデル 」 の回に登場するサンプルコードなので、詳しい説明はそちらのページをご参照ください。
以下では、コード先頭から軽く流し読みする感じで、各行で何をやっているのかを見ていきます。 まずは先頭です:
最初の行は文字化け対策で、コードを書いてあるファイルの文字コードが「Shift_JIS」である事を明示しています。 文字コードは他にも「UTF-8」などを使用できます。
その後の2行は、VCSSLの標準ライブラリから、3DCGを扱うための 「 Graphics3D 」ライブラリと 「 Graphics3DFramework 」ライブラリを読み込んでいます。 Graphics3D ライブラリだけでも3DCGの描画は可能なのですが、それだと表示画面の構築や、毎秒数十回の画面更新処理などを、 自分で書く必要が生じます(参照)。 ただ、そういった処理は大体決まりきった内容なので、自分で書くのは面倒です。 そこで、そういった土台周りの処理を自動で行ってくれる、一種の簡易フレームワークが Graphics3DFramework ライブラリです(参照)。
続きです:
ここでは onStart という関数を宣言していますが、この関数はコード内のどこからも呼んでいません。 では一体どこから呼ばれて実行されるのかというと、先ほど読み込んだ Graphics3DFramework です。
Graphics3DFramework を import したプログラムでは、 起動と同時に背後でフレームワークが動き始め、あとは適時、必要な処理を自動で行ってくれます。 プログラム全体の「流れ」も、フレームワークがコントロールします。 ではコード内には何を書くかというと、特定のタイミングでフレームワークに行ってほしい処理を、 あらかじめ決まっている名前の関数の中に書きます。 例えば最初に一回だけ行いたい処理は onStart 関数、毎秒数十回の画面更新毎に行いたい処理は onUpdate 関数、といった具合です (参照)。 するとフレームワークが、適切なタイミングでその関数を実行してくれます。
さて、ここで宣言している onStart 関数は、フレームワークが起動後に、 画面構築や3D描画エンジン(レンダラー)の生成などの準備が終わった段階で、1回だけ呼び出されます (引数には、3D描画エンジンのID番号が渡されます。これは、各種設定や立体の配置などを行う際に使用します)。 通常はこの onStart 関数内に、立体を3D空間に配置したり、初期設定を行ったり、といった処理を記述します。
実際に今回の onStart 関数の内容を見ていきましょう。先頭は:
のように、まず画面の初期設定を行っています。
そこからが、今回のサンプルコードのメインテーマである、立体モデルを生成して配置していく処理です。 最初の座標軸モデルの生成と配置をクローズアップして見てみましょう:
ここで呼んでいる「 newAxisModel 」という名前の関数は、 座標軸モデル(後述)を生成する関数です。 他にも、「 new〜Model 」という名前で、各種の基本的な立体モデルを生成する関数があります。 一覧と詳細については、VCSSL 3DCG開発ガイドの 「 モデルの生成・配置と各種標準モデル 」の回をご参照ください。
さて、立体モデル生成関数( new〜Polygon 関数 )は、 生成した立体モデルに整数のID番号を割りふって、それを戻り値として返します。 立体モデルを配置したり変形・移動させたりする際は、 それが「どの立体モデルに対する操作なのか」を指定するために、このID番号が必要になります。
実際に上では、生成した座標軸モデルのID番号を、int 型の変数 axis に控えています。 そして、その直後に mountModel 関数で、そのID番号を引数に渡して、 座標軸モデルを3D空間に配置しています。
なお、ここで使用した座標軸モデルは、カラフルな直行する3つの矢印を持つモデルで、赤い矢印がX軸、緑がY軸、青がZ軸の方向を表しています。 3D空間に立体を配置する際は、空間の向きやスケール感を把握しやすくするため、とりあえず最初に置いておくと便利です。 矢印の長さは、newAxisModel 関数の引数で指定でき、ここでは 3.0 としています。
さて、コードの残りの部分です:
ここでは、先ほどと全く同じ要領で、色々な立体モデルを生成して、3D空間に配置しています。 配置が見やすくなるように、 moveModel 関数で立体モデルを移動させて、位置を微調整したりもしています。 ここでも、移動対象の立体モデルを指定するために、変数に控えておいたポリゴンのID番号を引数に渡しています。
なお、曲面のある立体モデルの生成関数では、引数で使用するポリゴン数を指定できます。 例えば上で球モデルを生成している「 newSphereModel( 0.5, 0.5, 0.5, 10, 7 ) 」では、 最初の「 0.5, 0.5, 0.5 」がサイズの指定で、残りの「 10, 7 」がポリゴン数の指定です。 ここでは 軽度方向10 x 緯度方向7 = 70 ポリゴンの球が生成されます。 ポリゴン数を増やすほど曲面がなめらかになりますが、描画処理が重くなります。
ところで、冒頭でも少し触れた通り、標準では立体モデルの内面や裏面の描画を省く「カリング」という機能が効くため、 ふたの無い円筒モデルの内面が描画されません。 他にも、底の無い円錐モデルの内面や、円盤モデルの内面は、標準では描画されません。
内面/裏面を描画させたい場合は、setModelCull 関数で、カリングを無効化します。 いまの場合は、onStart 関数内の最後に、以下のように追記すれば OK です:
これで、ちゃんと裏面が描画されるようになります。
コード内容は以上です。
ライセンス
このVCSSL/Vnanoコード( 拡張子が「.vcssl」や「.vnano」のファイル )は実質的な著作権フリー(パブリックドメイン) である CC0 の状態で公開しています※。 記事中にC言語/C++/Java言語などでのサンプルコードが掲載されいてる場合は、それらについても同様です。 そのままでのご利用はもちろん、改造や流用などもご自由に行ってください。
※ ただし、このコードの配布フォルダ内には、ダウンロード後すぐに実行できるように、 VCSSLの実行環境も同梱されており、そのライセンス文書は「 License 」フォルダ内に同梱されています (要約すると、商用・非商用問わず自由に使用できますが、使用の結果に対して開発元は一切の責任を負いません、といった具合の内容です)。 配布フォルダ内の各構成物の一覧やライセンスについては「 ReadMe_使用方法_必ずお読みください.txt 」をご参照ください。
※ Vnano の実行環境については、別途スクリプトエンジンのソースコードも一般公開しており、 何らかのソフトウェア内に組み込んでご利用いただく事も可能です。詳細はこちらをご参照ください。
この記事中の商標などについて
- OracleとJavaは、Oracle Corporation 及びその子会社、関連会社の米国及びその他の国における登録商標です。文中の社名、商品名等は各社の商標または登録商標である場合があります。
- Windows は、米国 Microsoft Corporation の米国およびその他の国における登録商標です。この記事は独立著作物であり、Microsoft Corporation と関連のある、もしくはスポンサーを受けるものではありません。
- Linux は、Linus Torvalds 氏の米国およびその他の国における商標または登録商標です。
- その他、文中に使用されている商標は、その商標を保持する各社の各国における商標または登録商標です。
[公式ガイドサンプル] 立体モデルを回転させるアニメーション |
|
|
「VCSSL 3DCG開発ガイド」内のサンプルコードです。立体モデルを、アニメーションで回転させ続けます |
[公式ガイドサンプル] 立体モデルを回転させる |
|
|
「VCSSL 3DCG開発ガイド」内のサンプルコードです。立体モデルを、指定した角度だけ回転させます。 |
[公式ガイドサンプル] 立体モデルを移動させるアニメーション |
|
|
「VCSSL 3DCG開発ガイド」内のサンプルコードです。立体モデルの位置を、アニメーションで動かします。 |
[公式ガイドサンプル] 立体モデルを移動させる |
|
|
「VCSSL 3DCG開発ガイド」内のサンプルコードです。立体モデルの位置を移動させます。 |
[公式ガイドサンプル] 立体モデルを生成して3D空間に配置する |
|
|
「VCSSL 3DCG開発ガイド」内のサンプルコードです。立体モデルを生成し、3D空間に配置します。 |
[公式ガイドサンプル] ポリゴンを生成して3D空間に配置する |
|
|
「VCSSL 3DCG開発ガイド」内のサンプルコードです。立体の基本的な構成要素となるポリゴンを生成し、3D空間に配置します。 |