« 2007年12月 | トップページ | 2008年2月 »

2008年1月

2008年1月31日 (木)

オーバーラップクラスタの恐怖。

クラスタで悩んでしまった。

このオブジェクトには、マテリアルを割り当てたポリゴンクラスタがいくつかある。マテリアルを割り当てた後で、例えばよく選択するポリゴンの一群をセットにしておこうと、マテリアル用途以外のポリゴンクラスタを作る。当然そのクラスタにはマテリアルは与えていない。ただの選択用だから。

しかし。

マテリアル用のクラスタと選択用のクラスタがオーバーラップしていると、選択用のクラスタの部分は、マテリアル用クラスタを無視して、もとのマテリアルをレンダリングしてしまう。ビューポートではそんなことになってないのに。

ちなみに、マテリアル用クラスタからコンポーネントを選んでクラスタを作り直し、そこに再度マテリアルを割り当てると(元のマテリアル用クラスタは削除)、ちゃんと反映されたレンダリングがされる。でも、全部のマテリアル用クラスタ作り直すのめんどくせぇぞゴルァ。っていうか、その後でまた選択用クラスタとか作ってしまった日にゃもう一回やり直しかよゴルァ

と悩んでしまって、これは XSI の不具合だきっとそうに違いないそうだそうだと意気込んでサポートに質問してみると、あっさり解決した。俺が知らなかっただけかよゴルァ。Orz



ということで恥晒しをしておきます。


↓まずは初期状態。ただのポリゴンのグリッドです。
オブジェクトレベルで赤いマテリアルが付いています。

Oc01


↓次にマテリアル用のクラスタを作ります。下半分だけ青くしました。
ビューポートでも、リジョンのレンダリングでも問題ありません。

Oc02


↓次に、選択用クラスタを作ります。選択用なのでマテリアルは与えません。つまりマテリアルには一切影響しないクラスタにしたいわけです。そして、選択用クラスタの一部はマテリアル用クラスタとオーバーラップしています。 が、マテリアルを与えていないので、当然ビューポート上で変化はありません。これでいいんです。問題ないです。

Oc03



↓だがしかし。
レンダリングしてみると、マテリアルに影響しないはずの選択用クラスタの部分は、元のマテリアルである赤にっ。ビューポートの表示とも一致しないっ。これじゃ困るんだよゴルァ。

Oc04



↓結論から言うと、クラスタのプロパティには「順番」があって、数字の小さい方から順に計算されると言う。 ええっ。そうだったのっ。そんなパラメータがあるなんて知らなかったヨっ。基本的すぎますか? だって知らなかったんだよっ。 Orz

クラスタのプロパティを開くと、確かに Sort Order というパラメータがあります。そして、最初に作った方 = この場合はマテリアル用クラスタの方 が小さい数字になっています。

Oc05


↓そこでこの数字を変えて、後から作った選択用クラスタの方が若い数字になるようにすると。
選択用クラスタはマテリアルに影響を与えなくなり、ビューポート表示とレンダリングも一致しました。これでいいんです。問題ないです。

Oc06




ってことで XSI の不具合でも何でもなく、計算させる順番を変えてあげれば良かっただけということになる。クラスタを作った順番で数字が加算されていくようだから、後から作った選択用クラスタが大きい数字になって、結果マテリアルにも影響を与えていた(マテリアルを与えてないので、オブジェクトレベルのマテリアルをレンダリングした)というのも、まあ納得できる。 でも、それがビューポートに反映されないって、どうよ? なんとかしてくれよ Softimage さん。 もしかして Softimage さんの問題じゃないのか? OpenGL の規格の問題?  なんでもいいからどうにかしてくれよ。生ビールおごってあげるから。

と、解決はしたものの、現在いじくっているオブジェクトのクラスタは↓こんな感じでだんだん多くなってきてしまった。これ全部数字入れ直さなきゃいけないの? めんどくせぇよゴルァ。

Oc07

ってことでとりあえず全部数字入れ直したけど、今後めんどくさいので、そのうちスクリプト書くことにする。いつも ゴルァ が俺に開発の力をくれる。ありがとうゴルァ。


| | コメント (2) | トラックバック (0)

2008年1月28日 (月)

BA_Volume普及促進委員会(その2)

BA_Volumeのバージョン3を持っている方、Texture Synthesis ってどういうものなんですか。
額面どおりのことできますか。教えてください。そして委員会に入ってください。


某所の某氏が BA を買ったと聞いて、なんとなく BA が気になり出している今日このごろ。




BA の基本的な使い方を理解するために、シンプルなシーンで実験。プリミティブの Cube と Grid を出してみましょう。

Ba2_1

Cube にテキトーにマテリアルを与えて、RenderTree の Node > Volume > More > Path ボタンで BA フォルダに行き、BA_Volume_cloud を選びましょう。で、マテリアルノードの Volume ポートにぶっ込みましょう。デフォルトの Phong はもう要らないから捨てましょう。で、リジョンを描いてみると、

Ba2_2

こういう絵が出てきます。すでにボリュームレンダリングがされています。Cube の Volume =つまり容積・体積、を満たすレンダリングをするのがボリュームシェーダです。この場合、デフォルトの青い物体で満たされています。

ここで、試しにライトを増やしたり、ライトの明るさや色を変えてみましょう。すると、レンダリングされる絵は何も変わりません。BA_Volume_cloud の中で、ライティングに使うべきライトを指定してないからです。なので BA_Volume_cloud ノードを開いて設定します。

Ba2_3

このように Lights/Shadows タブでライトを選んであげると、ちゃんとボリュームがライトに照らされた状態でレンダリングされました。 
ちなみに、さっきまで見えていた青い物体は、となりの Color タブの中の Ambience の色です。アンビエンス、つまりライトで照らされてない部分に付く色です。さっきまではライトの影響を受けてない状態だったので、ボリューム全体がアンビエンスの色になっていたということです。
3DCGでは基本的にアンビエンスは撲滅すべきだと思っているんですが、BA を使う時はこのアンビエンスを利用しないわけにはいきません。いちいちカゲ側からもライティングしてたら重すぎて話にならないからです。

次に、ライトをいじります。以降の作業を分かりやすくするために、Intensity1 にします。シャドウをオンにして、Umbra0 にします。

Ba2_4

ボリュームが出すシャドウがボリューム自体にも落ちます(セルフシャドウ)。さらに、下の Grid にもシャドウが落ちています。なんだか美味しそうな Cube になりました。ブルーベリージャムでもかけると良いデザートになりそうです。

Intensity を 1、シャドウを 0 にするのは単にその方が分かりやすかろうというだけのことで、別に必須ではありません。BA はシーンのライトの強さ・シャドウの濃さなどに素直に反応しますが、BA_Volume_cloud の中でライトに対する敏感度やシャドウの色などをいじれるので、ライトの数値は分かりやすい値に固定しておいてあとはシェーダのパラメータの方で調整するのがよろしいかと。

ちなみに、リジョン/レンダーオプションで、シャドウの種類を Segmented にしておく必要があるようです。他の種類にするとシャドウがレンダリングされませんでした。

Ba2_5

XSI5.11 までは Enabled ってやつがデフォルトだったと思うんだけど、XSI6 からはこの Segmented がデフォルトになったようです。ヘルプを読むと、Segmented はちょっとレンダリング重くなるけどボリュームシェーダがシャドウを落とすようにするために必要なのだ、という意味のことが書いてあります。よく意味わかりませんが、まあデフォルト設定のままいじらなければ問題ないということにしておきます。

現在はボリュームの密度を何もコントロールしてないので、Cube の中は一定の密度のままになっており、だからこんな杏仁豆腐みたいな Cube になります。一番左の Density(密度)タブの Density input で、試しに密度を下げてみます。

Ba2_6

薄~くなりました。密度はここでコントロールします。で、この密度のコントロールこそがBA の肝になります。Density input が一定の数値のままだと杏仁豆腐になるので、他のノードでコントロールしてあげるのです。分かりやすいよう、ハートな画像をぶっ込んでみました。

Ba2_7

ちなみに UV の設定で Implicit にしてあげないと正しくレンダリングされません。何故かは知りません。で、レンダリングしてみると、

Ba2_8

こうなります。Cube を満たすボリュームの密度を、テクスチャの白黒で制御していることになります。ハートの代わりにモヤモヤの模様をぶっ込んであげてモヤモヤな密度にすると、雲っぽくなるわけです。 しかしテクスチャ画像を用意したのでは、Planar XY やら Spherical やらの表面からぶち抜きで貼られるUVに縛られるので、3Dテクスチャ、つまりプロシージャルを使うことになります。UVW の W が必要だということです。

BA_Volume には BA_Fractal4D_scl というプロシージャルノードが付いてきます。これは、BA のフリー版プロシージャル集 BA Shader Collection Essential に入っている BA_Fractal_4D ノードのスカラ版です。BA_Volume_cloud の Density パラメータは RGB ではなくただの数値、つまりスカラ値ですので、スカラ値をぶっ込んでやる必要があります。BA_Fractal_4D を Color2Scalar 経由でぶっ込んでもいいのですが、余計なものを挟まないためにスカラ版の BA_Fractal4D_scl を用意した、って感じでしょうか。

ともかくも、Node > Texture > More > Path ボタンで BAフォルダ 経由で BA_Fractal4D_scl を取り出し、Density にぶっ込んでみましょう。

Ba2_9

ようやく雲っぽい絵になりました。
あとは、BA_Fractal4D_scl の中のパラメータをいじりまくって、好みの雲になるようにしていくわけです。Noise タブで Perlin ノイズを Turbulence に変えたり、Texture Support タブで模様の大きさを変えたりすると、結果が劇的に変化します。一番左の Color タブでは出力する数値の色(スカラ値ですが便宜的に色と言います)をコントロールしますが、ここも外観に思いっきり影響を与えます。

Ba2_10

BA_Fractal4D_sclを使わないといけないなんてことはないので、自分の気に入ったシェーダでやればいいと思います。Enhance:XSI なんかも、とても使えそうです。

Ba2_11

ただ、BA_Fractal4D はとても使えるので、結局これでやることが多くなる気はしますが、どうでしょう。誰か BA と相性のいいシェーダ教えてください。

BA_Fractal4D_scl が1個だけで済むことは少ないでしょう。大きさや模様の種類を変えて複数用意し、それらを掛け算や引き算でミックスし、その結果を Density にぶっ込んでやることになる場合が多いと思います。 Cube のカドを見えなくするためにグラデーションともミックスしてやることにもなるでしょう。 この掛け算・引き算などの四則演算がまたクセ者で、計算結果を脳内でレンダリングできないとつらいかもしれません。 基本的には、でかい模様のフラクタルで大まかな雲を作り、小さい模様のフラクタルをディテールとして用意して、でかい方から小さい方を引き算してあげる、というのが典型的なパターンになるのではないかと思います。プロシージャル+ディスプレイスメントで海面を作るのと同じ考え方ですな。

また、Cube のようなオブジェクトではなく、パーティクルに対してこの BA_Volume_cloud を与えるのも、もちろんよくやる手段です。この場合は、パーティクルから情報を持ってくるための別のノードが必要になります(BA_Volume に付属)。これに関してはまた別の機会で書くかも知れません。書かないかも知れません。

さらに BA_Volume_cloud の中にも調整すべきパラメータは死ぬほどあるんですが、それはまた今度書くかも知れません。書かないかも知れません。
ともかく、 BA_Volume_cloud の Density をプロシージャルでコントロールして雲のような外観にするという概念は理解できたのじゃないでしょうか。理解できてませんか。知りません。



しかし、自分で習熟してもいないのに、こういう記事を書いてもいいもんでしょうか。ムズいシェーダです。もう1回同じ雲作れと言われたら土下座します。できません。

続く。
かもしれないし、続かないかもしれません。





| | コメント (0) | トラックバック (0)

2008年1月26日 (土)

BA_Volume 普及促進実行委員会

XPOP普及委員会がまだ解散もしていないのに、BA_Volume普及促進実行委員会が発足した模様です。現在委員を募集しているようです。


久しぶりに BA_Volume の復習をしてみた。ほとんど本家のチュートリアルビデオをそのまんまやっただけなのですが。

Ba_test_marchingstep_005_020_0001

画像は BA_Volume バージョン 2 + XSI6.02です。 まだバージョン3にアップグレードしていません。次に仕事で使うときにすると思います。なんせしょっちゅう使うものではないので・・・・。

シーンの大きさ(スケール)に依存しまくってる感じで、いつでもどこでもどんなスケールでもほぼ同じ結果を得る、というところまでは習得してません、ムズい。ムズいよこのシェーダ。ドイツ人さん、もうちょっと簡単にできないですか。同盟国じゃないですか。どうにかしてくださいよ。次はイタリア抜きでやりましょう。

Ba_scene

しかしこの、シーンデータの軽さとレンダリングの重さのギャップはどうよ。シーン全体で2オブジェクト(プリミティブの Sphere と cube)。ライト1発のみ(シャドウ付き)。 合計70ポリゴン。 レンダリングは 864x486 で1枚3分45秒(Xeon2.8GHz x 2)。自宅のマシンではその 1.5倍くらいかかるように見える。

でもまあ、4分弱でこういう画像が出せるなら良いと思わねばならないでしょう。XSI 標準の機能だけだと、そもそも実現すら難しいであろう画像だから(頑張ればできないことはなさそうだけど)。 静止画なら Marching Step の品質を落とせるので3分弱で済みました。カメラをアニメーションさせたらけっこうフリッカが起こったので Marching Step を Ray も Shadow Ray もどっちも小さい数値にしてレンダリングしたら、3分45秒でした。Normal Shading を切ればもっと速くなるはず。



Foundation の価格の半分以上を出してこれを買うかどうかは意見の分かれるところでしょう。カメラのデータが持っていけるなら、Vue とか Ozone とか Terragen とかの方がいいかもしれません。誰か実験して教えて下さい。 でも、モコモコの雲をどうしても XSI 内で作る必要がある、とかいう人は、今すぐ買うべきです。同盟国を助けましょう。Uボートが増産できます。

月屑が出てきたらこのシェーダも使命を終えるのでしょうか。それとも全くそういう問題ではないのでしょうか。なんでもいいから、もうちょっと簡単で、もうちょっと再現性の良いシェーダにならないでしょうか。僕が慣れていないだけですか。そうですか。なめるな。こちらは日の丸だ。ハーケンクロイツに負けるか。同盟破棄だ。ソ連万歳。

嘘です。応援してます。バージョンアップ続けてください。



| | コメント (2) | トラックバック (0)

2008年1月24日 (木)

XSI Base占拠。

24日午前1時現在、XSI Base がやられとります。
誰だ、こういうことするヒマな奴は。アフォめが。電気アンマかますぞゴルァ。

Xsibasehacked


| | コメント (0) | トラックバック (0)

2008年1月23日 (水)

るんるんDiffpic。 Diffpic を GUI から起動するプラグイン。

先日この記事で書いた Diffpic を、GUI から起動できるようにしてみました。
コマンド手打ちなんかやってられっかゴルァ という方はどうぞ。

 

るんるん Diffpic
http://homepage3.nifty.com/jjj/XSIFiles/Plugin/JJJ_XSI_Plugins.html

Lunlun_menu

Lunlun_ppg

 

Diffpic はそんなに激しく使うツールではないのでわざわざPPG作るまでもねえかなあと思ったりもして、でもなんか簡単そうだったので作ってしまった。実際簡単だった。まあ、いざ Diffpic 使おうって時にコマンド打つのも絶対に億劫に感じるだろうから、このPPGもたまに使うことくらいあるでしょう。たぶん。

作りたてホヤホヤの動作検証不十分スペシャルです。虫がいたら、どなたか、ここにコメントして下さい。


| | コメント (0) | トラックバック (0)

2008年1月21日 (月)

diffpicスタンドアロン。

今日、アンチエイリアス関係の復習のためにチュートリアルビデオなどを見ていたら、diffpic がどうたらとか言っている。調べてみると、XSI には diffpic という2枚の絵の違いを比較して表示するスタンドアロンコマンドがあるという。 ええっ、長いこと使ってるのにそんなコマンドあるなんて知らなかったよ。


先日のアンチエイリアスの記事で、ある程度以上サンプリング回数を上げても重くなるだけで絵は変わらないとかなんとか書いたけど、それを視覚的に確認するとか、そういうことに使えそうなコマンドです。スタンドアロンコマンドなので、コマンドプロンプトからコマンドを手打ちしてやる必要があります。


まず Windows のスタートメニューからたどって、XSI のコマンドプロンプトを開く。普通の DOSコマンドプロンプトじゃだめです。diffpic コマンドにパスが通ってないので。

Cp

するとコマンドプロンプトが開くので、以下のような書式でコマンドを入力。

      diffpic<space>画像1<space>画像2<enter>

<space> はスペースです。DOSコマンドなのでスペースちゃんと入れてやらないと機能しません。

すると、

Diffpic1

このようにウインドウが現れます。2枚の画像の、対応するピクセル同士の色の違いを視覚的に表した画像が生成されます。

試しに画像1と画像2に同じ絵を指定してやると、真っ黒が表示されます。2枚の画像に差はない、という意味ですね。

また、解像度が違う2枚を指定してやると、エラーで起動できませんでした。同じ大きさ同士でないとダメだということです。解像度違ったら比較にならないから当然ですわな。


このコマンドには -i というオプションがあって、これを指定してやると、2枚の画像の輝度だけを比較して表示します。

    diffpic<space>画像1<space>画像2<space>-i <enter>

すると、

Diffpic2

先ほどと同じ2枚の画像を指定しているのですが、- i オプションによってさっきとは違う絵が出てきました。2枚の画像で、輝度に差があるのは右上の部分だけ、ということです。


ってことでこれ、アンチエイリアスその他、レンダリングの設定をもろもろやっている時に、設定変えたら処理は重くなったけどあんまり画像は変わって見えない、なんて時に、実際に画像が違うのかどうか検証するのに重宝しそうです。あからさまな違いはレンダーリジョンで見れるけど、差が微妙な時はこのツールで検証、って感じですかね。で、違いが無い、あるいは少なかったら、レンダリングが重くなることを嫌って設定を元に戻す、というような判断ができると思います。

実際、先日のアンチエイリアスの記事の最後の方に書いてある設定の2つを試してみました。

 画像1に、 min = -1     max = 2      SC = 0.05
 画像2に、 min =   1     max = 2      SC = 0.05

それぞれレンダーリジョン描いて、右クリックで保存し、diffpic に - i で食わせてみました。結果は、真っ黒でした。つまり、min が -1 の時と  1  の時で輝度差が出なかった=エイリアシングには影響してないはず= この画像の場合は min に 1 なんて重くなるだけで必要ない、ということになると思います。

diffpic には他にもいろいろオプションがあるようです。連番画像を調べたりとか、生成された画像を保存したりとか。詳しくは、何もオプションを指定せずに diffpic<enter>と入力するとヘルプが出ます。



ちなみにコマンドには画像のフルパスを書くか、フルパスを書くのが嫌なら cd コマンドでその画像があるディレクトリまで降りていかなければなりません。これはめんどくさいので、コマンドプロンプトと Windows のエクスプローラを同時に開いておいて、コマンドプロンプトにエクスプローラからファイルをドラッグ&ドロップしてやれば自動でフルパスが入力されるので便利だと思います。

Dd

画像1と画像2の2回、ドラッグ&ドロップしてやればいいわけですね。

また、コマンドプロンプト上でカーソルキーの上を押すと、先ほど実行したコマンドが表示されます。もう1回押せばさらにその1つ前、という風に履歴をさかのぼれます。同じコマンドを何度も打ち直すのが面倒なときに、こうして履歴を呼び出して必要な箇所だけ書き直してやれば少し楽です。

・・・・いや、最近の人はコマンドプロンプトなんて使ったことないのかなあと思ってね。 昔は IRIX のシェルで soft<enter> って打ち込んでアプリ起動していたんですよ。おぢさん世代にしかわからない話でしょうが・・・。



しかしこんな便利なコマンド、なぜもっと目に付くように置いておかないのだ Softimage。マニュアル読んだらちゃんと載ってたけど、わかりにくいぞ。それに今どきスタンドアロンコマンドってのもなかろうて。GUI から起動できるようにしてくれ。  ・・・・っていうか、そういうプラグインを作るか。よし、そのうち作ろう。


そういえばこの diffpic について触れていたチュートリアルビデオってのはあの VAST なんですが、アンチエイリアスのセクションの最初の方、なぜかうちの環境では音声だけで画像(動画)が見れないんですよね。 ここの記事で紹介したようにこの VAST のビデオは昔売り物で、自分はそれを買っていたのでその DVD で全部見れましたが、VAST のサイトからも全部見れないと不便だなあ。
例えばアンチエイリアスセクション最初のこれ、あなた見れますか? 音だけじゃない? うちのマシンに何かコーデックが必要? どなたか教えて下さい。



| | コメント (5) | トラックバック (0)

2008年1月18日 (金)

XPOP普及委員会(その6)

だんだん息切れ&先細りに・・・・。


●XPOP Goodies

XPOP の配布ページの下の方に、ちょっとした良いものへのリンクがあります。


・PF_Popup
http://www.paolofazio.com/PF_Popup.htm

とても便利なポップアップです。 選択中のオブジェクトの、

 ・クラスタ
 ・コンストレイン
 ・エクスプレッション
 ・スクリプトオペレータ
 ・Fカーブ

へ、アクセスできます。
使い方は、使ってみればわかります。インストールして、ショートカットを割り当て、何か選択して、ショートカットで起動してみてください。そのオブジェクトが上記のような属性を持っていた場合、それらに即座にアクセスできます。

例えば、このオブジェクトは、クラスタがあり、コンストレインで他のオブジェクトに緊縛されていて、かつ自身にアニメーションも入っています。 このオブジェクトを選んで PF_Popup を起動します。すると、

Pf1

このように、それぞれの情報がポップアップの項目に現れます。この画像は、コンストレインのサブメニューに降りていった様子です。ごらんのように、コンストレインのPPGを表示させたり、コンストレインしているご主人様オブジェクトを選択したり、コンストレインを削除したりできるようになっているのがわかります。
クラスタなども同じです。クラスタを選んだり削除したりするサブメニューがあります。

自分は普段、オブジェクト間のコンストレインの関係を見る場合などはスケマティックを使うのですが、不便なときも多々あります。PF_Popup は、そのオブジェクトさえ選んでしまえばどんな状態からでも即座にこういった情報にアクセスできるので、とても重宝しています。特に他人が作ったデータをいじるときなどは、いったいどこが誰にコンストレインされて何がアレでアレが何になっているか全然わかんねぇぞゴルァ になります。そういうときに、この PF_Popoup様に登場して頂くわけです。まさに救世主です。拝んでください。

この作者、イタリア人でしょうか。彼の WEB サイトを見てみると、他にもツールをいくつか出しているようです。まだ使ったことないのですが今度試してみることにします。 作品をみると・・・・ううむ、ヤヴァい、やヴぁいよこの人は。モノホンのプロフェッショナルキャラクタアニメータと見た。 アンティシペーションとムービングホールドがとても上手いな。 こういう、便利なツールも提供してくれるし映像の才能もあるスヴァらしいお方には、惜しみない拍手と生ビールをおくりましょう。


・xPOPMenu
http://www.xsi-blog.com/?p=96

すいません、これは紹介だけしておいて、自分はしくみをよくわかっていないのです。

前回まで説明してきた XPOPコマンドの作り方、それほど難しくはないものの、実際にやるのはめんどくさいですよね。その作業を、少しでも楽にするためのもの、のようです。要は、ポップアップ項目の記述の部分を、XPOPコマンドのルールから逸脱して、改行入れたりインデントしたりして視覚的に分かりやすく記述しても、ちゃんと XPOP で受け付けてくれるようにするためのもの、っていうことだと思います。Python ですが、自分は Python 知らないのでコードを読んでも解析できません。誰か試して下さい。有用だったら、っていうか絶対有用だと思うんですが、教えてください。




現在、↑と基本的に同じ目的、つまり XPOPコマンドを書くわずらわしさを少しだけ緩和してくれるツールを開発中。ほとんどできたけど、制約が多い。何より、重いのが一番困る。でもしかたない。今の自分にはこれが限界である。近日中に投下予定です。

委員長辞任の日は近い。
っていうか委員の応募が無い。


| | コメント (0) | トラックバック (0)

2008年1月17日 (木)

XPOP普及委員会(その5)

どうですか。XPOP 使ってみましたか。便利になりましたか。
使ってませんか。 そうですか。

おかまいなしに普及委員は働く。



●ポップアップのポップアップ

自作のポップアップをどんどん作っているうちに、問題が出てきます。 

  ショートカットが足りねえ。 Orz

ポップアップメニューというものはその性質上、ショートカット抜きに存在ができないわけですが、これがどんどん足りなくなってきます。 Alt などと組み合わせればかなりの空きはあるにしても、数が多くなると覚えられません。 もしくは、腱鞘炎になりそうな指の開き方をしなければならない配置だったりして、健康にも良くありません。

そういう時はしかたないので、まとめポップアップ=つまりポップアップメニューをポップアップさせるポップアップメニューを作りましょう。

例えば、こういうやつです。

Poppop1

これは自作の PopPop という XPOP です。
 
これの項目を選ぶと、

Poppop2

このように、別のポップアップメニューが現れます。元の PopPop が透けていますが、この画像はわかりやすいように加工したもので、実際は透けません。消えます。

これまでも見てきたように、自作の XPOP を作るには XPOP のコマンドを書いてやらねばなりませんが、その「自作XPOPコマンド達を呼び出すXPOPコマンド」が、この PopPop です。

しくみはまったく同じ。以下が PopPop コマンドの Execute ファンクションです。

function PopPop_Execute(  )
{
    var iCmd = DisplayPop(
                        'CapchanPop;GoGoFoldersPop;EmichanPop;RegionPop;HaikaraPop;'+
                        '---;FilterPop;PF_Popup',
                        'PopPop','nero');
   
    switch(iCmd)
    {
        case 1:CapchanPop();
            break;
        case 2:GoGoFoldersPop();
            break;
        case 3:EmichanPop();
            break;
        case 4:RegionPop();
            break;
        case 5:HaikaraPop();
            break;
        case 6:FilterPop();
            break;
        case 7:PF_Popup();
            break;
    }

    return true;
}

もし前回までの解説を読んだのであれば、もはや説明も不要でしょう。 case の後が、それぞれの自作XPOP コマンドを呼び出すためのコードになっているというだけです。

デメリットは、1ステップ増えることと、一度項目を選んでしまったら、元の PopPop に戻れないことでしょうか。


このように、 ショートカットが足りない/覚えられない/腱鞘炎になった という方は、是非この方法を試して下さい。実際は、それぞれのポップアップに個別のショートカットも割り振った方がいいと思います。もしショートカットを忘れたり腱鞘炎になったりした時の保険として、こういう「まとめポップアップ」を用意しておけば便利なわけです。まとめポップアップを経由するため最初に1ステップ増えるのがちょっと嫌なんですが、腱鞘炎になったらCG屋生命の危機です。そんなこと言ってられません。すぐに導入してください。

まだ続く。


| | コメント (0) | トラックバック (0)

2008年1月16日 (水)

XPOP普及委員会(その4)

現在XPOP普及委員会では、XPOP普及委員を募集しております。
委員の方には、XPOPの普及のために力を尽くして頂きます。
18歳~50歳くらいまでの、健康で、XPOPへの熱意がある方、お待ちしております。
応募はこの記事にコメントとして書いて下さい。
なお、委員に選任された方は、同時に委員長の職にも就いて頂きます。
それと同時に現在の委員長は辞任いたします。

●サブメニューの作り方

サブメニューが作れます。 例よって、HidePro Popup を改造します。
前回の状態に書き足すだけです。

function HideProPopup_Execute( )
{
    var iCmd = DisplayPop("Make Hidden Group;---;Give me 500 nulls;---;I like XSI...[&Man;&Woman]",'HidePro Popup'  ,  'blu');

    switch(iCmd)
    {
        case 1: MakeGroupAndHide();
            break;
        case 2: Make500nulls();
            break;
        case 3: GetPresetModel("Man", "XSI_Otoko", null, null);
            break;
        case 4: GetPresetModel("Woman", "XSI_Omeco", null, null);
            break;
    }
    return true;
}

このように書き換えてみましょう。 すると、

Submenu

こういうサブメニューが付いたポップアップになります。
しくみは、var iCmd = DisplayPop(.... の行の後半の書き方にあります。

   I like XSI...[&Man;&Woman]

こうなってます。 [  ]  このブラケット(括弧)があると、ブラケットの中に書かれたものはサブメニューになり、ブラケットの直前の文字はポップアップの項目ではなく、ただのキャプション=サブメニューの親として機能するラベル  になります。

この場合、I like XSI... までがキャプションです。 で、ブラケットの中の  &Man;&Woman が実際のポップアップ項目です。 ブラケットの中の書き方は今までと全く同じです。セミコロンが区切り、ハイフン3発で横線です。

その後の、case のところを見てみると、新たに3と4が加わっています。サブメニューによって増えた項目は2つですので、このようになります。キャプションは項目ではないので、対応した case 行を書く必要はありません。っていうか書いてはいけません。

●サブサブメニューの作りかた

サブメニューは何層にでも階層化できます。原理は全く同じですが一応例を挙げておきます。

function HideProPopup_Execute( )
{
    var iCmd = DisplayPop("Make Hidden Group;---;Give me 500 nulls;---;I like XSI...[Man...[Face;Body];Woman...[Face;Body]]",'HidePro Popup'  ,  'blu');

    switch(iCmd)
    {
        case 1: MakeGroupAndHide();
            break;
        case 2: Make500nulls();
            break;
        case 3: GetPresetModel("Man_Face", "Otoko_Tsura", null, null);
            break;
        case 4: GetPresetModel("Man", "Otoko_Karada", null, null);
            break;
        case 5: GetPresetModel("Woman_Face", "Omeco_Tsura", null, null);
            break;
        case 6: GetPresetModel("Woman", "Omeco_Karada", null, null);
            break;
    }
    return true;
}

こうしてみましょう。すると、

Subsubmenu

こういうサブサブなメニューになりました。

  I like XSI...[Man...[Face;Body];Woman...[Face;Body]]

↑この部分を、わかりやすいようにスペースを入れて、対応するブラケットに色を付けると、

  I like XSI...[  Man...  [  Face ; Body ] ; Woman... [ Face ; Body ] ]

こうなっています。
いブラケットの親は I like... です。これが全体の親キャプション。
いブラケットの親は Man... です。
のブラケットの親は Woman... です。
そして青と緑は両方とも赤の括弧の中に入っているので、赤の親=つまり I like... 以下に並列に表示されます。

※これはわかりやすく書くためにスペースを入れていますが、実際にスペース入れたらそれが馬鹿正直にポップアップ項目にもスペースとして現れます。

その後の case の部分も変わっているので注意してください。ともかく、 var iCmd = DisplayPop(....  の後に続くポップアップ項目の記述で、左から出てくる順番に 1, 2, 3, 4..... と番号が付くと思えば、ポップアップ項目と case の対応を間違えることはないでしょう。もちろん、ハイフン3発と親キャプションは項目の数字として数えません。

普及委員会はまだ続きます。



| | コメント (0) | トラックバック (0)

2008年1月15日 (火)

安置エイリアス道場。

某所でアンチエイリアスの話をしていて。
実践的なアンチエイリアスの設定方法。
意外と知られてないっぽかったので、ここで解説を試みる。
技術的には多少間違っている所もあるかも知れない。
まあ実用レベルで支障がない程度の正しさはあるでしょう。たぶん。


●前置き

そもそもアンチエイリアスとはなんぞや。
アンチエイリアスとは、エイリアシング(主にジャギー)を軽減するための処理のこと。
ではエイリアシングとはどういう時に起こるのか。
近接するピクセル間のコントラストが高い(輝度差が高い)時に起こる。
解像度が低い場合もエッジを形成するピクセル数が十分でないため起こりやすい。
解像度は変えずにジャギーを軽減するにはどうすればいいのか。
基本的にはコントラストを下げてやれば良い。
コントラストを下げるにはどうすればいいのか。
そのピクセルの色を平均化して行けば良い。
簡単に言えば、ボカせば良い。
こうすることによって、ジャギー=ギザギザの軽減だけでなく、

・ポップイン/アウト=ちらつき
(アニメーションのあるシークエンスで、小さなディテールがフレームによって見えたり見えなかったりすること)

・モアレ(規則正しい繰り返し模様がある部分などで、縞模様になること)

の軽減にもなる。


●実際の処理

XSI(っていうより MentalRayか)は、アダプティブスーパーサンプリングっていうのかな、Adaptive、つまり必要に応じて、必要なだけのサンプリングをする仕組みのアンチエイリアスを行います。無駄に重いことをせずに済むよう、必要かどうかをピクセルごとにチェックして、必要ならばさらにサンプリングの分割数を上げる、という仕組みです。

いじるべきパラメータは、Mental Ray オプションの、

Min Level  --  1ピクセルあたりの、最小のサンプリング分割回数
Max Level  --  1ピクセルあたりの、最大のサンプリング分割回数
Sampling Contrast --  次のサンプリング分割に移行するかどうかのしきい値

Aaparameters

この3つ。 Min と Max は、「分割数」ではなく、「分割回数」であることに注意して下さい。

例えばこれが、

  Min 0
  Max 2
  SC 0.2

となっていた場合、

  最低でも0回は分割しろ(=つまりこの場合、分割しない)
  0.2 以上のコントラスト差があったら、ボカせ。
  それでもダメなら、もう1回分割して、また同じことしろ。
  でも2回分割したらそれでやめろ。重いから3回目の分割はすんじゃねえぞゴルァ。

と言っていることになります。
一応、どういう処理がされるのかを順番に書きます。

1:あるピクセルについて、隣接するピクセルとのコントラストを調べる

2:コントラストが 0.2 以下だった場合 → そのピクセルには何もせず1へ(次のピクセルへ)
 :コントラストが 0.2 以上だった場合 → ボカしてコントラスト下げる

3:もう1回コントラスト調べる

4:0.2以下になった場合 → アンチエイリアス終了、次のピクセルへ
 :まだ 0.2 以上だった場合 → ボカし、それでもダメならそのピクセルを縦横2分割する(4つの小さいサブピクセルに分割)

5:分割されたサブピクセル1つ1つについて、またコントラスト調べる

6:0.2 以上ならさらにボカし、それでもダメならさらに分割する(元から数えて4分割=16サブピクセル)

7:それでもまだ 0.2以上だった場合でも、Max = 2(分割最大回数2)に達したので、もう分割しない

ということをやっています。たぶん。ボカしと分割の順序あたりはかなり怪しいけど。詳しい方、間違っていたら指摘してください。生ビール(約500ml)進呈を検討します。


SCを 0.2 としているということは、いわば輝度差が 0.2以上あればそれはエイリアシングだ、だからボカせ、と言っているようなもんだと思ってもいいと思います。最大回数まで達しても 0.2以下にならなかった場合、エイリアシングが発生してるということです(0.2 をエイリアシングと見なした場合のエイリアシング)。


●調整方法

実際の調整方法(順序)を書いてみます。

1:SCを下げる

ある程度以上細かい模様のある画像の場合、SC をそれなりに低くしないとどうしてもエイリアシングが発生します。なのでまず、SC をちょっと下げます。判定基準を厳しくするということです。判定基準が甘いままだと必要な部分が次の分割に進んでくれないからです。はなからジャギーが発生しにくいような絵の場合は、SC は高い数値のままで Max とかいじり始めてもいいかもしれません。SC も高い数値(甘い判定基準)で済めばそれに越したことはないわけですから。

2:Max を上げる

1だけではまだエイリアシングが発生している場合、Max をちょっと上げます。

3:Min を上げる

それでもダメな場合、Min をちょっと上げます(あらかさまに必要ない場合を除く)。

という順番が良いかと思います。

Minを上げるということは、1ピクセルの最低分割回数を上げるということなので、たとえ必要のない(SC のコントラスト以下におさまってる)ピクセルでも、有無を言わさず分割するということです。画面全に細かいディテールがある場合などはいいかもしれませんが、そうでない場合は無駄です。だから Max を先に上げて、必要なエリアだけ Max の回数に向けて分割が進行するようにします。Min は最後です。

Min と Max が同じ数字の場合は、アダブティブサンプリングをしていないことになります。例えば Min=1 Max=1 の場合、SC の値に関係なく、全ピクセルを1分割することになります。Max も1なのでそれ以上の分割は起こらず、全ピクセル平等に1分割で終了します。結果的に、倍の解像度の画像を min=0 max=0 でレンダリングしたのと同じことになります。たぶん。

分割回数がマイナスの時は、分割と逆のことをします。つまり隣接したピクセル同士を結合させて、でかいピクセルとしてサンプリングします。サンプリングする回数が減るので当然軽くなります。min=-1 とした場合、最初は隣接するピクセルをつなげて大雑把に計算するわけです。ピクセルを1個おき(1個飛ばし)でコントラストを調べると考えてもいいと思います。-2 なら2個飛ばしです。この大雑把な計算で SC の値におさまっていれば次の分割が発生しなくて済むので、軽くなるわけです。

例えば、複雑な模様の部分もあるけど、コンスタントシェーダで単色な部分もある、というような画像をレンダリングするとき、単色部分はコントラスト0なので、 -2 や -1 でも十分なわけです。複雑な部分はそれではダメなので、Max を上げておけばその部分だけ分割が進行してアンチエイリアスしてくれます。Min を 1 とかにした日にゃあ、単色だろうが短小だろうが早漏だろうが、有無を言わさず必ず1分割するので、超無駄に重くしていることになります。上記の「あからさまに必要ない場合」というのがこれです。

ただし、そんなにディテールが細かいわけではなくとも、アニメーションしている場合、特にゆっくり動いている場合は、ピクセルがサンプルの間に入り込みやすいので、そのフレームではそのピクセルが消えてしまいます。次のフレームではまた突然現れたり。これがチラツキ(=ポッピング)です。こういう場合はある程度 Min も上げておかねばならない時があるかもしれません。


●サンプリングを視覚的に見る方法

わかりやすくするために、シンプルなシーンで実験します。新規シーンにプリミティブの球体を取り出して、そのまま何もいじらず、レンダーリジョンを描いてみましょう。
次にRender Region Options の Diagnostics タブで、View Sampling をオンにします。

Viewsampling

この状態でリジョンを再描画してみましょう。

Aa1

↑グリッド状の絵がレンダリングされます。この点の1つ1つがサンプルポイントです。新規シーンでのデフォルト設定は、 Min=-3  Max=-1  SC = 0.3  です。球体の、のっぺりした色の部分と輝度差が大きい部分で、点の密度が違うのがわかると思います。つまり輝度差の大きい部分だけ分割が進行しているわけです。無駄なくエコなレンダリングをしています。

ためしにこの状態で View Sampling をオフにして通常のレンダリングを見てみると、

Aa2

↑エッジは汚いですが、暗い側の付近はそれほど汚くありません。つまりここら辺は、大してサンプリング分割が要らないはずだということです。

次に View Sampling をオンに戻して、Min と Max を上げてみましょう。

Aa3

↑ -1,0とかにするとこのように、のっぺりしてようが輝度差があろうが、同じような点の密度になっています。Min =つまり最低分割回数を上げているので、画像全域で有無を言わさず分割されているわけです。本当に必要なのはエッジ付近だけなのに。実に環境に悪いレンダリングです。


●調整練習

さきほどの、一番最初の状態、つまり新規シーンのデフォルトの状態の絵をもう一度見てみましょう。

Aa4_2

↑エッジが汚いのはもちろんですが、明るい側に変な水平線のようなアーティファクトが出ているのでこれも修正しなければいけません(矢印部分)。

まず、SC を下げていきます。

Aa5

↑0.05 くらいまで下げたら、アーティファクトが消えました。

View Samplingモードでも見比べてみましょう。

Aa6

SC が甘かった頃には分割が進まなかったエリアも、。SC を下げる=判定基準を厳しくしたので次の分割レベルまで進んだことになります。

次に Max を上げます。

Aa7

↑ほぼジャギーを撲滅させるには、この場合 2 くらいでした。しかし、水平や垂直に近いエッジはまだ若干ジャギっています(白い矢印部分)。理論的には、画像がドットの集まりである以上当然、水平・垂直に近い部分が一番エイリアシングが起こりやすいわけです。45度の線が一番起こりにくいです。あ、もちろん正方形ピクセルの場合ですが。

で、Min を上げてみます。

Aa8_3

↑ -1 くらいにしたら、水平・垂直に近い部分もだいたいジャギーが消えました。
ってことでこの画像は、Min=-1  Max=2  SC=0.05  くらいがちょうど良かろうということになりました。これ以上数値を上げても重くなるだけであんまり変わりません。
ためしに Max は  2 のままで、Min を 1 くらいまで上げてみてください。画像はほとんど変わらないのに、あからさまにレンダリングが遅くなったのがわかると思います。渋滞でスピードが出せないことがわかっている首都高を、燃費の悪い昔のアメ車で走るようなものです。環境破壊です。反省して下さい。

以上のようにして設定すると、無駄が少ないアンチエイリアスができると思います。実際、仕事ではこの  Min=-1  Max=2  SC=0.05  付近の設定でいつもやってます(SD解像度の場合)。 HD だと解像度がでかいので、エッジを構成するピクセル数が多い分だけエイリアシングが起こりにくくなり、その分アンチエイリアスの設定を低くできる気がするんですが、HD の仕事が少ないこともあり、ちゃんとは実験していません。誰か実験して下さい。

スヴァらしい解説が↓ここにあります。
http://www.lamrug.org/resources/samplestips.html
自分もこれ(の、古いバージョン)で仕組みを覚えました。


当記事に間違いがあったら、コメントして下さい。自分もちゃんと理解したいのです。もし参考になったら、やはり何かコメント頂ければ、いや、生ビール(約500ml)をおごって頂ければと思います。


続く。かもしれません。続かないかもしれません。


| | コメント (2) | トラックバック (0)

2008年1月13日 (日)

突発性モデリングやりてぇ症候群。

昨年末、もう年の瀬も迫った頃、突発性モデリングやりてぇ症候群に罹患しました。なんでも良かったんだけど、どうせなら美しいものを作りたいと思い、宇宙で一番美しいプロダクト、レスポールをモデリングすることにしました。

が、日々忙しくてまったく進まん。Orz

1日15分とか30分とか、ちょっとずつ。これだと1日にせいぜいパーツ1個作ってバランス見て、バランス直して、それに合わせて昨日作ったパーツのバランスも直して、くらいのことしかできない。

早く分割してぇハイポリにしてぇディテール作りてぇ発作に必死に抵抗しながら、ぐぐぐっと我慢して地道にバランス調整をするのは、つらい。何年経ってもつらい作業である。 ついついベベルとかしてしまうんだけど、べべった後にバランス直したくなったら最悪である。でも今日もその過ちを犯している。Orz  大抵、ベベった後はベベる前と大きさが違うように見えて、ベベル幅を調整するのではなくベースのモデルを調整する必要が出てくることがよくある。こうなると、めんどくせぇこのまま放置してぇこれくらいバレねぇ菌の繁殖を抑えるのにエネルギーを消費する。仕事では時間の制約があるため、この菌が繁殖しても良い場合がある。しかし仕事でないのなら、やはり抑えねばなるまい。仕事は手ぇ抜け。遊びは真剣にやれ。鉄則である。

リアルなものを作ろうというほどの意欲はないが、デッサンの狂った、不細工なモデリングにはならないようにしたいと思っている。でもそんなことより完成へのモチベーションの維持の方がはるかに心配である。こういうものはイッキに作らないとダメなんだよな・・・。あまり懲りすぎて未完になるのは嫌だからテキトーなところでフィニッシュさせよう。

Lespaul_01



| | コメント (0) | トラックバック (0)

2008年1月11日 (金)

XPOP普及委員会(その3)

どうでしょう。少しは普及したでしょうか。普及してませんか。そうですか。



●1行スクリプトではなく、もう少し複雑なことをさせる方法

これまでのポップアップのスクリプトを見てみると、

        switch(iCmd)
        {
            case 1: ToggleVisibility(null, null, null);
                break;
            case 2: ToggleVisibility("*", null, null);
                break;

            }

という風になってます。 つまり、ポップアップを選んだ後の実際の処理は、

    ToggleVisibility(null, null, null);

とか、

    ToggleVisibility("*", null, null);

みたいな、1行で書ける超シンプルなものばかり。もっと複雑なこと、たとえば、うーむ、パッと良い例が思いつかないが、うーむ、じゃあ、「選択中のオブジェクトを新規グループにぶち込んで View Visibility と Render Visibility をオフにしてグループに名前も付けてロックした状態のPPGを表示する」、なんてことをやりたかったとしたらどうればいいか。「Null を500個くれ」なんて場合はどーするのか。

こういう場合は case の後に実行するコードをすぐ書くのではなく、function を用意してそちらを呼び出すことにしましょう。

新しいポップアップを作るのはめんどくさいのでこのまま HideProPopup を改造します。最後の  function HideProPopup_Execute( )  以下を、このように書き換えてみましょう。

function HideProPopup_Execute( )
{
      var iCmd = DisplayPop("Make Hidden Group;---;Give me 500 nulls",'HidePro Popup'  ,  'blu');

      switch(iCmd)
      {
      case 1: MakeGroupAndHide();
            break;
      case 2: Make500nulls();
            break;
      }

      return true;
}

function MakeGroupAndHide()
{
    var oGroup = CreateGroup('HiddenGroup', Selection, null);
    SetValue(oGroup + '.viewvis', 0, null);
    SetValue(oGroup + '.rendvis', 0, null);
    InspectObj(oGroup,null,null,siLock);
}

function Make500nulls()
{
    for (i=1; i<=500; i++)
    {
        ActiveSceneRoot.AddNull('Null_' + i);
    }
}


実際に実行してみてください。ちゃんとグループできましたか。 Null 500個できましたか。
しくみは別に難しくありません。

case 1 の後に続くのは、

 MakeGroupAndHide();

になっています。これは、 MakeGroupAndHide  という名前のサブルーチン(ファンクション。=関数)を実行しなさいという意味です。で、後半に

function MakeGroupAndHide()
{
    うんちゃらかんちゃら
}


というのが出てきますね。これがファンクションであり、うんちゃらかんちゃらの部分に書かれたことを実行します。この場合は、うんちゃらかんちゃらに先ほどの「選択中のオブジェクトを新規グループにぶち込んで View Visibility と Render Visibility をオフにしてグループに名前も付けてロックした状態のPPGを表示する」というスクリプトを書いているわけです。もうひとつの項目 case2 もまったく同じです。 case 2 は Make500nulls() という名前のファンクションが呼び出され、続く { }  で囲まれたうんちゃらかんちゃらの部分が実行され、シーンルートに Null が500個作られます。 ファンクションの名前は何でもいいです。 呼び出す側( case の後)と呼び出される側 function (~) でちゃんと対応さえしていればそれで桶です。

と、こんな感じで、「シーンルートに Null 500個くれ」みたいな、しょっちゅう使うからポップアップに入れたいけど1行では書けないような操作は、ファンクションを作って、ファンクションの中でやればいいと思います。どんな複雑なことでも、スクリプトで記述できる限りは可能です。 当然、スクリプトの知識(自分がやりたい操作を、スクリプトに翻訳して書ける力)が必要になりますが、まあそんなもん、一度その操作を手でやってみて、スクリプトエディタに残された履歴をコピペするところから始めりゃいいんです。

うーむ、まだ終わらない。
つづく。


| | コメント (0) | トラックバック (0)

2008年1月 9日 (水)

XPOP普及委員会(その2)

そして今日も普及委員会活動が続く。
その1で説明したスクリプトについてもう少しだけ詳しく。

これからスクリプトを編集するわけですが、一度閉じたスクリプトを後で再度編集する時は、Plug-in Manegaer から選んで右クリックで Edit を選択します。

Edit

でもこれだと XSI 内のエディタでいじることになるわけで、これが超使いにくいから、自分の好みのテキストエディタで開いた方がいいかも。 その場合は、

C:\users\あんたのユーザ名\Softimage\XSI_6.02\Addons\MyPopups\Application\Plugins

とかいうフォルダに行けば、JS ファイルがあります。これを好みのテキストエディタで開き、セーブし、Plug-in Manager から Update All で桶です。


●ホットキーの設定

var iCmd = DisplayPop("Toggle selected (&h);Toggle &all;Show all &Objects;Show all &Polygons;---;Hide &unselected");

この中で、例えば最初の項目、

 Toggle selected (&h)

を見てみると、(&h) ってのが付いています。これはポップアップメニュー上でのホットキーです。↓実際のポップアップメニューを見てみると、

Popup_2

このように、Toggle Selected の後に (h) という文字が追加されています。これがホットキーです。ポップアップメニュー上で、実際にマウスでその項目を選ばずとも、h のキーを押せばその項目が実行されるということです。 & に続く文字がホットキーです。

もうひとつ見てみます。2つめの項目は、

   Toggle &all

とあります。こちらはカッコはありませんが、 & の直後の文字に下線が引かれてホットキーになっています。 最初の  (&h)  も2つめの &a も仕組みはまったく同じで、& を入れれば直後の文字がホットキーになるということです。 (&h)  の方はたぶん、

「この項目は Toggle Selected という名前の項目にしたい。項目の内容は表示/非表示の切り替えだから、ホットキーは h  が分かりやすかろう。 あれ? Toggle Selected の中に h の文字が出てこねぇぞゴルァ」 

ということでしかたなく後ろに括弧付きで足した、って感じでしょう。


●タイトルと色の変更

まず、そもそもの XPOP コマンドの仕様がどうなってるかを見てみると。

returnValue = DisplayPop( strMenuDescription, strTitle, strStyle )

こうなってます。

strMenuDescription っていうのが、今まで話してきた、セミコロンで区切る項目名です。その後にもう2つ、オプションがあります。 strTitle というのが、ポップアップメニューのタイトルになります。ここに文字列を指定してやると、それがタイトルになって一番上に現れます。  strStyle  というのが、ポップアップメニューのタイトルバーの色です。自由に色を選べるのではなく、simulate, render, animate, model, blu, brite, nero, grad, plain のどれかを選びます。

ではさっそくタイトルと色を設定してみましょう。保存したスクリプトを開き、var iCmd = DisplayPop..... の部分を、以下のように書き直してみましょう。

var iCmd = DisplayPop("Toggle selected (&h);Toggle &all;Show all &Objects;Show all &Polygons;---;Hide &unselected" , 'HidePro Popup'  ,  'blu' );

今までのやつに、 , 'HidePro Popup'  ,  'blu' というのを足しただけです。これで上書きセーブし、Plug-in Manager の Update All で認識させます(XSI内部エディタで編集した場合は Update All の必要ないかも?)。 その後ショートカットを押してポップアップさせてみると、

Title_color_2

こういうポップアップになりました。blu 以外にもひと通り試して気に入ったやつにすればいいでしょう。 今まではこのタイトルと色の指定を省略していたので、タイトルが出ないポップアップになっていたということです。 色はタイトルバーに付くものなのでタイトルを付けないで色だけ指定しても何も変わりません。タイトルを指定して色を省略した場合は、plain がデフォルトとして使われるようです。

ちなみにこのタイトルと色のパラメータは文字列であるため、シングルクォーテーションかダブルクォーテーションで囲まないとダメです。ああ、それで言うと項目を記述する strMenuDescription も同じく文字列なので、やはり頭とケツにクォーテーション要りますね。念のため。

もうひとつちなみに補足すると、コマンドの最初の returnValue = ってのが、このコマンドが実行された後で、コマンドが返してくる値のことです。 今回は var iCmd = DisplayPop..... となっているので、iCmd という変数に返って来た値が代入されます。ポップアップメニューのの最初の項目が選ばれたら1という数値が返ってくるし、3つ目のものが選ばれたら3という数値が返ってくる、という風に XPOP は作られています。この数値を見て、前回のように case1  case2....  という処理の振り分けをやっていることになります。


 

あとはなんだ、もうちょっと複雑な処理をさせるために外部スクリプトや function を呼び出す方法、サブメニューを作る方法、その辺を説明せねば片手落ちになるな。普及委員会に休息は無い。

つづく。



| | コメント (0) | トラックバック (0)

XPOP普及委員会(その1)

XPOPはXSIに自分用のポップアップメニューを作ってくれるスヴァらしいプラグインである。よく使う操作を自分でポップアップメニューにまとめ、ショートカットを作る。ショートカットを押すとマウスの位置にポップアップが現れる。選ぶと、自分で割り当てた操作が即座に実行される。ああなんてスヴァらしい。

しかし。しかし。メニューに割り当てる操作は、スクリプトに埋め込んでやらなければいけない。例えば選択中のオブジェクトを非表示にする操作をポップアップに組み込むとする。まあそんなものは h を押せばできるのだが例としてわかりやすくしてるだけですよ。 で、XPOP には XSI の操作を組み込むためのグラフィカルなインターフェースがあるわけではない。リストの中から「選択中のオブジェクトを非表示」を選んでドラッグ&ドロップする、みたいな小奇麗なインターフェースは無いのだ。

じゃあどうするか。まず選択中のオブジェクトを非表示にするスクリプトを調べなくてはならない。そのために、h を押してその操作をやってみる。するとスクリプトエディタ内に ToggleVisibility(null, null, null); という行がログされている。これが今やった操作のスクリプトである。これをコピーして、自分用の XPOP スクリプトにペーストしてやる。でもポップアップメニューの項目に ToggleVisibility(null, null, null); なんて長ったらしいものが出てきたら嫌だから Hide/Unhide みたいにわかりやすいラベル名を付ける。 こんな操作を繰り返してやっと自分用のポップアップメニューができる。つまり言い換えれば、XPOP とはポップアップメニューからスクリプトを実行するツールなのである。

で、これがめんどくさい。このスクリプトを書くのがめんどくさいのです。特に、ポップアップの順番を後から換えようとしたりすると、スクリプトを開いて、カット&ペーストで順番入れ替えて、上書きセーブして、プラグインをロードし直して・・・・なんてことやってられっかよゴルァ と激怒しているため現在プラグインを開発中。ちょっとだけラクにならないかな、という程度のものですが。

それはともかく、XPOP はとても便利なので全世界の人民が使うべきだと思うんだけど、この、「スクリプトを書く」ということに物怖じしてしまい、それだけのために使っていない人もいるのではなかろうか。そもそも外国製なので解説は英語だし、XPOP の名前だけは知っているが使い方がよくわからないので放置している、という人もいるのではなかろうか。XPOP普及委員会としては、これを思うと夜も眠れない。だからここで解説を試みる。普及委員会の使命である。

以下、XPOP のページにあるチュートリアルに沿って書きます。

1:ダウンロード&インストール

http://www.nycg.org/xpop/
http://rray.de/xsi/xpop.html
(身長が2m50センチもあるお方からの指摘でリンク修正 2009.08.26)

1) ↑このページの下の方にある xPOP20.xsiaddon をダウンロード。
2) XSI にドラッグ&ドロップするか、File > Addon > Install から選んでインストールする。

※自分の場合、XSI6 では mfc71.dll がないとXPOPが起動しませんでした。XSI5では問題なかったのに。もし同じ問題がある人は、

http://www.dlldump.com/download-dll-files_new.php/dllfiles/M/MFC71.d
ll/7.10.3077.0/download.html
 
からでも入手して、XPOP.dll と同じフォルダに入れてみて下さい。XPOP.dllは、

  C:\users\あんたのユーザ名\Softimage\XSI_6.02\Addons\xPOP20\Application\Plugins   

にあります(XSIをCドライブにインストールして、XPOP をユーザアドオンとしてインストールした場合)。あるいは C:\WINDOWS\system32 にぶち込んでおいてもいいのかもしれない。


2:プラグインスクリプトを作る

これから作るXPOPスクリプトは、自作アドオンの一部にしてしまいましょう。

1) File > Plug-in Manager を起動する

2) User Root を右クリック(※) > New > Add-on Directory を起動。
※もちろん User Root じゃなくて、ワークグループ以下でも桶です。

Createaddondir_2

するとダイアログが出るのでアドオンの名前を付ける。

Addonname_2

適当に MyPopups とかにしておきましょう。
以降、自作のポップアップは全部このアドオンの下に入れておけば整理できて良いかと。

次に、この自作アドオンに、新規のコマンドを追加します。

3) User Root 以下を開いて、今作った MyPopups を開き、
  Plug-ins を右クリック > New > Command を起動。

Createcommand_2

4) すると、ウィザードが立ち上がるので、ウィザード内の  Command Name  に   HideProPopup  とでも入力。 Coding Language は JScript にしておきましょう(※)。
  (※)別に他の言語でもいいんだろうけど、当方 JScript しか知りません。

Wizard_2

 

5) 一番下の Generate Code ボタンを押す。すると、アドオンに新規コマンドが追加されたのがわかる。また、同時にコマンドの JSファイルが勝手にウインドウで立ち上がる。

Command_2

6) そのウインドウで Save As.. を選び、Save As Unicode のチェックをオンにして上書き保存してしまう。

Unicode

こうすればスクリプト内で日本語が使えます(ただし XPOP のポップアップメニュー内には日本語は使えないようです)。

7) 一番下までスクロールして、function HideProPopup_Execute(  ) という行を見つける。
  これからここ以下を書き換えます。

Executefunction



3:スクリプトの書き換え

1) Function HideProPopup_Execute(  ) 以下を、次のように書き換える。

まあ最初はこれをそのままコピペしちゃえば良いかと。

 function HideProPopup_Execute( )
  {
        var iCmd = DisplayPop("Toggle selected (&h);Toggle &all;Show all &Objects;Show all &Polygons;---;Hide &unselected");

        switch(iCmd)
        {
            case 1: ToggleVisibility(null, null, null);
                break;
            case 2: ToggleVisibility("*", null, null);
                break;
            case 3: UnhideAll(null);
                break;
            case 4: UnhideAllPolygons();
                break;
            case 5: HideUnselected(null, null);
                break;
        }

        return true;
  }

var iCmd = DisplayPop( "うんちゃらかんちゃら" );

の部分が、ポップアップに現れる項目です。最低限の説明をすると、

・項目は ; (セミコロン)で区切ります。例えばもしうんちゃらかんちゃらの部分が  "gegege;rerere"   となっていたら、gegege と rerere という2つの項目が現れるポップアップになります。
・項目の文字の代わりに ---(ハイフン3発)を書くと、それは項目とは見なされず、区切り線になります。ポップアップで実際に区切り線が現れます。項目が多くなった時に見やすくするためです。

その下の  case1: なんたらかんたら  の部分が、実際に仕事をするスクリプトです。この場合、case1 =  つまり1つめの項目 = つまりさっきのセミコロンで区切っているセクションで書いた一番最初のやつ  がポップアップから選ばれたら、 case1: に続くなんたらかんたらの部分 = この場合 ToggleVisibility(null, null, null); を実行する、ということです。これを実行したあと、case2 を実行してしまわないように、次の行の  break; で処理を中止させています。

ひとまずこれを雛形にして、自分用に書き換えれば良いでしょう。ポップアップ項目を増やしたければ、 var iCmd = DisplayPop( "ららら;れれれ;けけけ;うふふ" ); みたいにどんどんセミコロンでつないで増やせばよいわけです。その分、case の行も増やして、それぞれに実行させたいスクリプトを書けば良いわけです。もちろんcase の行と break; の行はセットで増やしましょう。

もろもろ書き換えたら上書きセーブします。XSI を再起動するか、Plug-in Manegaer の Update All ボタンを押して、上書きセーブされたファイルを XSI に認識させます。



4:ショートカットを作る

ショートカット作らないと意味ないです。
File > Keyboard Mapping で、Custom Script Commands の中に、さっき作った HideProPopoup が入ってるので、適当なキーに割り当てましょう。

Shortcut

これでショートカットを押せばアラ便利。HideProPopup が現れます。

Popup

あとはもう、上記 2-3  からの作業を繰り返して同じアドオンの中にどんどんポップアップメニューを足していけば良いでしょう。だんだんショートカット足りなくなってくるけど。

ふー、けっこう大変だな・・・。
今日はここまでにしよう。

| | コメント (0) | トラックバック (0)

2008年1月 7日 (月)

フリー版 Enhance:XSI が。

最強プロシージャルテクスチャ集 Enhance:XSI にフリー版が。
http://www.shaders.co.uk/enhance_xsi/demo.htm

スペシャルエディションと言うらしい。
有償版では190個以上のノードが入っているんだけど、このフリー版では15種類(9個のテクスチャノード+6個のサポート用ノード)だけに制限されているそうで。サンプルファイルやオンラインヘルプも省略されている模様。でもマニュアルは落とせるな。

フリー版でもこのシェーダ群のパワーを垣間見るには十分でしょう。職場では有償版を使っていますが、毎日必ず使うというようなものではないものの、もはや無いのは考えられません。それらしいのをパパッと手っ取り早く作るのにも使えるし、じっくり使い込めばものすんごいことになると思います(実はまったくそこまで使いこなせていないのですが・・・)。 1ライセンス99ドル。これは安い。 レンダリング無制限バージョンは990ドル。ちと高く感じなくもないが対費用効果を考えればこれでもたぶん安い。買いですよこれは。皆の者、今すぐ買いなさい。

フリー版には EXSI_Hit_Point ノードが入っていなかったので、テクスチャスペース(Coordinate)は XSI 標準のノードで用意する必要があるみたい。Texture_Space_Generator と Vector_State を Intersection Point で使ってみたがどちらも結果は変わらず。これで問題ないみたい。試してないけど Texture_Projection_Lookup ノードで UV 指定ももちろんできるでしょう。

ひとまずフリー版を入れてみてテストした画像。クリックで拡大。
Eee

フリー版に入っていた Peened (丸っぽい模様が出てくるみたいなやつ)と Cellular (よくある細胞膜のような模様が出てくるやつ)と Composite ノード(2つを合成するノード。標準には無いオプションが付いてる mix2colors のようなものかな)を使用。 
うーむ、こうしてみると EXSI じゃないとできないようなものじゃない気がする・・・。もうちょっと EXSI ならではのものを考えて作るべきだったかしら。まあいいか。

ともかく手軽で使いやすくて、標準機能でやろうとすると結構面倒なものでも比較的楽に作れる気がしています。こういうのがあるから、たぶん Softimage さんは将来、あんまりプロシージャルに力入れないだろうな、などと想像してみたり。

謹賀新年XSI。

| | コメント (0) | トラックバック (0)

« 2007年12月 | トップページ | 2008年2月 »