piece of Procedural - men tan pin
プロシージャルモデリングの習作
メンタンピン
プロシージャル配置の作例(?)としてご紹介してみます。
麻雀用語が多めで申し訳ないです。
手続きの流れ
まずは牌そのものの代わりにpoint群を用意しました。
Attribute Wrangle でどかっと作り、同時に牌の種別を表すアトリビュートを付与します。(m1=マンズの1)
"polyline"で接続されている理由は後ほど説明します。
各牌は4枚づつ存在するので、点群を複製し、同時に残り枚数を表すアトリビュートも付与します。
polylineで接続されているpointの中から、シュンツの「中央」になる可能性のあるpointを抜粋します。
タンヤオなので1と9は除かれます。2と8もシュンツの中央には来ないので除かれます。
point群の中から、1つのpointをランダムで選択します。これが1つ目のシュンツの「中央」の牌です。
ランダムなpointを1つ選ぶ方法は、今回は Sort SOPを使用しました。ソート方法を「Random」にして、次に繋いだGroup SOP で「0」番のpointを選択しています。
ランダムシードは別のノードに一括でまとめています。
候補牌を抜粋する前のpoint群に対して Group Transfer SOP でシュンツの「中央」を教えてやり、
Find Shortest Path SOP で両隣のpointを取得します。このために polylineで繋いでみました。
これでシュンツが1つ決まりました!
Attribute Wrangle で残り牌をカウントダウンし、シュンツのグループは残り数の小さいほうに移動します。
なぜかというと、polylineで繋ぎなおすのが面倒だから、というだけです。
1つ目のシュンツはpoint群から split し、また次のシュンツ候補の中から、同様の処理でシュンツを選んでいきます。
ただし、同じシュンツは3回以上選択されないように小細工をする必要があります。
同じシュンツが2つなら一盃口になりますが、同じシュンツが3つになると三暗刻になってしまい、メンタンピンではなくなるからです(たぶん…)。
最後に雀頭を取得します。
雀頭は、1と9以外で、かつ2枚以上残っている牌からランダムで選択します。
これで全ての牌が選ばれ split されたので、それらを全て Merge します。
見やすいようにリーパイ(ソート)したら…
事前に作成しておいた牌と差し替えて、メンタンピン完成です!
ランダムシードは$Fベースですが、早すぎてデバッグできない…!:D
画像は「麻雀の雀龍.com」の無料麻雀牌画をお借りしました。
麻雀牌画・無料素材(フリー画像)のダウンロード可能! - 麻雀の雀龍.com