週報2022/04/17

04/17

04/18

04/19

04/20

  • お仕事
  • 簡単な模写を一枚
    絵と音楽の練習は継続しないと駄目だろうし、生活の中に組み込みたいがなかなか難しい
  • 疲れたので別の本を読むー>装飾パターンの法則 藤田伸

04/21

04/22

  • お仕事

04/23

  • ワクチン接種
  • 通院
  • 調べ事

週報2022/04/10

4/10

  • Schottky Linkにglide reflectionを実装するもテクスチャ周りのバグによって失敗。
    レンダリング結果を保持するテクスチャがOrbit Seedのテクスチャになってしまうバグがある。 SchottkyLinkに関しては時間があるときに丸々作り直したい。
  • インドラの真珠を読み返そうかと思ったがグラフィクス系の実装がやりたくなったので前々から興味のあったフォトンマッピングを勉強してみることにした。
    フォトンマッピング―実写に迫るコンピュータグラフィックス Henrik Wann Jensen (著), 苗村 健 (翻訳)を読む。

4/11

  • お仕事
  • フォトンマッピングを読む
    二章まで。大域照明の基礎.単位など基本的な部分の概略. インドラの真珠も読み返したいが、新しいレンダリング手法を実装したくなった.

4/12

4/13

4/14

4/15

4/16

VPS(Ubuntu20.4)においてMoodle + STACK環境を構築するメモ

研究室の同期に数学ソフトウェアを使った教育について研究している人がいる.今回,MoodleとSTACKというソフトウェアの環境構築を頼まれたので協力した.今後彼が一人で構築できるようにドキュメントを残しておきたい.

環境

さくらのVPS
メモリ:1GB
SSD: 100GB
CPU: 2コア
OS: Ubuntu 20.04 amd64

Moodleのインストール

Moodleは学習管理システム(Learning Management System, LMS)である.
Step-by-step Installation Guide for Ubuntu - MoodleDocs
インストールは基本的には上記のガイドにしたがって進んでいけばよいが,ところどころ引っかかるところがあったので注意点を書いておく.

Step1 Install Ubuntu

VPSにUbuntu20.04をインストールして起動する.さくらVPSのコンソールにおいて,US配列キーボードで:が入力できない不具合がある.そのため,VPSに備え付きのコンソールを使用するならばβ版のシリアルコンソールを使う必要がある.

Step2 Install Apache/MySQL/PHP

Apache/MySQL/PHPをインストールする.この環境をLinux, Apache, MySQL, PHPの頭文字をとってLAMP環境という.それぞれインストールしたらその都度動作確認をしておくとよい.

また,Moodleのドキュメントのコマンドはそのままでは動かない.以下のコマンドでaptにリポジトリを登録してから.各種ソフトをインストールする.

sudo add-apt-repository 'ppa:ondrej/php'
sudo apt-get update
sudo apt install apache2 mysql-client mysql-server php7.4 libapache2-mod-php7.4
Apache

ApacheをインストールしたらブラウザでIPアドレスを入力して動作を確認する.

f:id:soma_arc:20210422150734p:plain
Apacheの動作確認
PHP

PHPをインストールしたら以下のようなファイルをphpinfo.phpとして作成し,/var/www/htmlに保存する.

<?php
phpinfo();
?>

http://IP.Address/phpinfo.phpにアクセスしてApacheと共に使われるPHPのバージョンが意図したものであるかを確認しておく.今回は7.4.16.

f:id:soma_arc:20210422151000p:plain
PHPの動作確認

PHPのバージョンをupdate-alternativeで指定している場合でも異なるバージョンのPHPが使われる場合があるので注意する.
また,PHPのモジュールをインストールした場合などは

sudo service apache2 restart

Apacheの再起動をかけないと反映されない.

MySQLのインストール

今回のMySQLのバージョンは8.0.23-0ubuntu0.20.04.1.mysql_secure_installationによるmysqlのインストールで聞かれる事項はこちらの記事を参考にする.
MySQL 5.7 をインストールしたら最初に行うセットアップ |

Step 3: Install Additional Software

PHP8.x系が使いたければphp7.4-mbstringなどのバージョン番号をphp8.0-mbstringに変更してaptでインストールするとよい.何か足りないモジュールがあれば大抵php7.4-xmlなどのハイフン以下をモジュール名にすれば大抵インストールできる.何かインストールしたらsudo service apache2 restartを忘れずに行なう.

Step 4: Download Moodle

gitによりMoodleをクローンする.今回のインストールでは最も新しいリリースであるMOODLE_311_STABLEを導入した.バージョンは3.11.

sudo git clone git://git.moodle.org/moodle.git
cd moodle
sudo git branch -a
sudo git branch --track MOODLE_311_STABLE origin/MOODLE_311_STABLE
sudo git checkout MOODLE_311_STABLE

Step 5: Copy local repository to /var/www/html/

指示に従うだけ.

Step 6: Setup MySQL Server

/etc/mysql/mysql.conf.d/mysqld.cnfを編集しMySQLの設定をおこなうとある.しかし,mysqld.cnf内にドキュメントに記載された項目がなかったので特に変更しなかった.

Step 7: Complete Setup

http://IP.Address/moodleを開くとmoodleのインストールが始まる.いくつかの項目を入れてインストールしていくと,パーミッションの設定の影響かconfig.phpが生成されなかったと出る.
そこで表示されたコードをコピーし,config.phpを自分で作成する.コードにコメントとして書いてあるが,PHPの閉じタグがないが問題ない.自分で閉じタグをつけてしまうと動かなくなってしまうので注意する.
PHP: PHP タグ - Manual

STACKのインストール

STACKは数学などの自動採点システム.Moodleプラグインとして動作する.バックエンドにMaxima(数式処理システム),gnuplotをもち,これらと通信することで採点などを行う.今回のバージョンは4.3.
Installation instructions. - STACK Docs
こちらもドキュメントの流れに沿って設定していく.

Step0

php-mbstringのインストール.おそらくMoodleの導入時点で入っていると思う.

Step1

MathJaxに関するMoodleの設定を行なう.STACKのドキュメントにあるように,3つの項目をDashboard > Site administration > Plugins > Filters > MathJaxに追加する.

f:id:soma_arc:20210422123337p:plain
Dashboard > Site administration > Plugins > Filters > MathJax

Step 2. Install gnuplot and Maxima

gnuplot
sudo apt install gnuplot

バージョンは5.2.

Maxima

Maximaをインストールする.MaximaCommon Lispで書かれた数式処理システム(Mathematicaのようなシステム)である.

sudo apt install maxima

バージョンは5.36.1.aptでインストールするだけで使えた.

ソースからビルドする場合sbclCommon Lispの処理系の一つ)が必要だが,これもaptでインストールすることができる.詳しくは以下のドキュメントを参照のこと.
Compiling Maxima from source. - STACK Docs

Step 3. Add some additional question behaviours

いくつかのファイルをダウンロードし,Moodleのフォルダ内に配置する.
これはドキュメントの記載の通り,Moodleのルートディレクトリでgit cloneするだけでよい.

git clone https://github.com/maths/moodle-qbehaviour_dfexplicitvaildate.git question/behaviour/dfexplicitvaildate
git clone https://github.com/maths/moodle-qbehaviour_dfcbmexplicitvaildate.git question/behaviour/dfcbmexplicitvaildate
git clone https://github.com/maths/moodle-qbehaviour_adaptivemultipart.git question/behaviour/adaptivemultipart

Step 4. Add the STACK question type

Moodle上でドキュメントに記載のSTACKの設定を行い,Moodleのルートに入って書かれているファイルをgit cloneで落とせばよい.

git clone https://github.com/maths/moodle-qtype_stack.git question/type/stack

Step 5. Post-install confirmation.

Dashboard > Site administration > Plugins > Question Types > STACK
からhealthcheck script(動作確認スクリプト)を動かす.

また,動作確認用の問題データを用意してもらったので,これをMoodle上でインポートするとSTACKがうまく動いているか確認することができる.
https://gist.github.com/soma-arc/727cc4aae272315c2843e16b09591599

今後必要なこと

  • Maximaの最適化による高速化

  Optimising Maxima - STACK Docs

おわり

MoodleとStackに関してはこういった書籍がある.

MoodlePHPのバージョンまわりでうまくいかないことが多いので気を付けたい.

サーバーサイドはあまりわかっていなくて大変だったのだけれどやはり動くものが見れた時は面白い.

追記 - プラグインのインストール

Moodleの管理画面からプラグインを入れることができる。ただし、パーミッションの設定がうまくされていないとインストールすることはできない.
Apacheはwww-dataというグループのwww-dataというユーザでファイルを操作する.www-dataにディレクトリに対する書き込み権限がないとMoodle上でプラグインの追加ができない.
権限の設定は以下の通り

sudo chgrp -R www-data /var/www/html/moodle
sudo chmod g+w -R /var/www/html/moodle
sudo service apache2 restart

(参考 UbuntuのWordPressの更新が上手く行かないときの対応 | 有限工房)
その後、Moodleの管理画面から サイト管理 > プラグイン > プラグインをインストールする を選択し、以下の画面からプラグインを入れる.
f:id:soma_arc:20210830132926p:plain
今回は次のプラグインをインストールする.
Moodle plugins directory: Ordering
プラグインの入ったzipファイルをサイトからダウンロードし、上記の画面からインストールすれば終わり.
プラグインの導入には別の方法もある。次のページを参考のこと.
プラグインをインストールする - MoodleDocs

追記 - Moodleのアップグレード

Moodleを更新した.メジャーアップデートではないので特に躓くところはないはず.
アップグレード - MoodleDocs
こちらを参考に更新を行う.今回の環境はテスト運用であったので、メンテナンスモードにはしなかった.

cd /var/www/html
sudo cp -r moodle moodle.backup
cd moodle
sudo git stash save
sudo git pull
sudo cp ../moodle.backup/config.php ./

一応バックアップを取った後、リポジトリを更新し、config.phpだけバックアップからもってくる.
ブラウザから管理者アカウントでMoodleにアクセスし、サイト管理 > 通知に移動すると自動的に更新が始まる.
何もなければ完了.

三次元フラクタルを3Dプリントする

数学とコンピュータ Advent Calendar 2017 - Qiita
数学とコンピュータアドベントカレンダー23日目の記事です.(30分ほど遅れました.申し訳ありません.)

近年,3Dプリント技術の広まりとともに数学的なオブジェクトを3Dプリントによって造形する活動が広まっています.最近ではVisualizing Mathematics with 3D Printingという本も出ました.三次元フラクタルの3DプリントにはJeremie Brunet氏という先駆者がいます.とてもクオリティの高い作品を数多く公開しており,いつか自分でも試して見たいと思っていました.
www.shapeways.comThe Beauty of Math! These 3D Printed Fractals Will Blow Your Mind | 3DPrint.com | The Voice of 3D Printing / Additive Manufacturing

試行錯誤の結果,最近ようやくそれなりのものを出力できるようになりました.Twitterに投稿したものをまとめたのがこちらになります.
twitter.com


それぞれのオブジェクトの造形には10~20時間ほどの時間がかかりました.これらの3DプリントデータはDMM 3DプリントやShapewaysで公開する予定です.

このフラクタルはQuasi-Fuchsian 3D Fractalと呼ばれるフラクタルです.これに関してはこちらの記事で少しだけ触れました.
自作フラクタルレンダラとシェーダの取り回しについて - 心鏡曼荼羅
この記事ではこれらのフラクタルを3Dプリントするために必要な事項を簡単にまとめます.

モデリング・描画

数学的なオブジェクトをモデリングをするツールは様々にあります.こちらの記事に色々まとまっています.
3Dプリンター用の多彩なデザインの3Dモデルがつくれる計算幾何学アプリが楽しい!
しかし,三次元フラクタルはこういったソフトで計算,出力することは難しいです.多くの三次元フラクタルオブジェクトは,距離関数(Signed Distance Function)で表現されます.距離関数は与えられた点とオブジェクトの表面までの最短距離を返す関数です.たとえば,球の距離関数は次のようになります.

float distSphere(vec3 p){
    return distance(p, centerOfSphere) - r;
}

この関数は与えられた点から球の表面までの距離を返します.また,内側の点に関しては負の値を返します.
距離関数を用いた描画についてはこちらの記事にまとまっています.
全能感UP! GLSLで進めレイマーチング « demoscene.jp

3Dプリントを行うためには,出力したい物体のメッシュデータが必要なので,距離関数で表現されるフラクタルをボリュームデータ(ボクセルデータ)として出力し,これをメッシュ化していくことになります.三次元フラクタルに限らず,距離関数で定義できる(Sphere tracing. ray marhcingで描画できる)形状ならばこれから紹介する方法でメッシュ化してプリントすることができます.先述のJeremie Brunet氏もmandelbulbというソフトウェアで出力したフラクタルのボリュームデータをメッシュ化してプリントしているようです.

メッシュ化

ボクセルデータをメッシュ化する方法,ツールは様々にありますが,今回はParaviewとOpenVDBという二種類の方法を試しました.

ParaViewによるメッシュ化

Paraviewはオープンソースのデータ分析,可視化ソフトウェアです.ボリュームデータを読みこんで可視化,メッシュ化することができます.ボリュームデータはvtkと呼ばれるフォーマットで扱うため,データをこの形式で出力します.

vtkにはレガシーなASCIIフォーマットと,バイナリデータを扱うxmlフォーマットが存在しています.簡単のためにASCIIフォーマットを扱うことにします.vtkファイルに関してはこちらの記事が詳しいです.
ParaViewでVTKレガシーフォーマットを使う その1 - Qiita

フラクタルでない部分とフラクタル内部に分かれた二値のボリュームデータをvtk出力するプログラム例がこちらになります.(ビルドにはnanortが必要です)
Generate vtk file of fractal. · GitHub
テキストファイルなので,格子数によっては巨大ファイルになってしまいますが,一応はフラクタルをボリュームデータにすることができます.

次にParaviewで可視化,メッシュ化してみます.Paraviewを起動し,vtkファイルを投げ込んだらProperties tabからApplyをクリックします.RepresentationのドロップダウンリストからVolumeを選択するとボリュームデータが表示されます.
f:id:soma_arc:20171222124436p:plain

ボリュームデータをメッシュに変換します.画面上部のContourツールボタン(もしくはメニューのFilters -> Common -> Contour)をクリックします.
f:id:soma_arc:20171222124944p:plain
画面左のPipeline BrowserにContourというデータができます.これをクリックし,PropertiesタブのApplyをクリックしてやるとメッシュ化されます.あらかじめデータが二値であればデータの境界をメッシュにしてくれます.もしもデータが二値でないのならば,Isosurfacesパラメータを操作する必要があります.
f:id:soma_arc:20171222125119p:plain
フラクタルのボリュームデータをメッシュに変換することができました.データの保存はContourを選択した状態でFile-> Save Data... からファイル形式を.stlに指定して出力してやります.

変換はそれなりに高速で結果も綺麗です.しかし,データサイズが大きくなりがちなので,別のモデリングソフト等でデータを削減する必要があります.この例で使用したデータは比較的小さいですが,簡単に数百MBのデータになってしまうので注意が必要です.

Paraviewによるメッシュ化は非常に手軽にできるので,お勧めです.しかし,なるべくならレンダラにメッシュデータ生成機能を組み込みたいところです.そこで,次に試したのがOpenVDBです.

OpenVDBによるメッシュ化

OpenVDBはボリュームデータを効率よく扱うことのできるオープンソースライブラリです.ボリュームデータからメッシュを生成するような機能も備えています.
OpenVDBでは距離関数によるデータをメッシュ化することができます.OpenVDBのデータ表現に関する情報は次の記事に詳しく書いてあります.
Level sets with OpenVDB. Quick introduction. Part 1 - K. Lykov Blog
データ生成のコード片を置いておきます.メッシュ化処理の呼び出し等を含んだ実際のプログラムはまだ整理できていないため,後で公開します.
genFractalLevelSet.cpp · GitHub

f:id:soma_arc:20171223213220j:plain
Paraviewと比べて遜色ないメッシュデータを作成することができました.また, ボリュームデータフォーマットのvdbファイルはそれなりに小さいので,Houdiniなどの別のレンダラに持って行ってレンダリングするのも面白いかもしれません.Adaptive meshingやsmooth level setなど,試せていない機能もあるので今後の課題です.

OpenVDBの例は少ないですが,このあたりが参考になるかと思います.

メッシュ削減(Mesh Decimation)

生成したメッシュデータ(.obj or .stl)のサイズが大きい場合はメッシュを削減してやる必要があります.多くのモデリングソフトにこのような機能が搭載されています.だいたい頂点数が100万個あたりになるまで減らしています.自分でプリントする分にはデータサイズが大きめでも問題ありませんが,外部のプリントサービスを利用する場合は制限があるので注意が必要です.例えば,DMM3Dプリントだと,100MBを超えるデータはアップロードすることができません

MeshLabによるメッシュ削減

MeshLabはオープンソースのメッシュ処理ソフトです.Jérémie Brunet氏もMeshLabを使用してメッシュの最適化を行っているようです.しかし,今回は処理に時間がかかりすぎて使用を断念しました.データが悪かったのか,処理のパラメータが悪かったのかはわかりませんが,使いこなせればメッシュのクオリティアップに繋がるかもしれません.
MeshLabを使ったメッシュ削減の方法はshapewaysに記事がありました.
Polygon Reduction with Meshlab - Shapeways

Blenderによるメッシュ削減

Blenderオープンソースモデリングソフトです.ModifierのDecimationでメッシュを減らすことができます.

手順は次のようになります.Blenderでメッシュを読み込んだら,そのメッシュを選択し,ModifierタブからAdd Modifier -> Decimationを選択します.
f:id:soma_arc:20171223221751p:plain
0~1の範囲でメッシュを削減する割合を指定します.一度に大きく減らしすぎると,処理に時間がかかって応答しなくなるので,0.2くらいずつ減らしていくと良いかと思います.三種類処理の手法があるようですが,あまり違いはわかっていません.とりあえずCollapseでよいかと思います.
f:id:soma_arc:20171223221818p:plain
ほどほどの数のメッシュになったらApplyで処理を確定し,File->Exportから修正したデータをエクスポートします.ここまでくると,このデータを3Dプリントすることができます.

ZBrushを用いたメッシュ削減

ZBrushはスカルプトモデリングツールと呼ばれる種類のモデリングツールです.粘土をこねるような形でモデリングを行っていくツールで,大量の頂点を効率よく扱うことができます.有償のソフトですが,メッシュの最適化に関する優れた機能をもっています.Blenderでも機能的には十分ですが,やはり時間がかかるのと,後述するUV展開はうまく行えなかったので,ZBrushを使ってみました.ZBrushはなかなかクセのあるソフトですので,作業の流れを紹介するだけにとどめておきます.

ZBrushではDecimation MasterとDynameshという機能を使います.Decimation Masterを使うことで,メッシュの細部を保ったまま,高速にメッシュを減らす事ができます.もしも処理の途中でエラーが発生したらDynameshを使って,メッシュ全体を均一なメッシュに直します.
このあたりの手順はこちらの記事にまとまっています.
デジタル造形の時代〜基本的なワークフローについてわかりやすく解説〜 | 特集 | CGWORLD.jp

ZBrushにも3Dプリント用にデータをエクスポートする機能がついているので,削減した後はデータを出力してプリントできます.

テクスチャデータ生成の試み

ここまでで,3Dプリントデータ生成を見てきました.生成したデータは家庭用(?)の3Dプリンタでプリントする他に3Dプリントサービスを利用してプリントしてもらうことも出来ます.3Dプリントサービスで提供されているプリント素材にはフルカラーのものも存在しています.DMM3Dプリントではフルカラー石膏とフルカラープラスチックという素材を提供しています.カラーリングもフラクタルの見た目において,重要な要素です.フルカラーの3Dプリントデータの作成にも挑戦してみました.

DMM3Dプリントのカラープリントはモデルデータ(.obj)に紐ついた.mtlとテクスチャデータが必要です.そのため,メッシュデータにUV座標をつけ,テクスチャデータを用意する必要があります.

UV展開

まず,三次元空間上の頂点をテクスチャ平面の座標にマッピングする作業である,UV展開を行う必要があります.当初Blenderで試したのですが,メッシュが複雑でデータが大きいためか,うまく行きませんでした.色々試してみましたが,最終的にZBrushで成功しました.

ZBrushではUVMasterという機能でUV展開を行う事ができます.
【UnityAction & ZBrush】UV Masterを使ってみる。: Karasuのアプリ奮闘記
UV展開前のDecimation Masterによるメッシュ削減処理は,UV展開に不適切なメッシュを生成してしまうようです.そのため,Decimation Masterでメッシュをある程度削減した後にZRemesherという機能を使います.ZRemesherを使用すると,UV展開に適した綺麗なポリゴンに変換することができます.

リメッシュ周りの資料です.

テクスチャの生成

メッシュデータにUV座標をつけることができれば,テクスチャデータを生成することは難しくありません.重心座標(Barycentric Coordinates)を計算することで,UV平面の三角形上の点と空間の三角形上の点を対応付けることができます.

愚直な実装ですが,テクスチャを生成するコードを置いておきます.シェーダを使ってレンダリングすればよりクオリティの高いテクスチャを生成できるので,次の課題です.
3d-printing-tools/GenTex at master · soma-arc/3d-printing-tools · GitHub
生成されたテクスチャとマッピングされたオブジェクトは以下のようになります.
f:id:soma_arc:20171223184905p:plain
UV展開の過程でメッシュを削りすぎてしまいましたが,うまくマッピングできました.すぐに3Dプリントサービスに出したいところですが,このままですと,かなり料金がかかります.この状態で見積もりをとった時は十万円を超えてしまいました.かかる料金を減らすため,もうひと手間必要です.

中空化

何らかの3Dプリントサービスに出す場合は,モデルの中身をくり抜いて中空構造にする,肉抜きを行うと,かかる料金を減らすことができます.
【3Dプリンタ】肉抜きをして制作コストを下げよう! | 初心者魂 今更聞けない使い方
BlenderZBrushでも肉抜きを行うことはできますが,meshmixerというソフトウェアを使えば,ほとんど自動で肉抜きを行う事ができます.meshmixerはautodeskが提供するフリーソフトです.

meshmixerを起動し,メッシュを読み込ませたら,編集->中空を選択することで自動的に内側がくり抜かれます.
f:id:soma_arc:20171223173025p:plain
同時に,素材抜き用の穴も生成されます.プリント素材によって素材抜き用の穴の大きさが異なるので注意が必要です.例えば,DMMで石膏素材をプリントする場合,10mm以上の穴が必要になります.

肉抜きしてエクスポートした.objファイルのメッシュグループはバラバラになってしまうようです.
f:id:soma_arc:20171223173950p:plain
利用するサービスによってはひとつにまとめておく必要があるかもしれません.Blenderでは各グループを選択してCtrl + Jで結合することができます.

最終的にDMMで見積もりを取った結果がこちらです.
f:id:soma_arc:20171223175402j:plain
石膏フルカラーで6.7cm x 7.7cm x 5cmで約一万四千円,フルカラープラスチックなら約二万五千円です.流石にこのクオリティでこの値段はしんどいので,メッシュ削減,UV展開の最適化でクオリティを上げ,肉抜きを工夫して値段を減らそうと考えています.

おわりに

ボリュームデータから3Dプリントデータを作成するためのツール群を簡単にまとめました.ボリュームデータさえ用意出来てしまえば,既存のツールの組み合わせで3Dプリントまで持っていくことが可能ですが,根気が必要です.なるべく少ないツール,手間でプリント用データ生成を行えるスキームを確立したいところです.レンダラでレンダリングしたフラクタルの好きな部分を切り取って手軽に3Dプリント用データを生成できるようにする予定です.

かなりの手間がかかる3Dプリントですが,いくつかの場所でデモをした際には,それなりに良い反応をもらえました.やはり,手で触ることのできる立体があることは,アイデアを伝えるために非常に有用であることがわかりました.何か立体化できるようなコンテンツがある方は挑戦してみてはいかがでしょうか.

自作フラクタルレンダラとシェーダの取り回しについて

WebGL Advent Calendar 2017 - Qiita
WebGL Advent Calendar 2017,19日目の記事です.

WebGLを用いたフラクタルレンダラを開発しています.そのコンセプトと中身を簡単に紹介します.今回紹介するのは二種類です.どちらも開発途上で実験段階ではありますが,それなりに面白い図を得ることが出来ます.

フラクタルレンダラ

どちらもWebGL2を要求します.また,新しめのGPUでないと動かないかもしれません.

SchottkyLink

f:id:soma_arc:20171216175254p:plain
f:id:soma_arc:20171216175713p:plain
円や球を元にしたフラクタルを描画することができます.これらの図はリアルタイムに描画され,生成される図を見ながら図形を配置していくことができます.

例えば,下図,左側の図のように,円を配置すると右図のような模様が描かれます.

三次元の場合も同様に,球を配置することでフラクタルが生成されます.
f:id:soma_arc:20171217164052p:plain

しかし,より複雑な絵を描画するためにはアルゴリズム的に困難な部分がでてきてしまい,現在は開発が止まっています.
高速に描画する話や,これを描画するための数学的な話はこちらの論文や記事に書きました.

Experimental Sphairahedron-based Fractal Renderer

f:id:soma_arc:20171216180453p:plain
最近開発を進めているものです.自由度は少ないですが,非常に面白い形状を描画することができます.画像の上部にある二つのパネルのうち,左側に描画されている赤と緑の球によって削られている立体は球面体と呼ばれる立体です.この立体をベースにして右側のパネルに描画されているフラクタルを生成することが出来ます.画像下部の左から二番目のパネルに描画されている赤い点を操作することで,このフラクタルを変形することが出来ます.

このフラクタルの構成方法は以下の動画をみるとなんとなくわかるかもしれません.
www.youtube.com


残念ながら,このフラクタルの描き方に関する文献はほとんどありません.これから論文等を書いていく予定です.また,より自由度を高いパラメータ化も考える予定です.

コンセプト

フラクタル図形の描画というと,マンデルブロ集合をご存知の方は多いかと思います.フラクタルアート界隈ではマンデルブロ集合のようなフラクタルの計算方法*1を用いて三次元のフラクタル図形を描画する式が開発されています.これらのフラクタルのいくつかはFractal Lab - Interactive WebGL Fractal Explorerレンダリングすることができます.
f:id:soma_arc:20171217183255p:plain
これらのフラクタル形状を自分で描画することは,決まった式があるので,さほど難しくはありません.しかし,その式をうまく改変したり,パラメータを操作して自分の思うような形状を得ることは難しいです.

そこで,開発中のフラクタルレンダラでは円や球,直線,平面といった幾何学形状によって定義される操作を組み合わせることでフラクタル形状を生成するアプローチをとっています.パラメータの操作は,図形の位置や大きさを変化させることで行い,レンダリング結果はリアルタイムで表示します.そうすることである程度複雑なフラクタル形状を直観的に生成することができるようになりました.

最終的にはこれらのフラクタルに関わる数学的な性質を理解し,パラメータを直観的に操作できるようなレンダラを作ることで,自由自在にフラクタル形状を生成することを目指しています.

設計

ここで紹介したレンダラでは,GLSLを用いて図を描画しています.GLSLのフラグメントシェーダを用いてレンダリングを行う際には,シーン毎にシェーダファイルを用意しておく必要があります.例えば,上述のFractal Labでも,各フラクタルのシェーダファイルが予め用意してあり,パラメータがUniform変数で渡されて形状が制御されます.しかし,SchottkyLinkではユーザの操作によって様々なフラクタルのジェネレータが追加されるため,あらかじめシェーダファイルを用意しておくことは難しいです.

そこで,ユーザーの操作に応じてシェーダを動的に生成し,シェーダをコンパイルしなおしています.シェーダの生成にはテンプレートエンジンのNunjucksを使用しています.

例えば,下図のような四つの円から構成されるフラクタルを描画することを考えてみます.

この四つの円による反転という操作を繰り返すことで描画されます.この処理のGLSLコードの例は以下のようになります.

for(int i = 0; i < MAX_ITERATIONS; i++) {
    if(distance(pos, u_circle0.center) < u_circle0.radius){
        pos = circleInvert(pos, u_circle0);
        invNum++;
    } else if(distance(pos, u_circle1.center) < u_circle1.radius){
        pos = circleInvert(pos, u_circle1);
        invNum++;
    } else if(distance(pos, u_circle2.center) < u_circle2.radius){
        pos = circleInvert(pos, u_circle2);
        invNum++;
    } else if(distance(pos, u_circle3.center) < u_circle3.radius){
        pos = circleInvert(pos, u_circle3);
        invNum++;
    }
}

Uniform変数で円や球の位置,半径といったパラメータが制御されます.この円の数はユーザの操作によって減ったり増えたりします.そこで,以下のようなテンプレートを作成しておきます.

for(int i = 0; i < MAX_ITERATIONS; i++) {
{% for n in range(0,  numCircle ) %}
    if(distance(pos, u_circle{{ n }}.center) < u_circle{{ n }}.radius){
        pos = circleInvert(pos, u_circle{{ n }}, dr);
        invNum++;
    }
{% endfor %}
}

numCircleパラメータを渡すことで,このテンプレートから円の数に応じた新たなシェーダが生成できます.実際のシェーダはこのような感じになっています.
SchottkyLink/2dCircles.njk.frag at master · soma-arc/SchottkyLink · GitHub
少々汚いですがマクロ等を使えば綺麗に書けるかと思います.シェーダのモジュール化もこのテンプレートエンジンで行っています.

この方法の欠点はデバッグが面倒なことと,一度に複数のシェーダを再生成するとシェーダのリンクあたりに非常に時間がかかってしまうことです.あらかじめ大きめのUniform配列を用意しておく手もありだとは思いますが,まだ試せてはいません.実行速度にどの程度影響があるかが問題です.

おわりに

フラクタルレンダラとそのシェーダの取り回しについて書きました.
GPUへ依存はありますが)このような複雑なレンダラもブラウザで手軽に動かしてデモできるというのは非常に便利です.特に,こういったある意味マニアックなソフトウェアでも触ってもらいやすいという利点もあります.
完成にはほど遠いですが,数学的な部分も含め,粛々と開発を続けていきます.

*1:Escape-time アルゴリズムとも呼ばれ,特定の式を画面上の点に繰り返し作用させ,その点の収束,発散を見る.

数学ソフトウェアデータベース swMATHの紹介

数学とコンピュータⅡ Advent Calendar 2017 - Qiita
この記事は数学とコンピュータアドベントカレンダーⅡ,14日目の記事です.数学ソフトウェアデータベース,swMATHを紹介します.

f:id:soma_arc:20171211191610p:plain
swMATHは数学ソフトウェア(Mathematical Software)のための情報サービスで,様々な数学ソフトウェアの情報をデータベースとして持っています.これらのソフトウェアの情報は数学の論文の引用情報を元に構築されており,ユーザーは自由にデータベースを検索することができます.

ここでの数学ソフトウェアとは,何らかの数学的な問題を解析したり,解いたり,シミュレーションしたりするソフトや,数学の定理やアルゴリズムに基いたソフトウェア,もしくはライブラリのことを指します.例えば,汎用的で大きなソフトウェアだと,MathematicaMatlab等があります.特定の数学分野に由来するものであると,GeoGebra Geometryや,Desmos,SnapPy等が挙げられるでしょうか.また,様々な計算を行うためのライブラリ(例えばPythonのSciPy, NumPy)も数学ソフトウェアとします.

機能

簡単に機能を紹介します.

適当に検索キーワードを入力して検索します.今回はgeometryで検索してみました.
f:id:soma_arc:20171211192215p:plain
すると,被引用文献数でソートされた検索結果がでてきます.SageMathをクリックしてみます.
f:id:soma_arc:20171211195711p:plain

ソフトウェアの概要とキーワードや関連ソフトが表示されます.ここからさらに検索をすすめる事が可能です.ページ中段に表示されている,ORMSとは別の数学ソフトウェアの情報サービスで,人手で信頼性の高いソフトウェア情報をまとめているサービスです.

ページ下部にはこのソフトウェアを論文中で引用している論文と,そのソフトウェアそのものに関する論文(standard articles)のリストが表示されます.
f:id:soma_arc:20171211195719p:plain
リストのリンクからzbMATHという数学論文データベースに飛ぶことで,その論文の詳細情報にアクセスすることができます.また,画面右側のチェックボックスを用いることで,リストのフィルタを操作することができます.出版時期やMSC(数学の分野の分類タグ)を用いて細かくフィルタできます.

また,各論文出版時のソフトウェアのウェブサイトを見ることもできます.画面右上のVersions: Infoをクリックすると,論文タイトルの横に当時のサイトのWeb Archiveへのリンクが表示されます.
f:id:soma_arc:20171213215825p:plain
f:id:soma_arc:20171213215808p:plain

以上がswMATHの機能の簡単な紹介です.

コンセプト

近年,数学ソフトウェアが数学の研究や教育の分野で非常に重要になっています.しかし,数学の学術論文の引用欄に数学ソフトが並ぶことがありながら,それらの数学ソフトウェアを広くアーカイブするような活動はなかなか行われて来ませんでした.数少ないアーカイブ活動は,特定の数学領域に閉じていたり,メンテナンスされずに古い情報しか残っていないという状態であったようです.

一方で,数学の学術論文アーカイブ活動は昔から行なわれてきています.電子的な情報サービスで有名なものにはzbMATHMathSciNetというプロジェクトが存在しています.こうしたサービスはたくさんの論文情報をアーカイブしています.これらはオープンアクセスではありませんが,レビュワーによる要約,評論もつけられています.

学術論文のアーカイブに対してソフトウェアのアーカイブは難しい問題です.例えば,数学の結果は一度論文として出版されれば,それは永久に残りつづけます.(もちろん間違いが含まれることはありますが)しかし,ソフトウェアの開発に終わりが来ることはありません.出版当時に使用されていたソフトウェアも絶えず改良され,変化していきます.逆にメンテナンスされることがなくなってしまえば,将来的には動かなくなってしまいます.

数学の結果はある程度,その主張が正しいか,正しくないかで評価することができます.しかし,ソフトウェアには数学に比べて,たくさんの評価軸が存在します.また,個人の書き捨てのスクリプトから,大きなソフトウェアプロジェクトまで,大小さまざまな数学ソフトウェアがどんどん増えています.

そのような理由から,ある程度の品質をもった数学ソフトウェアのデータベースを人手で継続的に作っていくのは現実的ではありません.そこでswMATHではPublication-based approachと呼ぶ手法を用いてある程度自動的にデータベースを構築しています.

Publication-based Approach

数学ソフトと数学の出版物は密に繋っています.はじめに出版物に記された数学のアイデアがあり,それがソフトウェアに実装されます.実装されたソフトウェアが新たな数学の結果を生み出します.それらの結果は論文として出版されるわけですが,その論文には使用したソフトウェアが引用されます.swMATHではこの引用情報を利用して,自動的にソフトウェアのデータベースを構築しています.学術論文として出版されている論文に引用されているということで,そのソフトウェアの品質はある程度保証することができます.また,被引用件数がそのままソフトウェアの信頼性の高さを表わす事にもなります.

swMATHでは,zbMATHを中心として数学論文データベースに登録されている論文の題名や,引用欄などから自動的にソフトウェア名,そのソフトの分類を検出し,データベースを構築しています.ソフトウェアの重要な情報元となるウェブページは,WebArchiveへのリンクを用いることで保存しています.なるべく人手をかけずにデータを収集し,メンテナンスコストがかかるような機能の実装は避けて,今日まで運用されています.

おわりに

数学ソフトウェアの情報サービス,swMATHを紹介しました.swMathは2011年あたりからプロジェクトがスタートしたようなのですが,利用者数,登録されているソフトウェア,論文数は増え続けているようです.ちなみに,データベースに登録されていないソフトウェアは登録を申請することもできます.
f:id:soma_arc:20171211193330p:plain
グラフはswMATH-2chartsより

数学に関連した情報サービスとして,とても面白いサービスだと思います.一度チェックしてみてはいかがでしょうか.

参考文献

  • Sebastian B¨onisch, Michael Brickenstein, Hagen Chrapary, Gert-Martin Greuel, and Wolfram Sperber.swMATH – A New Information Service for Mathematical Software
  • Gert-Martin Greuel and Wolfram Sperber. swMATH - An Information Service for Mathematical Software. In ICMS2014 Conference Proceedings
  • Hagen Chrapary and Yue Ren. The Software Portal swMATH: A State of the Art Report and Next Steps. In ICMS2016 Conference Proceedings
  • Helge Holzmann, Mila Runnwerth, Wolfram Sperber. Linking Mathematical Software in Web Archive. In ICMS2016 Conference Proceedings (arXiv)

Tokyo Demo Fest 2017に参加しました

2月18日と2月19日に3331 Arts Chiyodaで開催されたTokyo Demo Fest(TDF)2017に参加しました.
tokyodemofest.jp
去年に引き続き,二回目の参加になります.去年の参加記事はこちら.
TokyoDemoFest2016に参加しました - 心鏡曼荼羅
TDFは日本で唯一のデモパーティです.詳しくはTDF公式サイトを参照してもらいたいのですが,すごく簡単にいうとデモと呼ばれるリアルタイムに映像や音楽を生成するプログラムを発表したり,参加者同士で交流したりする場です.作品発表の様子はYouTubeでもみることができます.
Tokyo Demo Fest 2017 - Combined Demo Compo [Live footage] - YouTube

今回はCombined Graphics CompoとGLSL Graphics Compoに作品を投稿し,Combined Graphicsで二位,GLSL Graphicsで一位をいただきました.



あまり制作に時間は取れなかったのですが,評価していただけて嬉しいです.簡単に作品の紹介と解説をつけておきます.

TokyoDemoFesTessellation

f:id:soma_arc:20170224173532p:plain
https://www.shadertoy.com/view/MsscR4
Tokyo Demo Festの頭文字TDFを使って平面を敷き詰めた作品です.テセレーションというとポリゴン分割のことを考える人が多いかと思いますが,平面や空間を図形で敷き詰めることもテセレーションといいます.
以前から普通の双曲タイリングは描いていましたが,こういったデザインのものを作ったのは初めてです.本当は回転を含むような複雑なパターンにしたかったのですが,三種類のアルファベット展開というのはなかなかに難しいです.あちらをたてればこちらがたたず…割と単純なものになってしまいました.アイデアメモの一部を置いておきます.

グリッドで考えて塗りつぶすような実装にしました.

また,GLSLで描いたのでこちらの記事([メガデモ]VisualStudio2013で4kbのexeを作る | notargs.com)を参考にexecutableにしてPC 4k Graphicsとして投稿してみました.本番では解像度の違いから図が左に寄ってしまうというミスがありましたが…
f:id:soma_arc:20170225184307p:plain
元々小さなファイルサイズというのはあまり興味がなかったのですが,案外面白かったので,次回もPC 4k Graphicsに出してみたいところです.

4kは手間がかかりそうだと思っていたのですが,こちらの発表資料(デモシーンへようこそ-4KBで映像作品をつくる技術-.pptx - Google ドライブ)や,i_saintさんのテンプレート(GitHub - i-saint/CEDEC2016_4kintro)で捗りそうです.

こういった敷き詰め作品を作りたい方には,こちらの本がおすすめです.
www.amazon.co.jp

また,GLSLで描く方法については少し前に記事を書きました.
GLSLで描くTessellation - 心鏡曼荼羅
GLSLで描くHyperbolic Tessellation - 心鏡曼荼羅

Schottky Waltz

f:id:soma_arc:20170224173544p:plain
https://www.shadertoy.com/view/XslyzH


これはCircle inversion fractalやSelf inversion fractalと呼ばれる種類のフラクタルです.ショットキー変換と呼ばれる,円のペアから定義される変換の名前に由来しています.

このフラクタルは円の外側と内側を入れ替える"反転"という操作を繰り返すことで描かれます.例えば,下図のような4つの円の反転で構成されるものを考えてみましょう.

1つの円の反転によって,他の3つの円は反転を行った円の内側に移されます.そのため,4つの円で反転を行うと,それらの内側に12個の小円ができます.

新たにできた12個の小円に対しても4つの円の反転を作用させると小円の下にさらに円ができます.

これを更に繰り返していくことで,円が無限に連なる図を得ることができます.

これをGLSLで描画する詳しいアルゴリズムに興味がある方はこちらの記事(GLSLで描くCircle Inversion Fractals - 心鏡曼荼羅)をご覧ください.

アルゴリズムは単純なので,面白い図を生成する円の配置を見つけて,動きをつけます.円の配置を試す際には拙作のSchottkyLinkを用いました.円や球で構成されるフラクタルを直観的に構成することができるウェブアプリケーションです.普段からこういったフラクタルの可視化等に取り組んでいるのでこういった形で役に立つのは嬉しいですね.まだバグも多いのですが,興味があればお試しください.
f:id:soma_arc:20170225211055p:plain

動きをつける際に参考にさせていただいたのはこちらの記事(2Dの小技 動くお絵かき - Qiita)と各種のeasingが紹介されており,実際に動きをみることができるこちらのサイト(http://gizma.com/easing/)です.前々からこのフラクタルに小気味良いモーションを付けたいと思っていたので実現できてよかったです.

去年投稿した作品はこのフラクタルの三次元版でした.形状は気に入っていたのですが,シェーディングがわりとお粗末だったのがマイナスポイントでした.三次元は魅せ方が難しいうえ,時間もなかったので,二次元にしてわかりやすい形にしたのは良い選択だったと思います.

おわりに

今回のTDFではやりたいと思っていたことを試す非常に良い機会になりました.他の作品にも創作意欲を刺激されたので来年に備えたいですね.また,各部門にもっと作品が増えて欲しいと思っておりますので,興味のある方は是非参加,作品発表をしていただければと思います.
それでは,Demoscenerの皆様の一年がより良きものでありますように.