ゲームエフェクトデザイナーのブログ (新)

レポート記事とか色々。C#とかも触ったり。

パーセンテージと割合と単位

前回の記事に引き続いて「割合」についてさらに書いておきたいと思います。

前回は「割り算が苦手」という話をしましたが、数学を苦手に感じる大きな要素の1つが割り算ではないかなと思っていて、学習に際しては割り算への苦手意識を減らすことが重要だと考えています。

そして「割合」もまた、割り算に大きく関係します。

割合とは?


とても分かりやすい表の入った算数プリントが「ちびむすドリル【小学生】」というサイトで無料配布されていましたので、引用させて頂きたいと思います。

f:id:moko_03_25:20180423015113j:plain

日常生活では100%のように百分率を使うことが多いですが、数学やシェーダーの計算で百分率を使う場面はほとんど無いように思います。その代わりに「 1 を100%の値とした割合」をよく使う印象です。

「1 なら 100%」「0.5 なら 50%」「0 なら 0%」といった感じです。

PhotoshopのRカラー(8bit)の値は「0~255」なのはアーティストには馴染み深いですが、シェーダー等での色の計算は黒~白の範囲を「0~1」で表したりします。

UV座標も基本となる範囲は「0~1」で表しますし、「0~1」で表すことで「0.5なら半分の値」だし「2なら2倍の値」という風に、人間から見ても直感的でとても分かりやすく頭の中で計算もしやすくなりますね。

何かの割合を求める


例えば 5 リットルのペットボトルに 3 リットルの水が入っていれば「全部で 5 ある内の 3 」つまり「{\frac{3}{5}}」なので、「 3 ÷ 5 = 0.6 」になり、ペットボトルに対して水の割合が 0.6 ‥百分率で言えば 60% であることが分かります。

何かに割合を掛ける


割合は、何かの値に対して掛けると「その値に対しての割合の値」が出ます。

何かを半分(50%)にしたかったら 0.5 を掛けますよね。
30に対して 0.5 を掛けると 15 が出ますが、これは30の半分は15であるということです。

割合そのもの」は具体的な値(cmとかkgとか分のような)ではなく「何かに掛ける」ことでようやく「」になります。

割合が 0.3 だったとして、この 0.3 は長さなのか重さなのか面積なのか分かりません。
ですが「60分」に対して掛ければ「18分」が出ます。

60 * 0.3 = 18(60分の30%は18分)


これは後に解説予定の「三角関数」で「cosやsinに斜辺の値を掛けると実際の長さが出る」ことを理解するために必要な考え方になるかと思います。

1を単位とする


「1」は特別な数字だと思います。

割合での「1」は「100%」を表しますし、「1円」や「1時間」や「1cm」 や「1Kg」のような単位では「基準となる値」を表します。

これは結構大事なことだと思っていて「単位に定数を掛けたものが実際の値」という認識が必要な場面があると思うのです。
つまり単位が1cmなら「 1cm * 7 は 7cm」ということです。

例えば x,y 座標が ( 5, 3 ) だった場合は「xy座標の単位となる x=1,y=1 に対して 5 と 3 を掛けたものが現在の座標」と言い表すことができますよね。

「まだるっこしい考え方だなあ」と思うかも知れませんが、こちらも後に解説予定の「行列」が出てきた時に、必要になってくる考え方だと思います。

単位である 1 の値を出して計算を楽にする(正規化)


拡張された「帰一法」 | TETRA'S MATH

こちらの記事の例題が分かりやすいので引用させていただきます。

7cmで35gの棒は、15cmで何gになりますか


この場合まず「 1cm は何g か?」が分かれば計算が楽になるので、35g を 7 で割ります。
すると「 35 ÷ 7 = 5 」で「1cm は 5g」と1cm単位でのグラム数が出ます。
そしたら「1cm分のグラム数(5g) * 15cm = 75g」と計算しやすくなって答えが出ます。

こういった計算方法を「帰一法」というそうです(覚えなくて良いです)。

CGでは計算しやすくするためなんかに値を 0~1 に収めることを「正規化(Normalize)」と言いますが、MayaのUVエディタでUVを 0~1 の範囲にすっぽり収まるようスケーリングする際に、メニューから「正規化」を実行しますよね。

この正規化は帰一法と同じ考え方のようです。

他にも、シェーダーの計算でベクトルを正規化することがありますし、この数学シリーズでもベクトルと内積の解説の際に正規化が登場する予定です。

また、カラーとガンマの計算をする際には、RGB値を 0~255 の 8bit の単位ではなく 0~1 の正規化した単位に置き換えてから計算する必要があります。

例えば、RGBの値がPhotoshopで「37」の場合‥
0 から数えているので +1 して {\frac{38}{256}} の状態ですよね。
すると割合は「0.1484375」で、正規化‥つまり「1が100%」の場合は割合である「0.1484375」がそのまま実際の値になります。

こちらを2.2乗したり0.4545乗したりしてガンマが絡む計算をすれば良い訳ですね。

という訳で「割合」とか「単位」とかの話でした。