「がんばれない」けど「がんばりたい」

ITエンジニアの仕事のこと。AI、機械学習、ディープラーニング。地頭力。車のこと。

openFrameworks.cc Tutorial|Generating Meshesを読む#1

openFrameworks.cc tutorial>Generating Meshesのページを読む。

・頂点を繋ぎ合わせて作られた形の事をPrimitiveと言う。

The shapes that are formed by connecting these vertices are called primitives.

・verticalに色情報を追加

mesh.enableColors(); mesh.addColor(ofFloatColor(0.0, 1.0, 0.0));

OF_PRIMITIVE_LINES

頂点情報を3点追加して、LINESで描画すると1つ目〜2つ目までの線のみ引かれる。LINESモードは線を引く為のものなので、偶数の頂点座標がないと引けない。3つ目の頂点座標が始点とみなされるので、次の情報を与えないといけない。lines

OF_PRIMITIVE_LINE_STRIP

こっちは、vertex arrayの最初から最後まで線で繋いでくれる。が、最後の頂点座標で止まるので、クロージャされない。

OF_PRIMITIVE_LINE_STRIP

OF_PRIMITIVE_LINE_LOOP こっちは、最初と最後のvertexを繋いでくれる。

OF_PRIMITIVE_LINE_LOOP

OF_PRIMITIVE_LINESで三角形を作るには、こんな感じにしないとだめ。

    mesh.addVertex(top);
    mesh.addVertex(left);
    mesh.addVertex(left);
    mesh.addVertex(right);
    mesh.addVertex(right);
    mesh.addVertex(top);

ちょっとメンドクサイし、同じ頂点座標を複数記述するのも、変な感じ。 なので、indexで対処する書き方を行ってみる。

void setup()
{
    //mesh setup
    // POINTS
    glPointSize(2);
    mesh.setMode(OF_PRIMITIVE_POINTS);
    
    //LINES
    mesh.setMode(OF_PRIMITIVE_LINES);
    mesh.setMode(OF_PRIMITIVE_LINE_STRIP);
    mesh.setMode(OF_PRIMITIVE_LINE_LOOP);
    
    
    //vertics array
    ofVec3f top(100.0, 50.0, 0.0);
    ofVec3f left(50.0, 150.0, 0.0);
    ofVec3f right(150.0, 150.0, 0.0);


    //mesh enables color setup
    mesh.enableColors();
    
    //vertex info.
    mesh.addVertex(top);
    mesh.addColor(ofFloatColor(1.0, 0.0, 0.0));
    
    mesh.addVertex(left);
    mesh.addColor(ofFloatColor(0.0, 1.0, 0.0));
    
    mesh.addVertex(right);
    mesh.addColor(ofFloatColor(1.0, 1.0, 0.0));
    
    //make triangle /w OF_PRIMITIVE_LINES
    mesh.enableIndices<();
    mesh.addIndex(0);
    mesh.addIndex(1);
    mesh.addIndex(1);
    mesh.addIndex(2);
    mesh.addIndex(2);
    mesh.addIndex(2);
    mesh.addIndex(0);
}

void draw()
{
  ofBackground(0);
  mesh.draw();
}

たった三角形を描くのに、大変だと思うけど、これ(インデックス)を指定する事は、後々重要で効果的な事らしいです。またOF_PRIMITIVE_LINEに色を追加して描画する時に、始点と終点の色が違うと勝手に始点終点間の色は補完されてしまいます。これ、仕様なのだと思うのだけど、嫌ならば始点終点それぞれの色を同じに指定する必要があります。