モデルの生成・配置と各種標準モデル

ここでは、立体モデルの生成と配置方法、および色々な種類の標準立体モデルについて扱います。

- 目次 -

モデルとは

モデルとは、3次元の形状を表現するもので、 ポリゴンという微小な多角形の集合で構成されています。 ペーパークラフトのようなものを想像するとよいかもしれません。

球モデルをワイヤーフレームで描画した図
球モデルのポリゴン集合
球モデルは、地球儀の経線と緯線で囲まれる四角形のように、規則正しく並んだ大量の四角形ポリゴンで構成されている。

例えば球モデルは、 ちょうど地球儀の経線と緯線で囲まれる四角形の集合のように、 規則正しく並んだ大量の四角形ポリゴンで構成されています。

VCSSLでは、自分で独自にポリゴンの集合を生成してモデルにまとめる事もできますが、 基本的な形状を表現するモデルは標準で用意されています。

これからしばらくは、この標準モデルを中心に扱っていきます。

モデルの生成

標準モデルの生成

標準モデルを生成するには、new〜Model関数を使用します。 〜の部分には標準モデル固有の名称が入ります。 標準モデルには様々な種類が存在しますが、 各モデルの具体的な生成に関しては次章で扱います。

- 関数仕様 -

int new〜Model ( 〜 )

この関数は標準モデルを生成し、そのモデルのIDを返します。

独自モデルの生成

自分で生成したポリゴンの集合からモデルを生成するには、 newModel関数を使用します。 なお、ポリゴンの生成や制御に関しては、また後の章で扱います。

- 関数仕様 -

int newModel ( int polygonID[ ] )

引数polygonIDには、モデルを構成するポリゴン集合のIDを配列で指定します。 この関数は、受け取ったポリゴンの集合を一つのモデルにまとめ、 そのモデルのIDを返します。ポリゴン集合をモデルにまとめる利点は、 平行移動や回転などを一括して行える事です。

コピーモデルの生成

newModel関数では、すでに生成したモデルをコピーし、 同型の新しいモデルを作る事も可能です。

- 関数仕様 -

int newModel ( int copyModelID )

引数にcopyModelIDには、コピーしたいモデルのモデルIDを指定します。

モデルの配置

生成したモデルを配置するには、mountModel関数を使用します。

- 関数仕様 -

int mountModel ( int modelID, int rendererID )

引数modelIDには配置するモデルのIDを、 続く引数rendererIDにはレンダラーのIDを指定します。

なお、次のように座標系を指定して配置する事も可能です。 座標系に関しては、本文書の後半で扱います。

- 関数仕様 -

int mountModel ( int modelID, int rendererID, int coordinateID )

引数modelIDには配置するモデルのIDを、 続く引数rendererIDにはレンダラーのID、 最後の引数coordinateIDには座標系のIDを指定します。

mountModel と addModel との関係
なお、VCSSL3.0以前の世代では、配置にはaddModel関数を使用していました。 しかし、add〜という関数名としては引数の順序が混乱を招くという理由により、 VCSSL3.1以降では、関数名を上記のmountModelに変えたものが追加されました。 つまりaddModel関数とmountModel関数は、名称が異なるだけで全く同一のものです。

各種標準モデル

座標軸モデル ― AxisModel

座標軸モデルの図
座標軸モデル
赤色がX軸、緑色がY軸、青色がZ軸。つまり(X,Y,Z)=(R,G,B)となっている。

座標軸モデル(アキシス)は、3次元空間の方向を指し示すモデルです。 3DCGの舞台設計は、最初にこの座標軸モデルを配置する事から始まるとも言える、 非常に重要なモデルです。

座標軸モデルを生成するには、newAxisModel関数を使用します。

- 関数仕様 -

int newAxisModel ( float lx, float ly, float lz )

引数lx、ly、lzには、それぞれX軸、Y軸、Z軸方向の長さを指定します。

球モデル ― SphereModel

球モデルの図
球モデル
表面の滑らかさはn1とn2で調整可能。

球モデル(スフィア)を生成するには、newSphereModel関数を使用します。

- 関数仕様 -

int newSphereModel (
  float rx, float ry, float rz,
  int n1, int n2
)

引数rx、ry、rzには、底面のX、Y、Z方向半径を指定します。 続く引数n1には緯度方向のポリゴン数、n2には経度方向のポリゴン数を指定します。 モデル全体のポリゴン数はn1×n2となります。

ポリゴン数とは、曲面を表現するのに使用するポリゴンの数です。 ポリゴン数を上げるほど曲面がなめらかに、下げるほどカクカクになります。

直方体モデル ― BoxModel

直方体モデルの図
直方体モデル
一面あたり一枚のポリゴンで構成。

直方体モデル(ボックス)を生成するには、newBoxModel関数を使用します。

- 関数仕様 -

int newBoxModel ( float lx, float ly, float lz )

引数lx、ly、lzには、それぞれX軸、Y軸、Z軸方向の長さを指定します。 なお、中心(重心)が原点に一致するよう配置されます。

円柱モデル ― CylinderModel

円柱モデルの図
円柱モデル
表面の滑らかさはn1とn2で調整可能。

円柱モデル(シリンダー)を生成するには、 newCylinderModel関数を使用します。

- 関数仕様 -

int newCylinderModel (
  float rx, float ry, float rz,
  int n1, int n2
)

引数lx、ly、lzには、それぞれX軸方向半径、Y軸方向半径、高さを指定します。 なお、底面の中心が原点に一致するよう配置されます。

底面なしの円筒モデル ― TubeModel

底面なしの円筒モデル
表面の滑らかさはn1とn2で調整可能。円筒の内側は描画されない。

底面なしの円筒モデル(チューブ)を生成するには、 newTubeModel関数を使用します。

- 関数仕様 -

int newTubeModel (
  float rx, float ry, float rz,
  int n1, int n2
)

引数lx、ly、lzには、それぞれX軸方向半径、 Y軸方向半径、高さを指定します。なお、底面の中心が原点に一致するよう配置されます。

続く引数n1には緯度方向のポリゴン数、n2には高さ方向のポリゴン数を指定します。 モデル全体のポリゴン数はn1×n2となります。

円錐モデル ― ConeModel

円錐モデルの例
底面なしの円筒モデル
表面の滑らかさはn1とn2で調整可能。

円錐モデル(コーン)を生成するには、newConeModel関数を使用します。

- 関数仕様 -

int newConeModel (
  float rx, float ry, float rz,
  int n1, int n2
)

引数lx、ly、lzには、それぞれX軸方向半径、Y軸方向半径、 高さを指定します。なお、底面の中心が原点に一致するよう配置されます。

続く引数n1には緯度方向のポリゴン数、 n2には高さ方向のポリゴン数を指定します。 モデル全体のポリゴン数はn1×n2となります。

底面なしの円錐モデル ― ShadeModel

円錐モデルの図
底面なしの円筒モデル
表面の滑らかさはn1とn2で調整可能。円錐の内側は描画されない。

底面なしの円錐モデル(シェード)を生成するには、 newShadeModel関数を使用します。

- 関数仕様 -

int newShadeModel (
  float rx, float ry, float rz,
  int n1, int n2
)

引数lx、ly、lzには、それぞれX軸方向半径、Y軸方向半径、高さを指定します。 なお、底面の中心が原点に一致するよう配置されます。

続く引数n1には緯度方向のポリゴン数、n2には高さ方向のポリゴン数を指定します。 モデル全体のポリゴン数はn1×n2となります。

円盤モデル ― DiskModel

円盤モデルの図
円盤モデル
表面の滑らかさはnで調整可能。裏面は描画されない。

円盤モデル(ディスク)を生成するには、newDiskModel関数を使用します。

- 関数仕様 -

int newDiskModel ( float rx, float ry, int n )

引数lx、lyには、それぞれX軸方向半径、Y軸方向半径を指定します。 なお、中心(重心)が原点に一致するよう配置されます。

続く引数nにはポリゴン数を指定します。 ポリゴン数とは、曲面を表現するのに使用するポリゴンの数です。 ポリゴン数を上げるほど曲面がなめらかに、下げるほどカクカクになります。

面の向きと、裏面の描画省略

モデルには、表面と裏面があります。例えば円盤モデルは、 生成時にZ軸の上の方が表面となり、通常は表面しか描画されません。 つまり裏面から見ても、なにも存在しないように見えます。 見えるようにするには、 setModelCull( modelID, false, false ) で裏面の描画省略を無効化します。

プログラム例

それでは、上で扱った各種標準モデルを実際に使用してみましょう。 以下のように記述し、実行してみてください。

Sample.vcssl
» 使用方法 / コード解説

このプログラムを実行すると、黒い背景に様々な標準モデルが表示されます。


実行結果
様々な標準モデルが表示される。

円筒の内側は裏面なので、標準では描画されません。 描画するには円筒モデル生成後に setModelCull( tube, false, false ) ; と追記し、 裏面の描画省略を無効化してください。 底面なしの円錐モデルなどについても同様です。