この記事は、rogy Advent Calenderの六日目です。


はじめまして、アカテツ科です。 

普段ゲームを作る自分ですが、今回は全くろぎげ内活動と関係ない
自分の趣味の話をします。(ごめん)

DSC_0385

折り紙です。 

お雛様とか折ったことがありますか?自分はあります。
「紙飛行機」(*)「紙風船」とかを遊びの為の折り紙とするならば、
これらは表現としての折り紙ですね。言ってしまえば、デフォルメです。



しかしながら、



表現の為の折り紙も、行くところまで行ってしまっています。
これらは「スーパーコンプレックス折り紙」と言われています。
一枚の、正方形の紙を、切ること無く、折るだけで上の様な作品を作るのです。

---ここまで前置き----


私は、こういった折り紙をただ折る行為に大学に入るまでハマってました。我が創作の原点。
そして、最近ふと思い立って、「自由に折り紙出来るソフトウェア」とか出来たら面白のではないか ↑のような折り紙を、コンピュータ上で折れたら楽しいんじゃないか!?
と思い立って、ソフトウェアとしての折り紙を調べるに至ります。


紙を折る
紙を折るというのは、折れ線で区切られた図形の鏡映変換で表現することができます。
図形を折れ線を軸に180度回転させればいいだけです(ほんまか)
今部内で流行りのOpenGLくらいの低レイヤーだと、物体の頂点を変換できる。


手順、大分端折りますが、


先ず、はじめとして頂点が四つの正方形があるとします。これが折り紙。
次に折り線を示すための2つの頂点ABを設定します。
自分は、ここでは手動でポイントを打っておきました・・・。
origmai1
ここで、線分ABが、正方形の淵と衝突(交わっている)か否かの判定を行います。
ここで、二こ以上の偶数点交わっていたら紙を折れます。(恐らくです。)間違いなのにさっき気付きました。AかBが折る対象の中に入ってたら折れない、で良いと思います。プログラムを直さねば、、
線分と線分の衝突判定については、マルペケつくろーどっとコムにお世話になりました。
origmai2
さて、衝突した二点を5,6として頂点データに追加します。ここで問題が出ます。
OpenGLで自分は「三角形の集合体」として物体を描画しています。つまりどんな多角形も、立体も、(描画関数の第一引数がGL_TRIANGLESなら)三角形の集合体を描画することで画面に出力しています。頂点を追加すると変になりそうですね。新たに三角形で敷き詰めるような頂点データの並び方にしなければなりません。インデックスバッファへの格納です。
つまり、多角形を三角形に分割する行為が必要です。上の図のように。

「多角形 三角形 分割」でGoogle大先生に教えを乞うと大量に情報が出てきました。尊い・・・。
自分はこのサイトを参考にしました。長くなりそうなので、簡単に紹介すると、
(1)適当な点(原点)から一番遠い頂点を選びます。
(2)その両隣の頂点で三角形を作ります。
(3)その三角形内に多角形の頂点がなければOK、(5)に行きます。なければ(4)へ
(4)隣の頂点に移行して、その両隣の頂点で三角形を作って(3)へ
(5)その三角形を記録して、多角形からその三角形を削除します。
(6)新たな多角形ができるので、上記を繰り返します。
(7)残り三角形になったら終了です。
上記URLは図があって分かりやすいです。参照推奨。

これを上の図でいうと、頂点4 5 6と頂点1 2 3 5 6の二つの図形で行って三角形に分割します。(折り曲げた時に不備の無いようにするためです。)
多角形内に点があるかの判定はマルペケつくろーどっとコムを参照しました。
これで折る準備が出来ます。
origmai3
どちらの面を折るか、と言う判定は、どちらでも良いとは思いますが、
ここではABと頂点(ここでは5,6以外)の距離を測って一番短い頂点がある方を折る、ということにしました。線と点の距離についてはマルペケつくろーどっとコムにお世話になりました。
origmai4
折るべき面の(ここでは5,6以外の)頂点を全てABに対して対称移動させます。
これで180度回ったことになるはずです(;;・;;´;;-;;・;;`;;)


いいだけ、とは言ったものの、
無題

(紙を折るシミュレーションをしている、、のですが、何もわかりませんね、、、)
自分にとってはこの時点で結構キツイです。ここまでが現在の自分の進捗の限度です。

一応紙を折ることは出来ました(?)。折るための二点は、今はかなり適当になっているのですが、多分予め存在する頂点同士を結ぶ形になると思います。しかし、これで全部出来ると言うことは決してありません。折り紙には色々な複雑な操作がありますからね。色々な折り方とか、ありますからね。沈め折りとか、、、。が見えてきた。

実は、こんな事をしなくても、「折り紙の展開図データ」なるものがあれば、最初から頂点が設定され、折るシミュレーションも結構いける、と思うのですが、ここでは展開図はナシです。なぜなら子供が扱うのを目標にしているからです。


展望

・多角形の三角形分割に付いて、何かアルゴリズムがあるようです。分かったら頑張って実装します。
・現実において、折り紙の作品には二次元で完結しているものも多いですが、大半は立体に見えていると思います。折り紙は三次元でやりたい。
ところが、↑のシミュレーションだけでは、二次元から脱出することが出来ないですね、、、。
イカに脱出するかを考えると、


紙を折る角度を付けられるようにする。
 頑張れば、出来そうです。次の実装の挑戦です。時間があれば。

紙が重なっているさまを表現する。
 折った面と、それに密着する面同士が微妙に離れる様にすれば良いのでしょうか。闇っぽいです。
 調べていたら、論文が出てきたのですが・・・。
紙が曲がっているさまを表現する。
 


想像以上に難しい様です。
ですが、子供にも扱えるような、(いわばgoogle sketchupのような)、簡単なソフトに出来るようにしたい。これからゲーム製作の傍らで、密かに頑張ります。




折り紙の展開図については、下の引用元のページに興味深いことが書いてあるので、参照してみると良いと思います。


引用元
折り紙研究ノート(三谷純)
ある折紙創作家の頁
任意多角形の三角形分割
マルペケつくろーどっとコム  ←本当に尊いサイトだと思います。

(*)紙飛行機馬鹿になりません。凄いんですよ!