ポリゴンの生成・配置と各種ポリゴン

ここでは、ポリゴンの生成と配置方法、および色々な種類のポリゴンについて扱います。

- 目次 -

ポリゴンとは

ポリゴンとは、3次元の微小な面などを表現するもので、 3次元形状を構成する最も細かい基本要素となるものです。 一般に、モデルは複数のポリゴンによって構成されており、 特に曲面を持つモデルでは大量のポリゴンを使用します。

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

なお、ポリゴンは英語で多角形という意味であるため、 厳密な意味でのポリゴンは三角形や四角形などに限定されます。 しかしVCSSL Graphics3Dでは少し意味を拡張し、 「ベクトルの集合で構成される描画基本要素」の事をすべてポリゴンと呼びます。 従って三角形や四角形はもちろん、点や線、 加えて文字や画像などの描画基本要素もポリゴンと呼びます。

ポリゴンの生成

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

- 関数仕様 -

int new〜Polygon ( 〜 )

この関数はポリゴンを生成し、そのモデルのIDを返します。

なお、ポリゴンの集合は、newModel関数を用いてモデルにまとめる事が可能です

- 関数仕様 -

int newModel ( int polygonID[ ] )

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

ポリゴンの配置

生成したポリゴンをモデルにまとめず、直接配置するには、mountPolygon関数を使用します。

- 関数仕様 -

int mountPolygon ( int polygonID, int rendererID )

引数polygonIDには配置するポリゴンのIDを、 続く引数rendererIDにはレンダラーのIDを指定します。

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

- 関数仕様 -

int mountPolygon ( int polygonID, int rendererID, int coordinateID )

引数polygonIDには配置するポリゴンのIDを、 続く引数rendererIDにはレンダラーのID、 最後の引数coordinateIDには座標系のIDを指定します。

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

各種ポリゴン

点ポリゴン ― PointPolygon

点ポリゴンの図
点ポリゴン
丸い形をした、点を表現するための描画要素。

点ポリゴンは、点を表現するためのポリゴンです。 本来は小さな点を表現するために使うものですが、 球を大きな点ポリゴンで代用するといった使い方もできます。 その場合立体感は無くなりますが、描画負荷を大幅に軽減する事が可能です。

点ポリゴンを生成するには、newPointPolygon関数を使用します。

- 関数仕様 -

int newPointPolygon (
  float x, float y, float z,
  float size
)

引数( x, y, z )で中心の位置を、続く引数sizeで半径を指定します。

線ポリゴン ― LinePolygon

線ポリゴンの図
線ポリゴン
2つの頂点ベクトルを結ぶ、線を表現するための描画要素。

線ポリゴンは、直線を表現するためのポリゴンです。1ピクセルの細い線のほか、遠近感のある太い線も扱えます。

線ポリゴンを生成するには、newLinePolygon関数を使用します。

- 関数仕様 -

int newLinePolygon (
  float x1, float y1, float z1,
  float x2, float y2, float z2
)

三角形ポリゴン ― TrianglePolygon

三角形ポリゴンの図
三角形ポリゴン
3つの頂点ベクトルを結ぶ、三角形を表現するための描画要素。

三角形ポリゴンは、微小な三角形を表現するためのポリゴンです。

三角形ポリゴンを生成するには、newTrianglePolygon関数を使用します。

- 関数仕様 -

int newTrianglePolygon (
  float x1, float y1, float z1,
  float x2, float y2, float z2,
  float x3, float y3, float z3
)

引数( x1, y1, z1 )で頂点1の位置を、( x2, y2, z2 )で頂点2の位置を、 ( x3, y3, z3 )で頂点3の位置を指定します。

三角形ポリゴンには、裏表の向きが存在します。 頂点1、2、3が反時計回りに見える方向から見ると、 それが表面となります。別の言い方をすると、 頂点1、2、3の回転方向へ右ネジを回すと進む向きが、 表面の方向ベクトルとなります。

三角形ポリゴンは、表側から見た場合のみ描画され、 裏側から見てもなにも存在しないように見えます。

四角形ポリゴン ― QuadranglePolygon

四角形ポリゴンの図
四角形ポリゴン
4つの頂点ベクトルを結ぶ、四角形を表現するための描画要素。

四角形ポリゴンは、微小な四角形を表現するためのポリゴンです。 四角形ポリゴンを生成するには、newQuadranglePolygon関数を使用します。

- 関数仕様 -

int newQuadranglePolygon (
  float x1, float y1, float z1,
  float x2, float y2, float z2,
  float x3, float y3, float z3,
  float x4, float y4, float z4
)

引数( x1, y1, z1 )で頂点1の位置を、 ( x2, y2, z2 )で頂点2の位置を、( x3, y3, z3 )で頂点3の位置を、 ( x4, y4, z4 )で頂点4の位置を指定します。

四角形ポリゴンには、裏表の向きが存在します。 頂点1、2、3、4が反時計回りに見える方向から見ると、 それが表面となります。別の言い方をすると、 頂点1、2、3、4の回転方向へ右ネジを回すと進む向きが、 表面の方向ベクトルとなります。

四角形ポリゴンは、表側から見た場合のみ描画され、 裏側から見てもなにも存在しないように見えます。

画像ポリゴン ― ImagePolygon

画像ポリゴンは、画像や、別のレンダラーでの描画結果など、 グラフィックスデータの内容を表示するためのポリゴンです。 画像ポリゴンで表現される画像は、 いわゆるテクスチャーマッピングでは無く、 常に画面の方向を向いている画像として扱われます。

画像スポリゴンを生成するには、newImagePolygon関数を使用します。

- 関数仕様 -

int newGraphicsPolygon (
  float x, float y, float z,
  float lx, float ly,
  int graphicsID,
)

引数( x, y, z )で表示位置を、 続く引数lx、lyで表示する際の大きさ(幅と高さ)を、 最後の引数graphicsIDで画像のグラフィックスデータのIDを指定します。

画像の位置は、画像の左下が( x, y, z )に一致するように表示されます。 左上では無い事にご注意ください。 また、画像の大きさ(幅と高さ)は、画面上のピクセル数やポイント数では無く、 3次元空間における距離単位で扱われます。

・オフセット設定

画像ポリゴンは、画像の左下が指定位置に一致するように描画されます。 しかし、これを画像中心に一致するようにしたい場合などもあります。 そのような場合には、オフセット設定を行います。オフセット設定とは、 テキストポリゴンや画像ポリゴンを、描画時に上下左右方向にずらす設定です。

- 関数仕様 -

int setPolygonOffset (
  int polygonID,
  float dx, float dy,
)

最初の引数で設定対象のポリゴンIDを、続く引数dxで右方向へのオフセット量を、 dyで上方向へのオフセット量を指定します。すると、描画時に画面上下左右方向へオフセットされます。 なお、オフセット量は、画面上のピクセル数では無く、3次元空間での距離単位で扱われます。

テキストポリゴン ― TextPolygon

テキストポリゴンは、文字列を表現するためのポリゴンです。 テキストポリゴンで表現される文字列は、いわゆる立体文字では無く、 常に画面の方向を向いている文字として扱われます。 モデルの横にコメントなどを添えるのに使用します。

テキストポリゴンを生成するには、newTextPolygon関数を使用します。

- 関数仕様 -

int newTextPolygon (
  float x, float y, float z,
  float size,
  string text,
)

引数( x, y, z )で表示位置を、続く引数sizeで文字の大きさ(高さ)を、 最後の引数textで文字を指定します。textの内容が単一の文字でなく文字列の場合は、 画面上にも文字列が表示されます。

文字の位置は、textに指定した最初の文字の左下が ( x, y, z )に一致するように表示されます。 また、文字の大きさ(高さ)は、画面上のピクセル数やポイント数では無く、 3次元空間における距離単位で扱われます。

・フォント設定

テキストポリゴンのフォントを指定するには、setPolygonFont関数を使用します。 ただし、どのようなフォントが使用できるかは、環境に依存しますのでご注意ください。

- 関数仕様 -

int setPolygonFont ( int polygonID, string fontName )

最初の引数polygonIDで設定対象のポリゴンのIDを、続く引数fontNameでフォント名を指定します。

・オフセット設定

テキストポリゴンは、文字の左下が指定位置に一致するように描画されます。 しかし、これを中心に一致するようにしたい場合などもあります。 そのような場合には、オフセット設定を行います。 オフセット設定とは、テキストポリゴンやグラフィックスポリゴンを、 描画時に上下左右方向にずらす設定です。

オフセット設定を行うには、setPolygonOffset関数を使用します。

- 関数仕様 -

int setPolygonOffset (
  int polygonID,
  float dx, float dy,
)

最初の引数で設定対象のポリゴンIDを、続く引数dxで右方向へのオフセット量を、 最後の引数で上方向へのオフセット量を指定します。 すると、描画時に画面上下左右方向へオフセットされます。

なお、オフセット量は、画面上のピクセル数やポイント数では無く、 3次元空間における距離単位で扱われます。

プログラム例

それでは、これまでに扱った各種ポリゴン(グラフィックスとテキストを除く)を、実際に使用してみましょう。以下のように記述し、実行してみてください。

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

このプログラムを実行すると、黒い背景に様々なポリゴンが表示されます。

各種ポリゴンを配置した図
実行結果
様々なポリゴンが表示される。