VCSSLでの立体の反転操作には、面の向きを裏表で反転させる「リバース反転」と、 形状を鏡映しに反転させる「ミラー反転」が存在します。
モデルの面には、裏表の向きが存在します。 面は表側から見た場合のみ描画され、裏側から見ても何も存在しないように見えます。 標準モデルでは、通常は外側が表面となっており、従って内側からは何も見えません。
しかし、例えばゲーム制作などにおいて、天球を作成するような場合や、 トンネル状の通路を作成するような場合など、 モデルの内側を表面にしたい場合がしばしばあります。 このような場合には、リバース反転を行う事で、 モデルの裏表を反転させる事ができます。
モデルのリバース反転を行うには、 reverseModel 関数を使用します。
- 関数の形式 -
引数 modelID には、反転対象のモデルのIDを指定します。
ポリゴンにも、三角形ポリゴンと四角形ポリゴンには裏表が存在します。 これらポリゴンに対してリバース反転を行うには、 reversePolygon 関数を使用します。
- 関数の形式 -
引数 polygonID では、反転対象のポリゴンのIDを指定します。
モデルをX軸などの方向へ、 鏡映しに反転させたいといった場合には、ミラー反転を行います。 モデルのミラー反転を行うには、 mirrorModel 関数を使用します。
- 関数の形式 -
引数は以下の通りです:
モデルと同様、ポリゴンのミラー反転を行うには、 mirrorPolygon 関数を使用します。
- 関数の形式 -
引数は以下の通りです:
ミラー反転を行う際には、注意しておく点があります。 それは、ミラー反転を行うと、同時に面の裏表も反転してしまうという点です。
このような事が生じる理由は、 「時計回りを鏡映反転すると反時計回りになる」事に由来しています。 面の裏表の向きは、 「ポリゴンを構成する頂点が反時計回りに並ぶ場合に表」と判定されていますが、 この向きはミラー反転すると逆転します。 従って、こちら側が表に見えていたポリゴンをミラー反転すると、 向こう側が表になってしまうのです。
従って、モデルやポリゴンに対してミラー反転を一度行う度に、 reverseModel関数やreversePolygon関数も同時に呼び出して、 面の裏表を正しくしてやる必要があります。
実際に円筒モデルを配置し、Z方向にミラー反転させてみましょう。 一回のミラー反転では面の裏表が逆転するため、同時にリバース反転も行います。 以下のように記述し、実行してみてください。
import graphics3d.Graphics3DFramework;
import Graphics3D;
// プログラムの最初に呼び出される関数
void onStart ( int rendererID ) {
// 画面サイズや背景色の設定(省略可能)
setWindowSize( 800, 600 );
setBackgroundColor( 0, 0, 0, 255 );
// 座標軸モデルを生成して配置
int axis = newAxisModel( 3.0, 3.0, 3.0 );
mountModel( axis, rendererID );
// 円筒モデル1を生成して配置
int cylinder1 = newCylinderModel( 1.0, 1.0, 2.0, 20, 1 );
setModelColor( cylinder1, 255, 0, 0, 255 ); // 赤色に設定
mountModel( cylinder1, rendererID );
// 円筒モデル2を生成して配置
int cylinder2 = newCylinderModel( 1.0, 1.0, 2.0, 20, 1 );
setModelColor( cylinder2, 0, 0, 255, 255 ); // 青色に設定
mountModel( cylinder2, rendererID );
// モデル2をZ軸方向にミラー反転
mirrorModel( cylinder2, false, false, true );
reverseModel( cylinder2 ); // 裏表の反転を補正
}
Sample.vcssl
このプログラムを実行すると、黒い画面に赤色と青色の円筒が表示されます。 青色の円筒は、ちょうど赤色の円筒をZ軸方向に反転した形状となっています。