マンデルブロ集合を鑑賞するツールを作成した
先日動画を公開しました。
マンデルブロ集合を鑑賞するツールを作成しました。
Unity や three.jsなどは使わずに、ゲームエンジン部分も自作です。
よかったら上記の動画も確認してみてください。
また、Web上で公開しておりますので触ってみてください。
WebGL2 と Web Worker が動く環境で試してください。
http://shogonir.jp/mandelbrot-map/
このブログでは、開発日記を紹介したいと思います。
開発日記
開発期間は約2.3ヶ月間でした。
2019年12月23日にベースプロジェクトを作成しました。
2020年1月30日にWeb上で公開しました。
2019年12月24日
マンデルブロ集合を2次元の画像で描画しました。
マンデルブロ集合描画できた!たのしい! #マンデルブロ集合 #mandelbrot pic.twitter.com/noFgtsrTHp
— shogonir (@shogonir) 2019年12月23日
2019年12月27日
描画ロジックを改善して、白黒からグレースケールに変更しました。
各ピクセルの色を、白か黒の2値じゃなくて、発散の速さでグレースケールにした。あと、マンデルブロ集合の元が原点を中心に半径2の間にのみ存在すると知ったので、その範囲だけを描画した。 #マンデルブロ集合 #mandelbrotset pic.twitter.com/rtkc80P63L
— shogonir (@shogonir) 2019年12月26日
2020年1月6日
UnityのGameObjectのような設計で、正方形を描画しました。
少しバグはありますが、オブジェクトをQuaternionで回転させました。
#WebGL2 でUnityっぽい設計で動くところまで持って行った。面白くなってきた。 #webgl pic.twitter.com/E5p4LxxN2g
— shogonir (@shogonir) 2020年1月5日
2020年1月9日
マウスのドラッグアンドドロップで移動できるように実装しました。
複数のGameObjectを描画できるようになったのもこの日です。
グリングリン操作できるようになってきた。画面の端にある赤い正方形も綺麗に実装できた。赤い正方形は視界の端からレイキャストして操作対象の平面とぶつかった場所に配置されている。 #webgl #webgl2 pic.twitter.com/JUFGeg2Q8I
— shogonir (@shogonir) 2020年1月8日
2020年1月10日
画面内に見えているx軸方向の広がりを計算できるようになりました。
辺の長さが2の青の正方形が、視界をx軸方向に埋め尽くすようになっています。
赤の点線の視界を満たすような青い帯の実装ができた。3D回転操作されてもちゃんと必要な分のタイルを敷き詰められてて賢い。ありがとう数学。 #webgl #webgl2 pic.twitter.com/O4E7rI0XNZ
— shogonir (@shogonir) 2020年1月9日
2020年1月15日
視野の端に赤い正方形を配置することに成功しました。
また、視野の端にある青い正方形だけ、緑になるようにしています。
視界の端の赤い点が重なるタイルを判定して描画できた。3D回転にもちゃんと対応できている。あとはこのタイル達に囲まれたタイルも描画できるようになれば、視界周りはかなり良い感じになる。 #webgl #webgl2 pic.twitter.com/ba19ODSKdm
— shogonir (@shogonir) 2020年1月14日
2020年1月16日
視野の中にあるタイルを全て描画するように変更。
まだマンデルブロ集合の描画はしておらず、タイルは一律緑にしています。
視界を赤い点線で描画し、その視界内の全てのタイルを描画することに成功した。多分同じタイルを2回も3回も描画してる気もするけどそれは秘密。きてますねこれは。 #webgl #webgl2 pic.twitter.com/3oZVRIEQn9
— shogonir (@shogonir) 2020年1月15日
2020年1月21日
マンデルブロ集合のテクスチャを反映しました。
この時点ではパフォーマンスが悪く、動作はガクガクです。
一応画像をテクスチャに貼り付けて描画することができた。パフォーマンスがゴミだから、WebWorker + OffscreenCanvas + IndexedDBでなんとかしよう。 #webgl #webgl2 pic.twitter.com/k0kxM7pdPr
— shogonir (@shogonir) 2020年1月20日
テクスチャの描画も少し改善を試みています。
あと、明暗を100段階とかでいままで描画してたけど、10段階にしたら綺麗な模様になった。 pic.twitter.com/SEsB8dZnbG
— shogonir (@shogonir) 2020年1月20日
2020年1月26日
テクスチャを反映する部分をリファクタしました。
まだパフォーマンスの改善はされていません。
描画したテクスチャを描画に反映することに成功した!現状の課題は、パフォーマンスがゴミ(インスタンスの使い回しが全然できてない)なのと、テクスチャを無限に作っちゃう実装になっていることかな。 #webgl #webgl2 pic.twitter.com/tO9PthOY0j
— shogonir (@shogonir) 2020年1月25日
2020年1月27日
ラスタライズしたテクスチャをプールするようにしました。
少しだけパフォーマンスは少し改善されました。
うーん、これでもかなりパフォーマンスましになった。特にテクスチャ作りきったあとはガクガクしにくくはなった。あとは原因なんだろうなー。 #webgl #webgl2 pic.twitter.com/nrDOZxsu10
— shogonir (@shogonir) 2020年1月26日
だいぶ動くようになってきたので、自分でも鑑賞して、
気に入った景色があったのでスクショを何枚か残しています。
いくつかスクショを載せておこう。 #マンデルブロ集合 ( #mandelbrotset ) っていうシンプルな定義でこんなにも色々な綺麗が画像が見られる。やっぱり数学ってなんかすごい。 pic.twitter.com/0IxT83U7E6
— shogonir (@shogonir) 2020年1月26日
これぞフラクタルって映像が撮れたー!楽しい!!着色のアルゴリズムを考え直せばもっとズームしても綺麗に見えるはず。 #マンデルブロ集合 #mandelbrotset #webgl #webgl2 #fractal pic.twitter.com/IOE7M7ceLA
— shogonir (@shogonir) 2020年1月27日
2020年1月29日
現在の中心座標とズームレベルを画面の下に表示するようにしました。
どこでスクショを撮ったか分かるようにした。画像のしたに中心の座標と、拡大率のようなものが表示されている。 pic.twitter.com/KfWej6b1op
— shogonir (@shogonir) 2020年1月28日
また絶景を見つけてスクショをとっています。
— shogonir (@shogonir) 2020年1月28日
2020年1月30日
不具合の修正を一気に行いました。
* タイルの境界に線がチラつく問題を修正
* パフォーマンスチューニング
* x方向に世界がループする
めちゃくちゃ良い感じになってきた。細かい修正を結構いれた。
— shogonir (@shogonir) 2020年1月29日
・パフォーマンスチューニング
・x方向に世界がループする
・タイルの境界に線がチラつく問題を修正#webgl #webgl2 #マンデルブロ集合 #mandelbrotset pic.twitter.com/9eEO9Pt3UA
Web上にあげて公開しました。
10リツイート、20ライクいただけて嬉しかった思い出。
もう公開していいレベルになったので公開します。
— shogonir (@shogonir) 2020年1月29日
ブラウザで動くマンデルブロ集合のビューアです。
Macのトラックパッド推奨ですがマウスで操作できますので、心ゆくまでマンデルブロ集合を観賞してみてください。#webgl #webgl2 #mandelbrotset #マンデルブロ集合https://t.co/HMwAdnHGKJ pic.twitter.com/CXxZZJXm8a
2020年1月31日
HTML, CSSを整えてデザインを整えました。
12リツイートもされて、嬉しくなって調子にのり、レイアウトを整えて宣伝リンクも追加した。https://t.co/LkmFZobVkI#webgl #webgl2 #webworker #typescript #マンデルブロ集合 #mandelbrotset pic.twitter.com/Cq9IHhteZl
— shogonir (@shogonir) 2020年1月30日
2020年2月1日
画面の中央のテクスチャから優先して描画するよう修正しました。
パフォーマンスは変わりませんが、体感では速く描画できるようになりました。
今日は描画するタイルの優先度を調整した。画面の中央に近いタイルから描画するようにした。あと、地味にバグだった、ループした世界の境界で隣の世界のタイルが描画対象にならない問題も解消した。https://t.co/LkmFZobVkI#マンデルブロ集合 #mandelbrotset #webgl #webgl2 #TypeScript pic.twitter.com/7D9PCF87NB
— shogonir (@shogonir) 2020年1月31日
2020年2月10日
四元数 (Quaternion) のクラスにバグがあったので改修しました。
特定の角度に回転するとオブジェクトが平面に潰れる不具合でした。
四元数を行列に変換するメソッドに間違いがありました。
今日は自作四元数クラスのバグを直した。今は動画の通り、カラフルな円錐が良い感じに回転しているけれど、直す前は特定の角度で形状が平面になるなどのバグがあった。あとは法線ベクトルの勉強でもしようかな。 #webgl #webgl2 #quaternion pic.twitter.com/XbOgbcUnkK
— shogonir (@shogonir) 2020年2月9日
振り返って
以上が開発日記でした。
今までUnityとかがどのように実装されているのか全くわかりませんでした。
しかし今回のゲームエンジン部分を実装してみて、少しだけわかるようになりました。
結局は行列で空間を写像で飛ばして、デバイス正規座標にしているんだなと思いました。
いまは画像をテクスチャに描画するか、頂点に色を持たせるぐらいしかできないので、
もっと高度なゲームエンジンの機能を実装できるのか気になります。
引き続きグラフィックについては勉強していきたいです。
読んでいただきありがとうございました。