Imaginantia

思ったことを書きます

日記 0523

今日は進捗が外に出た日でした。こういうタイミングってすごく嬉しいなと思います。あとだいたい「一気に作って一気に出す」ことが私には多いので、そうではなく「だんだん直していく」スタイルの初お披露目というのは他者からの記憶に残るという点でありがたい機会だなと思うなどしました。

というわけで。とりあえず一通りの工程を終え、服としての最低限の体裁を整えることができました。予定ジャストくらいの進捗度で素晴らしいです。現状に満足しているわけではないですけど、今現状に至っていることには満足できています。

やりたかったことは「日傘」そして「文化の体現」なので、それにはまた幾らか時間を掛けることとなります。毎日ちょっとずつ改変していくことがいいのかな。まぁ重きを強く置かなくて良いというのは確かで、調子いい感じなのです。

土曜日である今日はまた「やることがある日」なので、作業を集中して行うというよりはちょっとした思いつきをぱちぱち試していくには良いタイミングで。というわけで今日も引き続きテクスチャ弄りをやりつつ、見つけた修正点を直しつつ、のんびりやっていこうと思います。

あまりにも調子がよくてなんだか拍子抜けしちゃう部分がありますが、まぁ夏の普段着という普遍的なモノ (ハレでないもの) をのんびり作れているのはおそらく適していることな気もしますね。

さて。

 

カレンダーの話を最初にしました。今どうなっているかというと…

f:id:phi16_ind:20200523042817p:plain

なんだかこうじゃない気がしてなりません。どうしてこうなったかを説明させてください。

カレンダーに予定を建てるのはいいんですが、最近の予定は結局で済んでしまいます。というのも、服の工程はほぼ安定して「デザイン→モデリング→スキニング→修正」と、順序が確定しているからです。すると、やることを示すには全体のタスク名で事足りるんですね。次をやればいいので。

ちなみにワールド制作とかはそうじゃなくて、好きな順序でモノを作ることができる (ことが多い) んです。小物から用意してもいいしギミックのコアを実装した状態にしてもいいし。だから迷ってしまって、そこに時間を費やしてしまうことがある気がします。むずかし。

で、まぁ、服制作は「服」というタスク名で説明が終わってしまうので、昨日のその服という名前のタスクを今日に持っていくということを2回やったのです。それが現在です。

つまりこの「カレンダーに結局やったことが書き込まれていない状態」というのは「服作り」というタスクの特殊性から来るもので、一般にはきっとそうではないだろう、という話です。

…順序の定まるタスクが元来多いような気はするんですけどね。まぁアプリケーション制作も安定してくると順序はなんでもよくなったりするので「後工程」だとそうなりがち、みたいなことはありそうです。ワールド制作はそうではない特例かもしれません。

って書いて気づいたんですが、Unityのシーンっていうのは本来プログラマとかデザイナとかモデラーとかの色んな人が作ったものを統合して (これも一役職でしょうね) できるもので、一人でやるのではない気がしてきました。いやもちろんできるんですけどね。

つまり「分業可能な制作」というのは言い換えると「一人でやるとどの順序でやるか迷う工程」ということなのかもしれません。だからといって何もないけど。


おまけです。今日のおまけは「円周をくるくる周る点を適切に追いかける方法」です。

これのことです。私が螺旋状に球を動かしているように見えますが、入力としては縦方向の移動は一切取っていません。使うのは現在の角度だけです。

考え方の根本は、「1フレームに -\pi から \pi の間しか角度が変化しないという制約」です。この制約は自然に見えると思います。

すると、前回からの差分-\pi から \pi の間の値を取るはずです。しかし直接「現在位置」と「前回位置」の差を計算するだけだとその範囲に収まらないことがあるわけですよね。前回位置は [-\pi,\pi] という制約を越えて好きな値を取る可能性があるのです。

差が正しくないのは「現在位置」が正しい位置にいないからです。でも考えてみると、「現在位置」は「前回位置」と「その差分」の和なので、差分がちゃんと求まれば十分です。そして「正しい現在位置」というのは「現在位置」に 2\pi n ズレた場所のどこかのはずです。即ち、「差分を 2\pi で割った余り」は現在位置のゆらぎに依りません。

というわけで適当に計算した差分を 2\pi n 分ずらして [-\pi,\pi] の範囲に収めるとそれが正しい差分になるのです。この方法は一意なので (特異点を除く)、決定的に計算が出来ます。

要はこうです:

prev = PreviousAngle() // full angle
cur = MeasureAngle() // current angle in [-π,π]
diff = ((cur - prev + π) mod 2π) - π // fit their difference into [-π,π] 
cur = prev + diff // current full angle

なんか現在の角度が 0 に近いときはどうとか、-\pi 付近だとどうとか、みたいなことを考えてコードを書くとめちゃくちゃ頭がぐちゃぐちゃになってわけわからなかったんですが、差分を使って基準を 0 にすることで素直に書けるようになりました。考えてみれば角度の値そのものに元来処理は一切依存しないので、角度の値に応じた条件分岐の無いコードが正しいんですよね。そういう心持ち、大切にしていきたいです。

今回は例えばちょうど \pi 分だけの差分が出てきたときが特異点になるので、それが陽に現れるのが正しいという側面もあります。今回は mod 2π の計算に 2πn が渡ることでそれが現れているわけです。

うむ。ちゃんと空間の構造を捉えてコードを書いていきたいものです。


日記のおまけとして実装解説を置くのはありかもしれませんね。twitterだと流れてしまって、記事としてちゃんと書くと残りすぎる。所詮ただの一実装の解説なんてそんな重きあるものじゃないから、日記くらいの心持ちで書くのはちょうど良さそうです。需要があったらやるし、需要がなくても私の気分でやります。

おわり。