肩代わり相互サスに学ぶ最新の接続学
第一回Besiege学会で話す内容を、肩代わり相互サスを前面に出しつつまとめたもの。
5分じゃ無理よなぁ…
初心者のよくやる相互サス、これをちゃんと使えるようにブロックを足したものを肩代わり相互サスと呼ぶ(ようにしたい)のだが、実はこれは最近進んだ接続学の内容をふんだんに含む、想像より複雑なものであることが判明した。
折角なので、逆にこれを題材に、最新の接続学について説明したい。ただしまだまだ未解明な部分も多いので、この内容には間違いが含まれるかもしれないことに留意してほしい。←概ね一定の結論が出たのでそれを記す( 2023/11/27)
※追記:一部ブロックの座標優先は謎です。詳細は調べきれてないですが基本的に逆側(本来優先されない側)が優先されるようです。
座標優先が崩れるブロック:
ロープ・距離計・スプリング:座標優先が反転する。内側優先の状況を作ると外側に接続する(内側逆優先)
ユニバーサルジョイント:一番の曲者。ただ内側逆優先はありそう。
スライダー:伸ばす/伸ばさないで挙動が変わる程度には曲者。
/icons/hr.icon
肩代わり相互サスとは?
根本接続は、頭接続と違って相互に繋ぐことはできない。この時、機構系根本と通常根本の判定が重なっている場合は機構系優先の法則が働くが、そうでない場合は設置順によって片方が無効化される。これを本記事では根本相互時の無効化と呼ぶことにする。
下図を見てほしい。左図のようにサスを相互に接続しても、片方のサス根本は無効化されてしまい、右図と何ら変わらなくなってしまう。
これが初心者のよくやるミスの1つ、相互サスなのだが、この無効化されたサス根本を使う方法がある。
https://scrapbox.io/files/645c6f933ede22001cf37743.pnghttps://scrapbox.io/files/645c710ab01c1a001b0b83e8.png
その方法とは、別のブロックに無効化されたサス根本を付けることである。
根本相互時の無効化は、あくまで当事者の2ブロック間の話なので、下のように、無効化されたサス根本が付くようにウッドポールを埋め込めば、疑似的に相互サスを作ることができる。これが肩代わり相互サスである。
https://scrapbox.io/files/645c72719ae490001c6e4ffa.png
/icons/hr.icon
設置順と接続順
根本相互時の無効化が起きた際、優先される根本接続は、先に設置したブロックの根本である。これは恐らく、接続の処理が設置された順番に行われる、つまり設置順=接続順だからと考えられる。
ちなみにこの設置順は、ブロック削除&元に戻す(undo)を行っても新しく設置されたものと見なされるので、設置順や接続順はこれで調整することができる。
従って、肩代わり相互サスを作る際には、下図のサス根本を無効化された側にするために、削除&undoしておくと安定する。
https://scrapbox.io/files/645c79d43154fd001b54274f.png
以後、接続の処理は原則設置順に行われるものとする。
これは、座標優先が設置順より高位に働くためである。この埋め込まれたウッドポールとサスでなぜビルドゾーンの向きによる変化が回避できるか、それが最近判明した座標優先の実態である。
/icons/hr.icon
座標優先の実態
従来、ある接続判定(根本とか頭とか)の範囲内に複数のブロックの被接続判定(水色や緑)がある場合の優先度は、
①x座標の大きい方
②設置順
と考えられてきた。そして、この座標は、大抵根本接続の位置に等しく(結論にほぼ無関係なので深くは調べてない)、①を座標優先と呼ぶ、というのが従来の説明である。
しかし、下の画像を見てほしい。
https://scrapbox.io/files/645c84879a6f1c001b49b261.pnghttps://scrapbox.io/files/645c848be6c3ab001c2f0bbd.png
1枚目ではヒンジ根本はサスに付いているのだが、2枚目ではポールに付いている。
この2枚の差は、サスをy軸方向に45°傾けただけであり、x座標は特に変えてはいない。
この閾値を探すと、両者の被接続の左端が一致する位置であることが分かる。
https://scrapbox.io/files/645c89d4271fbf001b824cfd.png
これは、この座標優先にバウンディングボックスが関わるからと考えられる。
バウンディングボックス(軸平行境界ボックス)とは、コライダーをグローバル軸に沿って包み込んだ直方体のことである。
https://scrapbox.io/files/645c9bc2c8f7cb001b2904ae.png
図を見た方が分かりやすいだろうか。上図のように、グローバル軸に平行に置かれた直方体が、ウイングの紫コライダーを包み込んでいる。また、コアブロックの方は、元々グローバル軸に平行に置かれているため、バウンディングボックス=コライダーになっている。ちなみにこれの表示にはShowBoundingBoxMODを利用している。 では、先程の例をバウンディングボックスをオンにしてやってみると、
https://scrapbox.io/files/645c9ee5ea6300001b32d4ad.pnghttps://scrapbox.io/files/645c9ee80ba046001c6c269a.png
このようになる。もしバウンディングボックスが接続に関わっているとすれば、この現象を説明するのは容易くなるのだ。
他にもバウンディングボックスが接続に関わっていることが推察される実験結果は多数存在するが、めんどくなったのでここでは割愛する。
結論として、本当の座標優先は、このようなものであると考えられる。
ある接続判定が複数の被接続判定に重なっている場合、その中で最もバウンディングボックスの左側(x座標が小さい方)の面(仮に接続面と呼ぶ)のx座標が大きい方が優先される
緑色(Add Point)の場合はこのMODでは表示されないが、恐らく同様である。
/icons/hr.icon
内側優先の法則
下図のように、上から見たときにバウンディングボックスA(木製ポール)がバウンディングボックスB(コアブロック)の内側にある場合、接続面は内側の方、バウンディングボックスAが右側にあるため、こちらに座標優先が働く。
https://scrapbox.io/files/645ca7243ede22001cf99636.pnghttps://scrapbox.io/files/645ca72752c377001b27c6c7.png
そしてこのように、上から見たときに被接続コライダーが一切はみ出ていない場合、機体の方向に関わらず、バウンディングボックスもはみ出ることはなく、従って接続面は常に内側の方が右側になる。
https://scrapbox.io/files/645ca8fb33d5f1001b59914d.mp4
この2つにより、上から見たときにブロックAがブロックBの内側から一切はみ出さない場合、座標優先は常にブロックAに働く、という法則が生まれる。これを内側優先の法則と呼ぶ(ようにしたい)。
最初の肩代わり相互サスが向きにかかわらず成立すると言ったのは、この法則によるものである。
/icons/hr.icon
複数の被接続を持つ場合の座標優先
https://scrapbox.io/files/645ca3025162fc001bc8bc3e.png
丸太やウイングパネルは、複数の被接続判定を持つ。上図のように、傾けた丸太のバウンディングボックスは3個存在するし、ウイングパネルは複数の被接続判定(緑色の面)を持つ。このようなブロックに関しての座標優先則について見ていこう。
https://scrapbox.io/files/656157b09a04dc001c9ff1ea.pnghttps://scrapbox.io/files/656157b7907d64001c554d8b.png
上図は、ヒンジ根本が丸太とバラストの両方に接続し得る状態であり、左右の差はヒンジのスケーリング値のみで、丸太、バラスト、ヒンジの座標は一切変えていない。なお、座標優先は右側になるようになっており、その確認のために左側にバラスト2個とヒンジが置かれている。
この場合の結果は下のようになる。
https://scrapbox.io/files/656158c89a04dc001c9fff96.png
左側(下側)のヒンジ根本はバラストに接続し、右側(上側)のヒンジ根本は丸太に接続している。
なお、スケーリング自体によって接続の法則が変化することはないため、スケーリング自体は原因ではないことを確認する。
左右(下と上)の違いは、ヒンジ根本が丸太の一番右の被接続判定と重なっているかである。
https://scrapbox.io/files/65615a235628b8001ba87c19.pnghttps://scrapbox.io/files/65615a2a0ae505001cb68f75.png
上図のように、左側(スケーリング前、バラストに接続)はヒンジ根本が丸太の中央のコライダーとしか重なっていないが、右側(スケーリング後、丸太に接続)はヒンジ根本が丸太の右側のコライダーとも重なっている。
ここから推測される法則は、以下のものである。
各ブロックが複数の被接続判定を持つ場合、判断対象の接続判定(接続先を特定したいもの、上図で言うヒンジ根本)との重なりを持つ被接続判定、つまり接続し得る被接続判定のうち接続面が最も右側にあるものを持つブロックに接続される」
これは、座標優先の判定がブロックごとではなく被接続判定ごとに行われると解釈すれば合点がいく。
/icons/hr.icon
またぎ優先の法則
https://scrapbox.io/files/65615e15dfd428001ce386ca.pnghttps://scrapbox.io/files/65615ef5907d64001c558201.png
上図のように、ブロックA(バラスト)とブロックB(木製ポール)において、
・ブロックAの被接続及び判断対象の接続判定(ヒンジ根本)が、ブロックBの2つ(以上)の被接続の両方と重なりを持つ(またいでいる)
・ブロックBのまたがれている2つ(以上)の被接続の接続面が一致する時(180°回転で2つ存在)、その接続面がブロックAの接続面より右側(座標優先が働く方)にある
の2つの条件が満たされる場合、ビルドゾーンの向きにかかわらず、対象の接続先はブロックB(木製ポール)となる。
これを、またぎ優先の法則と呼ぶ(ようにしたい)。
実際に、上の実験結果は下図のようになる。ヒンジ根本とバラスト根本が同じ場所を指しているため、ヒンジ根本は木製ポールに付いている。
https://scrapbox.io/files/65615e1d8ceeb0001c22b1a8.png
2つ目の条件は、局所的な内側優先を意味する。
この条件下でこの系を回しても、ブロックBのx軸が右側にある被接続の接続面が、常にブロックAの被接続の接続面よりも右側に来るため、接続先は常にブロックBとなる。
またぎ優先を利用した肩代わり相互サス
このまたぎ優先を利用することで、内側優先を使わない肩代わり相互サスを作ることができる。
下図がそれで、これもサスの設置順及びビルドゾーンの向きにかかわらず成立する。
https://scrapbox.io/files/6561636136924c001c59592c.pnghttps://scrapbox.io/files/656163694b110c001b03d165.png
下図はこのうちの1個を拡大したものである。オレンジ色のサス根本が2本しっかり映っている。
https://scrapbox.io/files/656163d4a7e84d001c0f6eee.png
/icons/hr.icon
座標優先・機構系優先・設置順の処理順
最後に、座標優先、機構系優先、設置順の処理の順番について見ていこう。結論から言うと、
座標優先による接続先の決定→機構系優先による根本消失→設置順による接続順の決定
の順に処理が行われるようである。
機構系優先と設置順の処理順
https://scrapbox.io/files/656146fac2c007001cbabfd4.pnghttps://scrapbox.io/files/656146fe017f33001ca6305c.png
ブロックA(スライダー):機構系根本持ち
ブロックB(木製ポール):通常根本持ち(ヒンジ、タイマー等を除く)とする。
ブロックA、B相互の根本が相手に付き得る状態の時、ブロックAの機構系根本とブロックBの通常根本が少しでも重なるならば、通常根本は接続順にかかわらず消失する、というのが機構系根本の定義となる。
まあそもそも、もし接続順が優先だったらこの処理いらんよなってお話。
座標優先と機構系優先の処理順
この辺の議論を本気でやろうとすれば、
・機構系優先は座標優先のように接続先の指定を行う部分と根本を消す部分で処理が分かれるのか
・一度接続処理が行われたものを取り消すことはできるのか
などについて考えなければならないのだが、結果から、機構系優先=重なった場合の根本判定の消去と見なしても矛盾はなさそうである。
https://scrapbox.io/files/6561494ef643c9001b43e976.pnghttps://scrapbox.io/files/65614953e97185001c286546.png
上図において、木製ポールの通常根本とスライダーの機構系根本の判定は若干重なっている。また、目安を置き忘れたが、座標優先は右側に働くような向きから観測している。
図のように、この場合、ポール根本がバラストに接続している。
もし機構系優先が先に働くのであれば、木製ポール根本は消失してしまうため、座標優先は機構系優先より先に処理される、ということが分かる。
座標優先と設置順の処理順
プログラムの実行順を考えれば必要無いと思われるが、一応調べてみる。
https://scrapbox.io/files/65614fcb976d62001b3e6fd1.pnghttps://scrapbox.io/files/65614fd00b71d1001ce9c85b.png
上図において、ヒンジ根本はバラストと木製ポールどちらにも接続し得る状態になっている。また例によって、座標優先は右側に働くような向きから観測している。
ヒンジ、木製ポールの設置順を変えても同じ結果となったため、座標優先は設置順より先に処理される、ということが確認できる。
内側優先、またぎ優先を使わない場合の肩代わり相互サス
座標優先の処理順が最初であることから、内側優先、またぎ優先を使わない肩代わり相互サスのマルチでの運用は不可能と思われる。たまたまできたとしても、45°刻みで回していけば恐らくどこかでダメになるはずである。