2017/04/06(木) [n年前の日記]
#1 [dxruby][ruby] ドット絵を自動生成するスクリプトを更新
_tinypixelspritegenerator
を修正してアップロードしておきました。
使い方は…。
もっとそれっぽくしたいとか、あるいはもうちょっと大きい画像が欲しいときは、自前でマスクパターンを用意して渡してやってください。
使い方は…。
require_relative 'tinypixelspritegenerator' psg = TinyPixelSpriteGenerator.new("spaceship", seed: 43291) p psg.pixel_dataこんな感じで。最初にアップロードした版より少しは簡単に使えるようになったはず。
もっとそれっぽくしたいとか、あるいはもうちょっと大きい画像が欲しいときは、自前でマスクパターンを用意して渡してやってください。
◎ 根本的な問題に気づいてしまった。 :
今頃になって気づいてしまったけど…。例えば、何かしらの本体スクリプトとは別に、このファイルも添付して配布、という形になると…。ソレって最初から画像ファイルを一つ同梱・添付しても状況として変わらないのでは、ていうかむしろ画像ファイルを添付したほうが確実なのでは、という気もしてきたり。
いやまあ、このファイル一つで、ランダムシードさえ変えれば膨大な数のドット絵モドキを出せるメリットはあるけれど。しかし、それぞれがちゃんと使えそうな見た目になってくれるのかという問題も…。
gem にして配布すれば使える場面も出てくるのだろうか。しかし、そもそも Ruby でこういうソレを使いたい場面がどれだけあるんだという疑問も…。いや待て。インストールが楽になれば、その分何かしら違う使い道が思いつく展開もあり得るのだろうか。
まあ、いいか。個人的にはこういうのって面白いし。
いやまあ、このファイル一つで、ランダムシードさえ変えれば膨大な数のドット絵モドキを出せるメリットはあるけれど。しかし、それぞれがちゃんと使えそうな見た目になってくれるのかという問題も…。
gem にして配布すれば使える場面も出てくるのだろうか。しかし、そもそも Ruby でこういうソレを使いたい場面がどれだけあるんだという疑問も…。いや待て。インストールが楽になれば、その分何かしら違う使い道が思いつく展開もあり得るのだろうか。
まあ、いいか。個人的にはこういうのって面白いし。
[ ツッコむ ]
#2 [prog] 「ここはテキトーな数を書け」的な定番の書き方ってあるのだろうか
README.md を書いているうちに、ちと疑問が湧いて。
「ココはランダムシード(疑似乱数の種)を渡せばいいですよ」と伝えたいのだけど、サンプルソース上ではどう書けばいいのだろうと。例えば、0 だの 32 だの 256 だの 65536 だの、キリのいい数値を書いてしまうと、「この数値、おそらく何か意味があるのだろう」と思われそうだなと。違うんだ。なんでもいいんだ。疑似乱数の種にするだけなんだから。でも、どうやってソレを伝えればいいのか。
プログラマーの間では、 _hoge, fuga, piyo, foo, bar 等、「ここはなんでもいいんだよ」と伝えるソレがあるけれど。「○○○○○という数値が出てきたら、どんな数値をそこに入れても良いのじゃ」的な暗黙のルールってあるのだろうか。どうなんだろ。
もしかして、数値じゃなくて「random_seed」とか変数名でも書いとけばいいのかな?
「ココはランダムシード(疑似乱数の種)を渡せばいいですよ」と伝えたいのだけど、サンプルソース上ではどう書けばいいのだろうと。例えば、0 だの 32 だの 256 だの 65536 だの、キリのいい数値を書いてしまうと、「この数値、おそらく何か意味があるのだろう」と思われそうだなと。違うんだ。なんでもいいんだ。疑似乱数の種にするだけなんだから。でも、どうやってソレを伝えればいいのか。
プログラマーの間では、 _hoge, fuga, piyo, foo, bar 等、「ここはなんでもいいんだよ」と伝えるソレがあるけれど。「○○○○○という数値が出てきたら、どんな数値をそこに入れても良いのじゃ」的な暗黙のルールってあるのだろうか。どうなんだろ。
もしかして、数値じゃなくて「random_seed」とか変数名でも書いとけばいいのかな?
◎ 一応数値版もあるらしい。 :
_メタ構文変数 - Wikipedia
を眺めてたら、気になる記述が。
知らなかった…。一応数値にも、そういうのがあるのか…。
しかしソレ、短すぎてなんだか意味がありそうな気もしてくる値だけど…。いや、でも、1byte内で表せる数値じゃないと汎用性が、てなところもあるのだろうか。
サンプルプログラムに使われる無意味な整数リテラルにも同様の概念が存在し、「23」や「42」などが用いられる。「42」は生命、宇宙、そして万物についての究極の疑問の答えに由来する。
知らなかった…。一応数値にも、そういうのがあるのか…。
しかしソレ、短すぎてなんだか意味がありそうな気もしてくる値だけど…。いや、でも、1byte内で表せる数値じゃないと汎用性が、てなところもあるのだろうか。
◎ そもそも知られてないらしい。 :
[ ツッコむ ]
#3 [cg_tools] 宇宙船っぽい2Dドット絵を自動生成するツールを試用
横から見て宇宙船っぽく見えるドット絵っぽい画像を自動生成してくれるツールに遭遇したので試用してみたり。Windows上で動作するツールらしい。
_Pixel Ship Generator by thydungeonsean
「Download Now」のボタンをクリックすると、「無料で使えるけど寄付してくれればサポートもできるんだけどなあ」てな感じのダイアログが開く。一応、「No thunks 〜」のリンクをクリックすればダウンロードページに行けるようで。試用してみて「これは応援したい」と思ったら寄付(?)する感じでもいいのかな。
PixelShipGenerator v1.10.zip をDLして解凍。PixelShipGenフォルダ内の PixelShipGen.exe を実行すれば起動する。
起動画面はこんな感じ。
左上の「GENERATE」をクリックすると、次々に新しい画像が生成される。「この形がカッコイイな」と思ったら、ソレをクリックすると選択できる。上のほうの「SAVE」をクリックすると、選択してるそれぞれにフロッピーディスクのアイコンがついて、exportsフォルダの中に ship30.png とか ship87.png というファイル名で画像が保存される。
_Pixel Ship Generator by thydungeonsean
「Download Now」のボタンをクリックすると、「無料で使えるけど寄付してくれればサポートもできるんだけどなあ」てな感じのダイアログが開く。一応、「No thunks 〜」のリンクをクリックすればダウンロードページに行けるようで。試用してみて「これは応援したい」と思ったら寄付(?)する感じでもいいのかな。
PixelShipGenerator v1.10.zip をDLして解凍。PixelShipGenフォルダ内の PixelShipGen.exe を実行すれば起動する。
起動画面はこんな感じ。
左上の「GENERATE」をクリックすると、次々に新しい画像が生成される。「この形がカッコイイな」と思ったら、ソレをクリックすると選択できる。上のほうの「SAVE」をクリックすると、選択してるそれぞれにフロッピーディスクのアイコンがついて、exportsフォルダの中に ship30.png とか ship87.png というファイル名で画像が保存される。
◎ 化粧してみる。 :
このままではシンプル過ぎてアレだろうけど、ざっと見た感じでは四角と円のみで構成されてるように見えるので、それぞれを安易にグラデ塗りしてみるだけでも多少違った印象になりそうな。
うむ。これはこれで。
逆に考えると…。どういうアルゴリズムで生成してるか分からんけど、四角と丸を単にグラデーションで塗り潰しながら出力するように機能を追加するだけでも雰囲気が変わりそうな。枠をつけたり等、お化粧のバリエーションは他にも色々あるけれど、ひとまずグラデだけでも効果が期待できる予感。
もっとも、レトロな2Dドット絵を目指してこういう仕様に留めている可能性も。それに、何かしらの下絵にする時は、このほうが都合がいい気もする。
うむ。これはこれで。
逆に考えると…。どういうアルゴリズムで生成してるか分からんけど、四角と丸を単にグラデーションで塗り潰しながら出力するように機能を追加するだけでも雰囲気が変わりそうな。枠をつけたり等、お化粧のバリエーションは他にも色々あるけれど、ひとまずグラデだけでも効果が期待できる予感。
もっとも、レトロな2Dドット絵を目指してこういう仕様に留めている可能性も。それに、何かしらの下絵にする時は、このほうが都合がいい気もする。
◎ 他にも見かけたソレをメモ。 :
_GameDev Resource Pick: Random Sprite Generators - EandEGames
経由で、ドット絵っぽい何かを生成するソレを他にも見かけたのでメモ。
_Sprite Generator
_Sprite Generator 1.2 - procedurally generated pixel art
_procedural graphics | Ludum Dare
アニメーションまでしている…。どういうアルゴリズムになってるんだろう…。
_Sprite Generator
_Sprite Generator 1.2 - procedurally generated pixel art
_procedural graphics | Ludum Dare
アニメーションまでしている…。どういうアルゴリズムになってるんだろう…。
[ ツッコむ ]
#4 [ruby] 正規乱数とやらが作れそうかテスト
_乱数にコクを出すアレ
が気になり始めたので Ruby + DXRuby を使ってテスト。
_「ちゃんとした正規乱数が欲しいなら Box-Muller を使うべき」 _「sin,cosとか平方根とか今時はたいして重くないし」 という主張も見かけたので、以下を参考にして Box-Muller もテスト。
_Box-Muller法による正規分布列生成 - Qiita
こんな感じのソースでどうだろう。合ってるのだろうか。
_boxmuller.rb
結果はこんな感じに。
上から、只の rand (= 一様分布)、Box-Muller法、乱数にコクを出すアレ。
ゲーム等で使う分には乱数にコクを出すソレでもそこそこ十分っぽい雰囲気。Box-Mullerはどこからどこまでの範囲を取るのかもちと分からんかったし…。
その後、 _「一様乱数の平均値を正規乱数として代用する」という話をゆるふわ統計的に検証する - k11i.biz で、 _Ziggurat法 なるものもあると知った。コレも試せば良かったかしらん。
_「ちゃんとした正規乱数が欲しいなら Box-Muller を使うべき」 _「sin,cosとか平方根とか今時はたいして重くないし」 という主張も見かけたので、以下を参考にして Box-Muller もテスト。
_Box-Muller法による正規分布列生成 - Qiita
こんな感じのソースでどうだろう。合ってるのだろうか。
_boxmuller.rb
# Box-Muller法による正規乱数が作れそうかどうかをテスト require 'dxruby' # 乱数の結果を DXRuby の Image に描き込む def get_image(w, h, data) # 最大カウント数を取得 m = data.max # Imageに描き込み img = Image.new(w, h) w.times do |x| cnt = (data[x] * h.to_f / m).to_i y = h - 1 cnt.times do img[x, y] = C_WHITE y -= 1 end end return img end # Box-Muller法で乱数を取得 def get_box_mular(mu, sigma) x = rand y = rand r = Math.sqrt(-2.0 * Math.log(x)) * Math.cos(2.0 * Math::PI * y) return r * sigma + mu end w, h = 1280, 720 hh = h / 3 tc = 200000 # 一様分布になってるか確認 n = Array.new(w, 0) tc.times do r = (rand * w).to_i n[r] += 1 end nml_img = get_image(w, hh, n) # Box-Muller法 n = Array.new(w, 0) tc.times do rbm = get_box_mular(0.0, 1.0) r = (rbm * (w / 8) + (w / 2)).to_i n[r] += 1 if r >= 0 and r < w end bmr_img = get_image(w, hh, n) # 乱数にコクを出すアレ n = Array.new(w, 0) tc.times do r = 0 cnt = 4 cnt.times { r += rand } r = ((r / cnt) * w).to_i n[r] += 1 end kok_img = get_image(w, hh, n) # 結果表示 Window.resize(w, h) Window.loop do break if Input.keyPush?(K_ESCAPE) Window.draw(0, 0, nml_img) Window.draw(0, hh, bmr_img) Window.draw(0, hh + hh, kok_img) end
結果はこんな感じに。
上から、只の rand (= 一様分布)、Box-Muller法、乱数にコクを出すアレ。
ゲーム等で使う分には乱数にコクを出すソレでもそこそこ十分っぽい雰囲気。Box-Mullerはどこからどこまでの範囲を取るのかもちと分からんかったし…。
その後、 _「一様乱数の平均値を正規乱数として代用する」という話をゆるふわ統計的に検証する - k11i.biz で、 _Ziggurat法 なるものもあると知った。コレも試せば良かったかしらん。
[ ツッコむ ]
#5 [anime] EVA旧劇場版「Air/まごころを、君に」を視聴
NHK-BSで放送されてたソレをようやく視聴。一応、昔見た記憶があるような。わざわざDVDを買った…ような気がする。もっともこの作品、色んな版があるそうで、自分が買ったのはどの版か分からんのだけど。
改めて見てみると…やっぱり凄いなと…。初見時も思ったけど、内容はともかく映像が凄いからもうこれで十分じゃないかなあ、という気分に。無理して新劇場版を作らんでも…これでええやん…。
それはともかく。NHKがモザイクをかける際の基準が分からん…。「え? そこでモザイク?」「そこよりもあっちのシーンのほうがヤバくない…?」と何度か困惑。せっかくここまで攻めたんだから「作品の時代性を尊重して」とかテキトーなテロップ出してそのまま流しちゃえば良かったのに。 *1
改めて見てみると…やっぱり凄いなと…。初見時も思ったけど、内容はともかく映像が凄いからもうこれで十分じゃないかなあ、という気分に。無理して新劇場版を作らんでも…これでええやん…。
それはともかく。NHKがモザイクをかける際の基準が分からん…。「え? そこでモザイク?」「そこよりもあっちのシーンのほうがヤバくない…?」と何度か困惑。せっかくここまで攻めたんだから「作品の時代性を尊重して」とかテキトーなテロップ出してそのまま流しちゃえば良かったのに。 *1
*1: 今となっては、こんなアレなソレに熱狂しちゃってた若者達が当時居たんだよ、てな状況自体が貴重な記録になっていくだろうと思うわけで、そのためには「うげえ。こんなもんを当時見てたのかよ。作ったヤツラも見てたヤツラも気持ち悪い」と今時の若い視聴者がゲンナリする映像をそのまま流したほうが、それこそ当時の「社会現象としてのEVA」を的確に伝えてくれるのでは、などと思ったり思わなかったり。とは言え今回「妙なところで保身に走るNHKという組織」「所詮はNHK」の記録になってたような気もしてきてこれはこれでアリかも、などと思えてきたりもして。いやまあ、「伝えることには妥協しないNHK」「さすがNHK」を目撃したかった気もしますが…。コレを放送しただけでも「一体どうしたNHK」「気はたしかなのかNHK」ってところもあるわけで…。
[ ツッコむ ]
以上、1 日分です。