-
-
Save hitode909/1715463 to your computer and use it in GitHub Desktop.
sin関数の使い方についてメモ
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
sin関数の魅力に迫る! | |
これは超ハイテンションでsin関数の魅力に迫るという文章です | |
sin関数は入力された角度(ラジアン)を元に、-1から1までのあいだの値を返却します | |
sin関数は周期的な特徴があって入力する値を増やしていくと... | |
----------------- | |
sin(0) = 0 | |
sin(1) = 0.1 | |
sin(2) = 0.14 | |
... | |
sin(89) = 0.999 # 1.0に到達すると次は減少していく | |
sin(91) = 0.9 | |
sin(92) = 0.8 | |
... | |
※この文字列はあくまでもイメージです、値はすごく適当で事実とことなります | |
※というかsin関数に渡すべきなのは、正しくは角度ではなくラジアンです | |
----------------- | |
みたいな感じで、sin関数に渡す値を増やしていけば | |
-1から1までのあいだを行ったり来たりするような値の返し方をします。 | |
ゲームではこの周期的な特徴を利用して、たとえば左右に移動しつづける敵を作ったりするわけです。 | |
もちろん上下移動も同様に簡単にできる。 | |
たとえばカラフルに発光させたい時なんかも色素を周期的に変化させればいいわけだから使えるんです! | |
たとえばRGBで色を設定できるオブジェクトがあったとすればそのR,G,Bそれぞれの値を | |
sinで求めた周期的な値を入れればクールなカラフルになります。 | |
そのときに渡す引数、ラジアンは生涯に渡ってずっと増えつづけるものでよい、 | |
ここでは経過時間を使いましょう。 | |
しかしこのままでは駄目で、sin関数は通常-1から1までの値でしかないので、 | |
これを0 - 255の範囲に元のsin関数の特性を保持したまま写像(=マッピング)する必要がある。 | |
まずマイナスの値は不要なので+1します。すると | |
式は、sin(経過時間) + 1となって、返却される値の特性は0 - 2となります | |
次にこれを2で割って、0 - 1の範囲におさまるようにします | |
---------------------------------------------------- | |
(sin(経過時間) + 1) / 2 | |
---------------------------------------------------- | |
こうすれば、0 から 1 までの値が返却されるようになります、だいぶ扱いやすい値範囲になりました。 | |
が、現在必要なのは0から255までの値です。256倍します | |
なぜ255倍ではないのか、実はsinが返す値は0から2"未満"の値だからです。 | |
sinが2を返却することはない! なので255倍だとちょっと数がすくなくなってしまいます。 | |
説明するのがめんどくさい! 俺はファミリーマートのファミチキを早く食べねばならぬのだ、暴君ディオニス! | |
---------------------------------------------------- | |
(sin(経過時間) + 1) / 2 * 256 | |
---------------------------------------------------- | |
こうすることで、0から255までの値が返却されるようになります。 | |
おや、どうせ256倍したものを割る2するならはじめから、割っとけばええやんということで式を変形させます | |
256を2で割ると128になりますのでこうなります | |
---------------------------------------------------- | |
(sin(経過時間) + 1) * 128 | |
---------------------------------------------------- | |
これで経過時間をもとに0から255までの周期的な変化をする値を取得できるようになったので | |
それぞれのRGB値にわりあてます | |
---------------------------------------------------- | |
R = (sin(経過時間) + 1) * 128 | |
G = (sin(経過時間) + 1) * 128 | |
B = (sin(経過時間) + 1) * 128 | |
---------------------------------------------------- | |
coooooooooooooooool | |
lolololololol | |
このままだと、暗い色(0,0,0) から 明い色(255,255,255) へと変化していった後、 | |
明い色から(255,255,255) から 暗い色(0,0,0) に変化する特性を持ってしまうので | |
緑色の色素はsin関数の位相である(逆の周期の仕方をする)cos関数を使うとか | |
あるいは、いまは共通の経過時間を渡していますが、そこを毎回ランダムで初期化するとか | |
そういった工夫があったほうがもっとcoolなglowingするかもしれないですね :o | |
jesus | |
jesus | |
jesus |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment