2014年9月5日金曜日

Maxscript その2 「値の操作 演算」

詳しくはscriptリファレンスの「値>基本的なデータ値」 の各値の部分
もしくは「名前、リテラル定数、および式>単純式>数値演算式」の項を参照。

+    加算
-    減算
*    乗算
/    除算
^    累乗

1+2
2-1
2*2
3/2
2^2 2の二乗
2^8 2の八乗


Maxscriptの演算の優先順位は一般的な数学等の演算規則と同じようだ。
また、()囲んだ部分が優先的に計算されるのも同じらしい。
優先順位がよく分からなかったり、自信がなかったらどんどん()で囲んでしまっても、僕はいいと思う。
(2*4)+(3*5)

「0.5」などは「.5」と入力を省略する事が出来る。
2*.5

「10.0」などは「10.」と省略する事も出来る。
5/10.

値の型の事は常に頭の片隅に。

これでスクリプトリスナーを電卓のように使える!さらば電卓。

分岐点その1。数学やりたい人は下へ。難しいこと考えたくない人は次へ。スクリプトだから数学出来ないとダメかというと決してそんな事はないと思う。
ちなみに、数学出来ない僕はもう次へ行きたい。
------------------------------------------------
関数計算など、もう少し突っ込んだ部分。

Number値はいくつかのメソッドが準備されている。Maxscriptは基本的には大文字小文字の区別はないのでABSでもabsでもaBsでも半角であれば構わない。ただし、数値を入力する際は最低でもスペースを一つ空ける事。

abs・・・絶対値を返す = マイナスを取った値になる

mod・・・余りを返す
6/3の余り。6/4の余り。100/3の余り。答えは常にFloat。

ceil と floor・・・小数点以下の切り上げ、切り下げ。答えは常にFloat。


四捨五入を行いたいときは一般的にはroundという関数を・・・あら?ない??見当たらない・・・。Maxscriptにはroundないんですかね?どうしよう?

【問】どうやって四捨五入するのですか?

【答】諦める

冗談はさておき、ここまでの情報で多分出来る気が。自信ないけど、四捨五入だったらfloor?以下にいくつかパターンを。正解知っておられる方、教えてください。

で、何に使うかですよね?例えばオブジェクトの整列とか?

10飛ばしの答えの求め方(1の位の四捨五入)

例えば元の数値が283.5だった場合

238.5/10
23.85
floor (23.85+0.5)
24.0
24.0*10
240.0

一行だと
(floor (238.5/10+0.5))*10
240.0

同じ計算方法で3飛ばしも。

11/3.0
3.66667
floor (3.66667+0.5)
4.0
4.0*3
12.0

26/3.0
8.66667
floor (8.666667+0.5)
9.0
9.0*3
27.0

式コントローラで使ってnずつしか移動しないオブジェクトを作ってみたり。
ストップモーションとは違うけど、これはこれで面白い効果が得られる
modの使用例は「頂点上にオブジェクトをコピー」など。他にも意外と使う事がある。リンゴの余りだけに使うんじゃなかったんすね。


三角関数の使用
acos
asin
atan
cos
sin
tan

などの三角関数が使える。入力する値は角度になっているようだ。
また、角度とラジアンの変換は

DegToRad
RadToDeg

を使用する。3DCGソフトでは角度をラジアンで扱うことも多い。この変換は割と頻繁に行う。

 ※(ラジアン=角度を半径1の円の円弧の長さで表す)
 なので
3.14 = 180°
2π = 360°
4π = 720°
 



Maxscriptでのπはpiと入力する

 







その他の関数
exp ・・・ e(2.71828182845904)^x 指数関数
log ・・・ e(2.71828182845904) の対数関数
log10 ・・・ 常用対数。10を底とする対数
pow ・・・ x^y 累乗計算。2^3としても同じ。
sqrt ・・・ 平方根、√

露出3段あげる(+3Stop)には何倍明るくすればいいんだっけ?
pow 2 3

log2とかないものは
log2 x = (log10 x)/(log10 2)
みたいな感じで

(log10 256)/(log10 2)  256って2を何回掛けるんだっけ?

----------------------------
色の計算の例(ガンマ計算)

ガンマ計算するためには色をfloat colorに変換する必要がある。

・8bit integer → float color
128だった場合・・・

128/255.0
0.501961

(※色数は256色だが黒が0なので0~255まで。本当の中間色は127.5だがintegerでは扱えない数値)

・float color →8bit integer

(0.501961*255) as integer
128

color値とPoint4値を変換した方が楽な事もある。



0.18をgamma2.2用の数値(8bit integer)にする

((pow .18 (1/2.2))*255) as integer
116

その逆

pow (116/255.0) 2.2
0.176774

一度整数にしたため、小数点以下が切り捨てられるので完全に元の数値には戻らない。
----------------------------
ちなみにPythonで数学関数を扱いたい場合はmathモジュールを読み込む
数学系の関数名は言語が違っても大体同じ印象。
光量を半分するには露出何段?
三角関数はラジアンを入力か?

僕の知り合いの数学が得意な方がこうおっしゃってました。
「誰でも分かる○○とかあるけど、数学に近道はない。
問題を沢山解いて体に叩き込むしかない。」
は、はい・・・。頑張ります・・・。

7 件のコメント:

  1. いつも勉強になる記事ありがとうございます。
    四捨五入の関数ですが、自分も以前探していたところ、以下のファンクションで出来ました。

    fn round_to val n =
    (
        local mult = 10.0 ^ n
            (floor ((val * mult) + 0.5)) / mult
    )

    --round_to 数値 桁数
    round_to 3.62545 3

    元ソースはこちらです。
    http://forums.cgsociety.org/archive/index.php/t-124740.html

    返信削除
  2. 今津さん、ありがとうございます。関数作成の所でそれをやろうと思ってました(笑)
    やっぱりないから自分で関数を作るって事ですよね?

    返信削除
  3. 桁数いいですね。-1とか入れると整数の方でも行けますね。参考になりました。

    僕のは四捨五入というよりはスナップに考え方が近いんですかね?

    fn snap val n =(
    (floor (val/n+0.5))*n
    )

    v = 3.62545
    snap v 0.5
    snap v 0.1
    snap v 0.01
    v = 6283.625
    snap v 100
    snap v 15
    snap v 3
    snap v 1

    返信削除
  4. あ、3とかのとき0.5足すの多分変だ。

    返信削除
  5. んーでも、やっぱり合ってるかも?
    snap 7.501 3
    snap 7.5 3
    snap 7.499 3
    7.499の方は6になる

    返信削除
  6. 横から失礼します。
    学生時代の教科書を引っ張って来たらこういう事らしいです。
    fn round val digit =
    (
    local prec = 10.0 ^ digit
    if val >= 0.0 then
    (floor (val * prec + 0.5)) / prec
    else
    (ceil (val * prec - 0.5)) / prec
    )
    う~ん、よく分からん--;

    返信削除
    返信
    1. これは、正と負で四捨五入する仕組みを変える方法ですね!

      サンプルありがとうございます!参考になります!

      削除