Bash3Dbashプログラミングテクニック今回つかったbashのプログラミングテクニックについて、記録のついでに少しまとめます。シェルスクリプトの基本的な所は書きません。あと、3Dプログラミングに関しては本に書いてある事以上のことが書けそうにないので、(今は)書きません。bashのデータ構造bashでそこそこ本格的にプログラミングする事を考えた上でまっさきに「辛そう...」ってなるのはデータ構造ですよね!今回のソフトでは、ベクトルや行列を綺麗に扱えないと困ってしまうでしょう。bashの「値」は基本的に全てただの文字列ですが、「リスト構造」にだけはネイティブで対応しています。${lst[3]}#空行データにアクセスする時に、必ず${}でくくらないといけないのが少し面倒です。ちなみに添字を付けないとリスト全体...と思いたいところですが、最初の要素が出てきます。$lst1全体を表示するには、${lst[@]}とします。3リストを定義するときに使ったカッコが出てこないので、リストをコピーしたい場合はそのカッコを補わないといけません。3慣れればなんとかなるレベルですが、面倒です。3)”という文字列を返す関数を$(command)で受けて変数に代入してもリストになりません。3)ただの文字列として代入されます。してもしたい場合は、evalを使わないといけません。3通常の用途ならそれで済むのですが、今回は出来る限り高速に処理したいので、こうやってコマンドが沢山必要になるのは避けたいところです。後に言うダイナミックスコープとevalを組み合わせると連想配列みたいなことも出来るのですが、今回のプログラムでは基本的にこのリストでデータ構造を管理しています。インデックスを指定したアクセスをするためにコストが高いevalを行わなくてよいこと、ベクトルと行列が主役なのでリストで十分な事が理由です。1)最初の要素に型の名前を入れて適宜assertすることで、動的型検査みたいなことをしています。変数のスコープ名前空間は基本的にひとつしかありません。関数のネストは一切関係なく上書きされていきます。#オフサイドルールではなく、存在しない変数はグローバルに作られるみたい一種のダイナミックスコープみたいなものだと理解しておけば大体書けます。呼び出し元の変数がうっかり書き換えられてしまう可能性があるのですごく不便ですが、逆に利用することも出来ます。「関数の引数に変数名を渡すと、evalと組み合わせることで指定した変数に結果を格納する関数」が作れます。$val21これを使って「最初の引数は入力、最後の引数は出力」と規約を決めて関数を設計しています。行列の計算はこちらにあります。見た目がアセンブラみたいになりますネ。「こんなスコープ再帰が出来ないのでは?」という気がしますが、案外なんとかなります。いうのも、$(command)はサブシェルとかいうので実行されるらしくて、さらにサブシェルは別の変数空間で動作するようです。このスコープの問題は起こりません。3628800ついでにevalとこのスコープの仕様を使うと、擬似的な連想配列を作れますが、値のコピーが難しいこともあって使いませんでした。val123固定小数点とexprコマンドシェルスクリプトで計算をするには、exprコマンドを使う必要があります。このコマンドは整数の計算にしか対応していません。argument3Dソフトでそれでは困るので、整数だけで小数を計算します。それにはどうするかというと、扱う小数を適当に1000倍とかして、それを小数に見立てます。1000は1、1001は1.001、3140は3.140だと思うことにします。その場合、計算する時にちょっとした手間が必要になります。#足し算・引き算はそのまま足し算で大丈夫です。#割り算するときは、倍率で掛けてから割ります。#掛け算するときは、掛け算してから倍率で割ります。9859倍率を1000じゃなくてもっと高くすれば、もっと小数演算の結果が正確になります。私の環境だけかもしれませんが、exprはどんな大きな数でもちゃんと扱ってくれるようなので、ガンガン倍率を上げていけば誤差がまったく気にならなくなります。これはすごい楽...(楽すぎた)なお、sin/cosは(テイラー展開を自分で展開しない限り)計算できないようだったので、0~360度について事前に求めておいて、これを先ほどのリスト構造にいれて使っています。平方根も使いたかったんですが、どうやっても無理そうなので諦めました。表示:オフスクリーンレンダリングもちろんターミナルにはピクセルがないので、ターミナル上に表示する文字で代用します。(col)を使うとターミナル上の任意の位置に移動できるので、これを使いたいところです。donedoneが、この方法では線を引く様子が目で分かるぐらい時間がかかります。これで最初レンダリングしたみたのですが、レンダリング中に線を引いている様子がバッチリ見えてしまい、あんまり回転アニメーションしてるように見えませんでした。ほんもののゲームでもそういう、更新途中の絵が表示されてしまってちらつく問題があります。ほんもののゲームでは、そういう時は、書いてもすぐには表示されない「裏の画面」を用意しておいて、そちらに時間を掛けてレンダリングして、最後に表示される「表の画面」と入れ替える「オフスクリーンレンダリング」と「ダブルバッファリング」をしているのでした。私も同様にそのテクニックを使いました。具体的には、こんな感じ。'_')今回の「ピクセル」は文字ですから、「裏の画面」はただの文字列になります。画面のサイズを取得しておいて、そのサイズ分何もない文字列を意味する「_」をtrを使って入れておきます。空白でいいじゃないかと思うかもしれませんが、シェルスクリプトでは空白はかなり重要な意味を持っていて面倒なのでこうしています。「ドットを打つ」時は、対応する文字列中のインデックスの文字を*に書き換えます。s/./*/<置き換える文字の位置>)zshだとstr[12]=\*ってやると文字列を更新できるのですが、bashでは使えなかったので、sedを使って書き換えています。この処理が非常に重く、今回のレンダリングエンジン(?)の処理時間の殆どはこのドットを打つ処理に費やされています。上手い方法を知ってたら教えてください!最後に表の画面に更新する方法ですが、単純にechoするだけです。この時、何も入っていない所には_が入っていたので、空白に直します。'ちゃんと幅に合わせて改行されるので、うまく表示できます。プロセスforkを抑える当初綺麗に関数を使って書いた所、行列の掛け算に1秒近く掛かってしまい、さすがにレンダリングは出来ないのかな...と諦めかけたのですが、行列やベクトルの掛け算や足し算を全てインライン展開したところ、座標計算に関しては十二分すぎる程の速度が出せるようになりました。前述した通り、今回遅いのはオフスクリーンにピクセル(文字)を書き込む処理が異常に時間が掛かっているからです。プロセスの起動はものすごい重い処理のようで、可読性をそこまで損なわない範囲でプロセスの呼び出しを一箇所にまとめています。線を引くのにえげつない時間が掛かるのを見た時、初めて触ったBASICの処理系を思い出しました。ところで、なんで3Dライブラリを作るとOpenGL風の名前にしちゃうんだろ。ニコ動に「次はシェーディングだな!」というコメントがついているのですが、テクスチャの表示をやってみたいです!7色くらいしか使えないので、たいへんそう...。影は「暗い色」が基本的に無いのでかなりつらい気がします。FujisakiC++から動画を直接出力する自作ライブラリ「Dolly」の上で、フルスクラッチで3Dのレンダリングを行なっています。ワイヤーフレームの正方形をぐるぐる。https://7io.org/wp/wp-content/uploads/2017/12/dbabc418c8a0e36ab3d373369b832cc3.mp4テクスチャもなんとか実装しましたが、三角形の継ぎ目が出ているのが気になります。Fujisaki地球物理をやる学科に居るので、地震も学んでいるのですが、ふと思いついたので地震計の観測した波形を音に見立ててWAVファイルにしてみました。なんだか、雷みたいな音がしますね!ソースコードはこちらです。PythonでCSV読んでWAVに書いているだけですが、一応使い方のサンプルとしては使えるのではないでしょうか。FujisakiC++から動画を直接出力できる自作ライブラリ「Dolly」を用いて、二重振り子のシミュレーション動画を作ってみました。10分耐久・たのしい二重振り子https://7io.org/wp/wp-content/uploads/2017/12/421b47ffd946ca083b65cd668c6b17e6-1.mp4ソースコードはこちらにあります:https://github.com/ledyba/Dolly/blob/master/src/sample/runge_kutta.cpp二重振り子はどこにいる?https://7io.org/wp/wp-content/uploads/2017/12/421b47ffd946ca083b65cd668c6b17e6.mp4さらに、振り子の通ったところをずっと重ねるように描いた動画も作りました。FujisakiC++から動画を直接出力する自作ライブラリDollyを使って、マンデルブローを拡大する動画を作りました。https://7io.org/wp/wp-content/uploads/2017/12/2283f852a38a4873d6641bcaf4ea47ac.mp4この部分のソースはこちらにあります。Fujisakiあけましておめでとうございます!今年もよろしくおねがいします。去年はあまりいろいろ出来なかったので、今年は少しずつでも、何かできればなと思っています。転学部までしたので物理をちゃんと身につけたい1ですし、大学再受験も本腰いれてやってきたいです。新年早速何かアウトプットしよう、ということで、去年作って放置していた「紙ジェクションマッピング」というネタを投稿します。紙ジェクションマッピングしてみたプロジェクションマッピングってご存知でしょうか。この冬見られる話題のプロジェクションマッピングまとめこういう感じで立体物に映像を投影するアートで、最近いろいろなところで行われているようです。これっぽい事がしたいのですが、うちにはプロジェクタのような高いものはありません。代わりに1枚50円で印刷できるコンビニのプリンタで何か似たようなことが出来ないかと模索した結果、こんな感じになりました。【ニコニコ動画】紙ジェクションマッピングしてみた仕組みは非常に単純で、ある角度から眺めると立体的に見えるように紙に印刷してあります。作り方ですが、まずこのマーカー画像をセブンネットプリントで印刷して(宣伝)、こんな感じで撮影します。このとき、カメラのファインダから眺めた時に台形が真四角に見えるようにするのがポイントです。この状態で撮った画像がこちらこれを作ったソフトで変形させて適当にホワイトバランスを調整。これを紙に印刷して、マーカー画像を印刷した紙の代わりにこの紙をおきます。この状態で動画を撮ったのが、先ほどのニコ動の動画です。今回は一番簡単な平面でしたが、もっといろいろなものに紙ジェクションしたいですね。ティッシュの箱に貼り付けて、ある角度から見ると立体的に見える...とか。今位置合わせが非常にしんどいのですが、ARマーカーでなんとかできるといいんじゃないかなーとかも考えてます。3D力が問われる!!ただ、結局プリンタの実力があまり高くないせいで、紙に写した方がそんなにリアルに見えないので限界かなという気がしています。Fujisakiおひさしぶりです。21日のニコニコ学会βは良かったですね。良かったのは研究100連発で、本職の人のすごさを見ると、私も何かつくりたいな〜って気分になります。私はボランティア(登壇者へのカンペ出し)として参加しました。凄い人を間近に見れるという特典付き(?)の嬉しいけど責任重大なお仕事です。イベント運営って大変ですね...。あと野糞の人は本気でマッドだ(褒め言葉)。Gamesさんの開発した、アブストラクトな感じのシューティングゲームです。私はこのゲームがSTGに入り始めたきっかけだけあって、大好きです。去年はWebに移植したNoiz2saを公開しましたが、今年はAndroidに移植したものを公開します。【ニコニコ動画】【メリー】Noiz2saをAndroidに移植してみた【クリスマス】クリスマス、そして年末年始といえばシューティングゲーム!ぜひお楽しみ下さい。敵の弾を避けて撃つ、指一本で遊べるシンプルなゲームです。USBのゲームパッドをつなぐと、PC版と同様な操作で遊ぶことも可能です。ダウンロードはこちらからバッドノウハウFAQ移植時のバッドノウハウを書きますQ.リソースのファイルの拡張子がamrとかなのはなぜですかこのように置かないと、リソースが圧縮される時に圧縮されてしまい、AssetManagerからランダムリードすることが出来なくなってしまうからです。あっコーナー分けた割に一個しか思い浮かばなかった...質問は随時受け付けています。Fujisaki「ローレイヤー勉強会」というイベントでのLT。comment二条項BSDとのデュアルライセンス。Fujisaki久しぶりの更新です。久しぶりにさきゅばすのアップデートを行いました。マイナー更新ですけど...。Licenseのデュアルライセンスになりました。派生物のライセンスはこのどちらか一方か、両方(デュアルライセンスのまま)を選ぶことができます。v3のままとなります。ライブラリの更新とバグの修正を行いましたその他の更新はこんな感じです。2chのスレで見つかってたいくつかのバグを修正しました。x264とかffmpeg本体のライブラリの更新を行いました。ビルドシステムがcmakeからwafになりました。pythonで書きやすい。このためにwafにバグ修正パッチまで投げました...(1.7.10でaccepted)未踏ソフトウェア事業で開発していたもののうち、基礎的な部分をライブラリ「しなもん」として切り出し、そちらを利用することにしました。上記の影響でlibxml2への依存が消えています。icuにも陽には依存しなくなりました(しなもんを通して陰に依存はしています)。」の音ズレ問題ですが、たぶんacodecがaac(ffmpegの内蔵aacエンコーダ)が問題を引き起こしてるのではないかと思います1。外部ライブラリであるlibvo_aacencにすると解決するようです。今までは変換レシピでaacを使うものがいくつかありましたが、今回のバージョンからlibvo_aacencだけにしました。支援で「プログラミング言語ど~なっつ」と、それを用いた「ファミコンを題材にした電子教材のような何か」を作っておりましたが、本事業でスーパークリエータに認定されました。わーいわーい(謎5/29にはスーパークリエータ認定授与式があり、そこで再度プレゼンテーションを行います。世界線の分岐var式を作って現在のオフサイドルール廃止ニワン語処理系「ねこまた」との統合とかやりたいです。最後ですが、これが出来ればニワン語の/seekとかにも対応できるし、現状抽象構文木をそのまま評価している「ねこまた」をど~なっつVMへのトランスレータにすることが出来れば、リアルタイム再生も夢でないくらいには高速化できる...かも??本業(学生)の方があるので支援期間中ほどの速度は出せませんが、ぼちぼち書けていければな~と思います。進学する学科、間違えちゃったかなあ...。