三角形プリミティブの対角線の向きを変える

三角形ポリゴンのペアを探し、対角線の向きを変える。極端に伸びている三角形を減らし、均一化することができる。

For-Loop SOPで何回も繰り返すと、さらに整う。

処理の流れ

Wrangleをつなぎ、一番長い辺が隣り合う三角形のペアをつくり、インデックスを記録しておく。

//
// 三角形ポリゴンの長いエッジから隣り合うプリミティブを探す
// Run OVer: Primitive
//
int prim_vtxs[] = primvertices(0, @primnum);
int pts[];

// 三角形なら
if (len(prim_vtxs) == 3)
{
    float max_length = 0;
    int longest_edge;
    foreach (int vtx; prim_vtxs)
    {
        int edge = vertexhedge(0, vtx);
        int src_pt = hedge_srcpoint(0, edge);
        int dst_pt = hedge_dstpoint(0, edge);
        vector src_pos = point(0, "P", src_pt);
        vector dst_pos = point(0, "P", dst_pt);
        float length = distance(src_pos, dst_pos);
        if (length > max_length)
        {
            longest_edge = edge;
            max_length = length;
            pts[0] = src_pt;
            pts[1] = dst_pt;
        }
    }  
    
    // プライマリエッジを取得する
    // 隣接した面のエッジと同じかどうかを比較するにはプライマリエッジを取得する必要あり
    int edge = hedge_nextequiv(0, longest_edge);
    int prim = hedge_prim(0, edge);
    
    if(prim != @primnum)
        i@__pare_prim = prim;
    else
        i@__pare_prim = -1;
        
    // エッジのポイントインデックス
    i[]@__common_pts = pts;
    
    // 三角形のポイントインデックス
    int primpoints[] = primpoints(0, @primnum);
    i[]@__primpoints = primpoints;
    
    // 
    for(int i = 0; i < len(pts); i++)
        removevalue(primpoints, pts[i]);
    
    i@__corner_pt = primpoints[0];
}

続けてWrangleをつなげ、元のプリミティブを削除して、対角線の向きを変えた新しい三角形を生成する。

//
// 対角線の向きを変えた新しい三角形を生成する
// Run OVer: Primitive
//

// ペアのプリミティブがある場合
if(i@__pare_prim != -1)
{
    // ペアのプリミティブから見たペアの番号
    int pare_prim = prim(0, "__pare_prim", i@__pare_prim);
    
    // 互いがペアの場合
    if(pare_prim == @primnum && @primnum > i@__pare_prim)
    {
        int cornerPoint = prim(0, "__corner_pt", i@__pare_prim);
        
        int prim = addprim(0, "poly");
        addvertex(0, prim, i@__corner_pt);
        addvertex(0, prim, i[]@__common_pts[0]);
        addvertex(0, prim, cornerPoint);
        
        prim = addprim(0, "poly");
        addvertex(0, prim, i@__corner_pt);
        addvertex(0, prim, cornerPoint);
        addvertex(0, prim, i[]@__common_pts[1]);
        
        // 元のプリミティブを削除
        removeprim(0, @primnum, 1);
        removeprim(0, i@__pare_prim, 1);
    }
}
タイトルとURLをコピーしました