日本でハリウッドVFXを制作! 「経産省アイディアボックス」 結果:  
●まとめエントリはこちら ●FAQ ●お問い合わせは左のメールフォームから

2010年8月27日金曜日

本「スタジオプロジェクトDynamics」への補足 (その2)

<追記: @Atsushiさんより「Gauss」に関する有益なアドバイスをいただきました。是非コメント欄もご覧ください。(エントリ下部の「コメント」と書いてあるところをクリックすると見れます>
Mayaスタジオプロジェク「Dyanamics」に関して間違いを見つけました。


2つ目のプロジェクト:「彗星を作成する」のエクスプレッションのところを読んでいたところ、またまた凡ミスに出会いました。

LifespanPPに以下のエクスプレッションを追加します。
particleshape1.radiusPP=rand(1,2)

えっ!?
いま、LifespanPPって書いてなかったか?

とりあえず先へ読み進めてみると

(中略)
ランダムなエクスプレッションをガウスに変更します。
particleshape1.radiusPP=gauss(1,2)


また!?


これをほんの通りに入力しようとすると、この時点でradiusPPは存在していないので当然ながらエラーになる
// Error: Attribute not found or variable missing '$':  particleShape1.radiusPP //


これはひどい間違いですね。
エクスプレッション初めての人だと、うまくいかないけど理由がわからず、自分には向いてないんだとあきらめてしまうかもしれません。
このように、親切に書かれたチュートリアルもちょっとしたミスで、初心者の助けになるどころか、奈落の底へ蹴落とす結果になることもあります。


正解は
radiusPPの部分をlifespanPPに変えてやればOKです。
particleShape1.lifespanPP = rand(1,2);

particleShape1.lifespanPP = gauss(1,2);



まぁどうせ、コピペやってて確認しなかったんだと思いますが校正はだれがやったんだ!と言いたくなりますね。
ちなみにこれは元になっている英語版も同じで、完全に著者もしくは出版元のミスです。
翻訳して日本語版を出版したボーンデジタルさんの落ち度ではありません。
あえて言うなら、翻訳時点で気がついて作者に了解とって修正するぐらいの心意気を見せてほしかったですw


さて、文句を言って終わりではおもしろくないので少し補足しておきます。



<「Gauss」について>
ランダム関数とガウスについて説明してある部分ですが、日本語版だと「正規分布から値が抽出される」とあります。
原文では「pulls numbers from a bell curve」となっています。

この英語「Bell Curve」は言葉から連想できるおり釣り鐘型のグラフのことをさしています。
「正規分布」はこの釣り鐘型のグラフに表すことができるデータの分布のことを指しています。
ちなみに正規分布は英語では「normal distribution」です。





(図:正規分布グラフの例:Wikipediaより)

 正規分布を簡単に言うと、「ある集団のなかに見られるばらつきの統計をとると、釣り鐘型をしたグラフになる(=平均のものが一番多い」ということのようです。

ようするに
正規分布、Bell Curve、は同じ事について、ことなる視点から説明した言葉で、同じ現象をさしています。

これに「Gauss」がつかわれるのは、数学的にこの「正規分布」を裏付けしたカール・フリードリヒ・ガウスの名前をとり、ガウス分布(Gaussian distribution)と呼ばれていたからです。
CGをやっていると、ときどき「Gaussian」という言葉に出会いますが、こういう意味だったんですね。


この様々な呼び方はどのように発生してきたかはWikipedia「正規分布」の歴史のところに説明があります。
ここからすると、

1809年:ガウスにより説明される。「ガウス分布(Gaussian distribution)
1872年:「ベルカーブ」という言葉が使われる。
1875年:「正規分布(Normal Distribution)」が使われる。



要は、この分布から任意の値を取り出して、LifespanPPに当てているので、パーティクルの寿命は以下のようなバリエーションとなります。

短い寿命: 少ない
平均的な寿命: 多い
長い寿命: 少ない



不思議に「rand」関数だとまんべんなくランダムになり、ランダムなのにきっちりそろった感じになってしまうため、「Gauss」を使った方がいいというのがここでされている説明ですね。

ちなみにその後にある「よりリズミカルに見えます」というのは自分にとってはよくわかりませんでした。

-------------
それにしても大丈夫?っていいたくなるような本ですね。
凡ミスすぎます!

2 件のコメント:

  1. きっと誤植をあえて放置することで、読者の学習効果を高めようという意図に違いないw
    ……という冗談はさておき。


    乱数を正規分布で発生させる際の注意点です。

    通常、rand(1,2)の場合は1~2の間で均等に値が選ばれます。
    gauss(1,2)の場合は1.0や2.0は少なく、1.5付近が頻出します。
    ここまではmelonさんの解説どおり。

    気をつけたいのが、gauss(1,2)だと1以下や2以上の数字も発生するということ。
    0.9とか2.5とかが混じってくるんです。
    それもかなりの確率(たぶん3割ちょいのはず)で。
    低確率ながら、10.0とかの数字が出ることすらあります。
    当然、rand(1,2)の場合は絶対に1~2の数字しか出ません。

    このへんの数学的特性を知らずにgauss()を使うと、「あれ?」ってことになりがちです。
    こういうことを、さらっとでも書いてくれる入門書があるといいんですけどねー。

    返信削除
  2. @Atsushiさん。毎度すばらしいコメントありがとうございます!!
    返事がおそくなってすみません。

    なるほど、Gaussだと指定した数字を「中心」にその近辺で値が選ばれるいうあいまいさがあるんですね。
    なんとまぁまぎらわしい。
    いきなり10とかの値がでると、パーティクルだと結構致命的なことになりかねませんね。
    (まあLifespannPPをIDで指定して削除すればいいのかもしれませんが)
    エクスプレッションである値以上になるときはクロップするようにしないとコントロールが聞きにくいですね。
    ほんと、このあたりの情報って、一般的な入門書からは抜け落ちているなと思います。

    返信削除