Metaのロゴによく似た錯視をMATLABで書いてみた

# 前段のポエム
最近Facebookの会社名がMetaに変わりましたよね。

![Facebook-meta-logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331637/93f0a0e6-f861-965b-ae46-c38bf8067e8b.png)

それによって
### これからはGAFAじゃなくてGAMA？
### いやいやFAANG→MANGAだよ
という議論が世界中で積算すると何十万回されたのではないでしょうか。

一方僕はこのロゴをみてこう思いました。

### これ Dual Axis Illusionじゃね？

# Dual Axis Illusionって何よ
錯視界では超有名な錯視です。
毎年下記のWebページでその年の最優秀錯視コンテンストが行われているのですが、Dual Axis Illusionは2019年の最優秀錯視です。

似てはいますが厳密にはちょっと違いますね。
でもなんだか掴みどころがないような不思議な雰囲気は似てますよね（こじつけ）

http://illusionoftheyear.com/2019/12/dual-axis-illusion/

https://youtu.be/HC0GGkNZPgs

# MATLABでこれ書けないか？

まぁもちろん書けました。
![DualAxisIllusion.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331637/d31a9ac0-d755-cef3-fa40-208ec2b61cfa.gif)

# 解説
この錯視には6つ交点があります。
水平移動しているように見える３つの交点、垂直移動しているように見える4つの交点があり、その交点の動きに注目するとそれにつられれて図形全体の動きが変わっているように見えます。すごいですよね。さすがIlusion of the year です。
面白いのはDual Axis の名前の通り、Verticalの回転にみえたりHorizontalの回転に見えたり、はたまた各Axisで回転方向が変わったようにみえるのがすごいです。

しかしなぜ色々見え方が変わるんでしょうか。自分なりに考えてみました。

## 奥行きの認知について

人間は必ずしも両眼の視差だけで奥行きを認知してるわけではないです。
ある程度は単眼でも奥行きを認知できます。

https://uxdaystokyo.com/articles/glossary/depth-perception/

今回の錯視は単純な線図だが3次元的な形状をもつオブジェクトにも見えなくもないです。
おそらく線の交点がいわゆる遠近法の収束点のように見えて奥行きを感じるのではと思います。

一方で線遠近法は逆の効果、すなわち手前に見えるような効果も持っています。
これもその道のプロが逆遠近法についての事例を報告しています。

**投影法の混在を考慮した逆遠近法 - 情報学広場**

https://ipsj.ixsq.nii.ac.jp/ej/index.php?action=pages_view_main&active_action=repository_action_common_download&item_id=10746&item_no=1&attribute_id=1&file_no=1&page_id=13&block_id=8


**錯視といえば立命館大学の北岡先生**

http://www.psy.ritsumei.ac.jp/~akitaoka/reverspective.html

**超有名なThinky the Dragon**

https://www.youtube.com/watch?v=ah8xPlHJZTs

コレは素人の勘ですが、おそらくこの奥行きを感じさせる交点を凸と認知するか凹と認知するかによって
まずこの錯視の見え方が違ってくると思います。
加えて各交点がスムーズに移動して重なるような動きをしています。
重なってしまうと完全に情報が統合され　どっちが凹でどっちが凸なのか判別不能になります。つまり、逆遠近法と遠近法が入れ替わるとでもいいましょうか。

その瞬間、いままで凸だと認識していた交点が凹に切り替わってしまうと、三次元オブジェクトの表と裏がぐるっと反転して認知されてしまうので
回転方向が変わったように見えるんだと思います。

この錯視は回転という運動認知の観点も含むのでオプティカルフローについての議論を含めると現象をよく理解できるかもしれません。

球が観察者視点からみて左方向に回転しているとき、表面のオプティカルフローは左に動き、裏面のオプティカルフローは右に動いているので、
仮に、遠近法と逆遠近法が入れ替わることで、オブジェクトの表と裏が入れ替わって見えてしまうと逆回転に見えるというのは筋が通りそうな気がします。

**Wikipedia　Optic Flow（英語のWikipediaかなり詳しいですね）**

https://en.wikipedia.org/wiki/Optical_flow

**MathWorksのOptical-Flowに関するページ**

https://jp.mathworks.com/discovery/optical-flow.html

この辺、錯視の専門家と議論してみたいものです。

## それを応用したら何ができるか

このような錯視の研究は、人間の脳が引き起こすエラーです。
一方でソフトウェアエンジニアの皆さんは日々コードを書いて、コンパイラが吐き出すエラーを見ながらバグを推測するなんてことを日常的に行っていると思います。
皆さん、錯視を**人間が吐き出すバグ**と捉えると、どういうパターンでバグが発生するかを解析することで、人間の認知や脳の仕組みについて明らかにできると思いませんか？

そのようなことを狙った学問が認知心理学だと思ってます。ちゃんと学会等でこのような錯視をもとにメカニズム解明を目的とした研究が多数あります。
逆遠近法を用いた錯覚の知覚条件の検証 (バーチャルリアリティ学会)

http://conference.vrsj.org/ac2018/program2018/pdf/11B-5.pdf


ここらへんメカニズムの解明が進むと、自動車のADAS/AD（先進運転支援システム/自動運転)にも応用されるかもしれません。
例えばこちらのモービルアイにも単眼で距離を認識できる理由として遠近法にも触れた説明がされています。

https://www.imobile.bz/product/technology

>(上記Webページから引用)
>●カメラ１台でどうして車間距離が分かるのですか？ ステレオカメラでなくても良い理由が分かりません。
>
>両目で見るから距離が分かるというのは錯覚です。両目で立体で見えるのは視差（パララックス）による感覚です。両目の間隔は6cm程度ですから、数メートル以上の距離では距離の違いが分からなくなります。（昔の戦艦大和で使われていた測距儀は15.5m離した2>台の望遠レンズで三角測量して10km以上先の敵艦までの距離を測っていました。）
>
>ではカメラ１台でどうして車間距離が分かるのでしょうか。
>
>道路の幅や車線は無限遠の地平線で一点（消点）に収束するという遠近法の原理を利用します。
>
>前方のクルマのタイヤが地面に接する位置は、近くになるにつれて無限遠の1点（消点）より下にずれて見えます。消点からどれだけ下にずれるかをカメラのCMOSセンサーで常時観測しているので距離が刻々と分かるという訳です。
>
>この方法で80～90m程度の前方車両までの距離測定がリアルタイムに可能になります。

https://youtu.be/h5mQxI3CJqA

しかし、人間はADAS/ADが使う認知システムなんかと比べると遥かにコンパクトで、
しかも両眼・単眼両方の奥行きを認知アルゴリズムを駆使し、状況によって適切な認知方法を使い分けるというのをリアルタイムで処理していて、しかもイメージプロセッサやGPU、パワーサプライユニットなんかが発生させるほど処理における熱を発生させないなんて　本当にすごいですよね。

完全に人間と同じような認知ができるシステムはまだまだ難しいのではないかと思います。

# このコード読みたい？

さて、この錯視スクリプト書いてたのですが当初はYoutubeの動画見ながら「これはリサージュ図形ににてるからX,Y軸で見ると正弦波波形に見えるな」などと考えてごちゃごちゃ書いていたのです。これを見てると周波数差が3対2のとき、X、Yの位相差を少しずつずらして書いていけばなんとなくそれっぽくなりそうだと思いました。

https://www.ne.jp/asahi/tokyo/nkgw/www_2/gakusyu/rikigaku/Lissajous/Lissajous.html

そんなことしてると、なんとこの錯視の作者さんがjavascriptでこの錯視を記述するコードを公開していたのを見つけました！
こっちを見とけばよかった！

https://github.com/KilledByAPixel/Dual-Axis-Illusion

最終的にはこのコードを参考によりわかりやすくコメントを含めてMATLABコードにしてみました。
元々の作者さんがGPLv2で公開していたので私もGPLv2でGitHubにアップロードしました。

https://github.com/griffin921/dual-axis-illusion

https://youtu.be/1QhhGNl-_GM

よろしければ色々いじって試してみてください。

以上です！ありがとうございました！