簡単キューブ形状生成CreateIndexCube 再び

やあ子どもたち、会社や職場などで戦力外通告を受けてもホイミスライムのように逞しく生きているか。まわりの空気など気にせずに自分の目的意識をしっかり持てるかどうかが大事だぞ。


今日はキューブ形状のインデックス形式を早々に生成して返してくれる便利関数CreateIndexCube2の紹介だよ。
以前に紹介したものはGL_TRIANGLESでの使用を念頭に置いていたので純三角ポリゴンメッシュとしてのキューブについてのものだったのだが、今回のは純クアッドメッシュとしてのキューブだよ。おそらくC+11を使ってのキューブ形状簡単生成の実装としては世界初なんじゃないかと思ってる。

template< class vec3>
void CreateIndexCube2
(
  float a, float b, float c, // 入力情報
  vector< int >* indices, // 出力(トポロジーインデックス)
  vector< vec3 >* poslist // 出力(参照幾何情報)
)
{
    // キューブ頂点を発生
    a -= .5*a;
    b -= .5*b;
    c -= .5*c;
    vector< vec3 > posv = {
        vec3( -a, -b, -c ),
        vec3(  a, -b, -c ),
        vec3(  a,  b, -c ),
        vec3( -a,  b, -c ),
        vec3( -a, -b, c ),
        vec3(  a, -b, c ),
        vec3(  a,  b, c ),
        vec3( -a,  b, c ),
    };
    *poslist = move( posv );// vectorにmoveコンストラクタ定義があればただの代入でも可。
    // トポロジー
    vector< int > ids=
    {
        3, 2, 1, 0, -1,
        4, 5, 6, 7, -1,
        0, 1, 5, 4, -1,
        1, 2, 6, 5, -1,
        2, 3, 7, 6, -1,
        0, 4, 7, 3, -1
    };
    *indices = move( ids );// vectorにmoveコンストラクタ定義があればただの代入でも可。
    return;
}

使い方を言う必要もないほどだが、いちおう述べておくと入力引数a, b, cをそれぞれXYZ軸方向の辺の長さとし、中心を原点とするキューブ形状のクアッドメッシュ表記を、インデックス形式情報(indices, poslist)に返します。vec3はx,y,zを受け取るコンストラクタだけインタフェースを要求しますが、例えばglm::vec3などが使えます。
ちなみに言葉として厳密にはキューブ(cube, 正六面体という言い方もできてその場合はregular hexahedron)とは上記記号でいうところのa=b=cの場合のみであって、そうでない場合の直方体は英語で言うとcuboidあるいはrectangular solidあるいはrectanglar-parallelopipedとなるようです。
書いていて気付いたのが、三角メッシュのインデックス形式生成もこいつの出力を加工した方がはええだろっつ−話。なので前回の記事はまるごと書きなおしてしまうかも。
ではまたな、チャオ!