2010/12/15

Ambient Occlusionのアルファ抜き

アルファシリーズ第3弾は、テクスチャアルファで切り取ったオブジェクトにAmbient Occlusionを適用させるには。です。

下の図は、左から、BA_raylengthを使用したもの。
真ん中は、Card/Opacityで切り取ったものに対して、AO。
一番右は、オブジェクトの形を切り取って、AO。



当然、一番右のくりぬいた結果が正解です。

左の、BA_raylengthでは、Tracing Depthに限界が見えます。Far planeを調節して、下の方までAOを行き渡らせることが出来るみたいですが、結果があまり良くありません。

真ん中は、一見良さそうに見えるのですが、Ambient Occlusionシェーダーは、テクスチャの透明を判断しません。オブジェクトの形を見て結果を出しています。
ですので、これは正しくありません。

そこで、Final Gatheringを使用したAmbient Occlusionを設定します。
比較的新しく投入された、mib_fg_occlusionシェーダーを使用します。
このシェーダーは、FGを使い正しくray判定を行い、AOを出力するシェーダーです。



わざわざAOを出すためにFGを使用するのはバカバカしいと思いがちですが、物凄い軽いです。
Number of Raysの値は、300くらいでキャラクターアニメーションにも耐えられると思います。
もし、fgmapを出したくないのであれば、ModeをExactにすればfgmapを出力せず、ガチで計算します。
Number of Raysの値は、同じく300くらい。でも、このやり方は、重たいです。オススメしません。

シェーダーのインプット、result_when_fg_is_offは、レンダ設定のFGのチェックがオフになっている場合、このインプットを使うということがマニュアルに書いてあります。
一応、上記の画像では、Ambient Occlusionシェーダーが刺さっていますが、特に必要が無ければ、何も付けなくてもOKです。

以前、調べたときは、Softimageの記事が全く無く、mayaの記事を発見してこうやって使うんだ…。でも、FGかぁ…。
と思ってしまったのですが、骨さんのKさんに存在を教えてもらい見直したら、これでいいじゃんって事になりました。
Kさんどうもありがとう!この場を借りて感謝です。

というわけで、新しいシェーダーもなかなか使えるものがあるなぁ。と思いつつ、少しずつ解析してますが、全く何やってんだかさっぱりわからないものだらけで、マニュアルの書き方をもう少しデザイナよりにしてくれないかなぁ。と儚い願いを毎日していますw

ではでは、アルファシリーズはこの辺で終了です。
また何かあったら、書きますねー。

2010/12/13

Softimage:アルファでアルファ抜き

前回、Spriteの恐ろしさを書きましたが、今回は、比較的新しく追加されたCard/Opacityシェーダーについて書いてみようと思います。

Card/Opacity(mip)シェーダーの一部マニュアルを見てみましょう。

透明度に関連する他のシェーダを使用するときは、最終レンダリングでは木が正しく見え、枝の間から家が見える状態であったとしても、ほとんどの場合Z深度(および他のフレームバッファ)は平面の深度を含むことになります。たいていの後工程の作業では、これは望ましくありません。

この問題を解決するために、mental ray APIにはmi_trace_continueという機能が備わっています。この機能は最初のオブジェクトにヒットしたときの交差がなかったかのように、レイを継続します。カード/不透明度(mip_card_opacity)シェーダはこの機能を内部的に使用し、「標準」の透明度とmi_trace_continueの使用を切り替えて、与えられたしきい値で透明オブジェクトを作成します。


所見だけだとなんのこっちゃあまりよく分かりません。
でも、真剣に読んでいくと、なんとなくすごいシェーダーなんじゃないかと思えてきます。

要するに、レンダリング時に、透明でないといけないところが、オブジェクトの形でレンダリングされてしまう問題を、mi_trace_continueという機能で透けさせるってことがいいたいみたいです。

なので、もしかしたら。と思い試してみたところ、テクスチャのアルファで、アルファ抜きが出来ました!

2枚の板を出して、上の板に、おなじみのXSIロゴアルファ付きをPickerしてアルファを抜き出し、Card/Opacityのopacityノードに差すと抜けます。



アルファ表示では、結果はこんなありさま!



Card/Opacity(mip)シェーダーすげっす。
以前は、マスク出さないと出来なかったのに・・・。便利になったもんだ、Mental Ray。
バージョンアップしているんだなぁ。とひさびさに実感しましたw

とはいえ、あまり使うタイミングは無いかも知れませんが。

では、次は、Ambient Occlusionのアルファ抜きを書きます。

2010/12/07

最近のSoftimageの影の中の影。

最近のSoftimageで、だいぶ経ってしまったのですが、Spriteによる影の結果が変わっていることに気づきました。
その境は、v6.5→v7に移行したときに変更があったみたいです。
気づいた人はいるかも知れませんが、v7以降、Spriteを使用したときに、影の中に影がある状態を作ろうとするとおかしな挙動をします。

6.5で、Spriteを使用し、中のGridに適用させたものです。



結果はこうなって欲しいですし、正しいと思われるものです。



ところが、v7.01では、このようになってしまいます。
2011SP1でもこのような結果になってしまうようです。



これは、由々しき問題!!
正しかったものが、正しくない状態になっているという盲信はちょー危険です。

ですので、以下のように、今後Spriteを使用するのを禁止し、新しく登場した、Card/Opacityノードと、Simple Shadowノードを使うほうが良いと思います。



これで、正しい結果を取り戻すことが出来ました!
Card/Opacityノードをわざわざ何で使うのかというのは次回投稿しますが、かなり便利で、アルファでオブジェクトを抜くことが出来ます。
さらに、今までBA_laylengthを使わないと出来なかった、アルファで抜いたAmbient Occlusionの表現も可能になります。

というわけですので、ソフトも変わるので、私たちも変わらなければならないという教訓を忘れずに、Softimageと仲良くすごして生きましょう!

では今回はこの辺で。

2010/09/04

メモ的ナ何か。

ひさびさの更新です。会社始めて、いままで休んでたギャップっつーのが来て、ひと段落・・・。
だんだん慣れてきました。

今の会社では、SI2011SP1を使っておりますが、なかなかいいバージョンじゃないですか。
ICEコンパウンドもかなり増えて、映像制作で少しずつ取り入れていけそうです。

ただ、ちょっとしたバグがあり、そのメモをちょいと。

Preferenceで、Help LanguageをJapaneseにしても、Englishに戻される・・・。
Docのjpフォルダを、enフォルダにしてダマすしかないようです。
ヴィヴァXSI!!

Scriptで、やっとPythonが標準搭載されたのも束の間
カスタムプロパティのLayout.Logicを使う場合

oLayout.Language = "Python"

としてもvbsとして扱われるようになり、エラー・・・。

その時の対処法は

oLayout.Language = "PythonScript"

もしくは

oLayout.Language = "xsi.SIPython"

で、Pythonとして、やっと動作します。
ヴィヴァXSI!!!

つー2つのバグがありました。
他はよく知らないんですけどね。
まだあるかも知れませんね。

あとは、Dual Quaternionが標準装備されて嬉しい今日この頃ですが
DeformerをGroupで入力するところで、セットしたんだが、変な挙動をしちゃって
使えねーじゃんこれ!!
って思って諦めている人もいるかも知れませんが、Select Deformer from Envelopeを使ってDeformerを選択した後、Groupを作成してセットすれば、100%上手くいきます。
Envelopeをセットしたときの、Deformerの登録の順番がキーポイントみたいですね。

あとは、Deformation Methodのところをぶっ壊して、scalarを刺して0-1の間をぐりぐりするのも面白いですし、WeightMap貼って、ここだけ、DualQ!!にしてもいいし。
いいですね。
面白いですね。

肝心のICE Kinematicsは、あまり検証してませんが、問題点をあげるとしたら、リギングの仕組みが作った人しか解らない。
ってのが一番問題ですわね。
アニメーションしてるときに、ここ切りたいんだけど、ってのは製作者に聞かないと解らず。
ちと面倒くさいなぁ。
なんか、MBみたいに、骨に直接アサインするタイプじゃなくて、フルボディIKのような、テンプレートリグを作って、それがICE Kineならいいんじゃねーかなー。って感じですね。
それなら、使いたくない時はオフするとかで、シンプルになります。

やー、やっぱMBは値段が高いだけある感じがしますね。
伊達な感じがします。
武士を感じます。

ICEもはよHoudiniのように、超強力なコンパウンドをバンバン標準装備して欲しいですね。
まだまだ足らないよねー。
そして、Tipsも足らなくて、誰も手を出さないよねー。
っていう問題は、あと2,3年は続くかなぁ。と思いますた。

あっ。そうそう。Render TreeのUser Toolsをたまたまつついたら、こんなところにCreate SSS Lightmapだと!!!!!!!!!!!
ってのが、ありました。
フツーにNodeに入れといてくれ・・・。めちゃくちゃ探したよ・・・。スクリプトからしか出せないかと思ったよ・・・。
と思ったら、マニュアルに普通に載ってた(笑)
困った時は、マニュアルが一番ということを身にしみて感じました。

という今日この頃です。みなさんも、良いXSIライフを!

2010/02/23

エクセルマスター

いつもスバラシイ記事満載のAquさんのブログに「VBScript vs Python」なる記事が載るとのことですので楽しみです。
これからSoftimageでPythonを使ってエクセルにアクセスしてみたいと思います。 http://d.hatena.ne.jp/Aqu/20100219/1266593788 

実際には、エクセルを使用して、データを作成するのは、あまりオススメしません・・・。
エクセルファイルより、テキストファイルの方がデータの扱いが軽いし楽ですからね。
逆にテキストファイルを中間ファイルとして、そのテキストファイルから、データやエクセルファイルを作成したほうが、良い気がします。
ですが、何かのときに役には立ちそうですね。

まず、モジュールを別途それぞれインストールします。

xlrd 読み込み http://pypi.python.org/pypi/xlrd
xlwt 書き込み http://pypi.python.org/pypi/xlwt
xlutils ユーティリティ http://pypi.python.org/pypi/xlutils

C:\temp\text.xls
その後、エクセルファイルを作成して、アクセスしてみます。

中身は、こんな感じ。 星座の表です。













この中の、ふたご座の英語のセル、(C,3)のGeminiにアクセスしてみようと思います。















コレだけですねー。簡単簡単。

最後の、c.valueは、xlrdのvalueですので、Valueと書くとエラーになりますよ。ご注意ください。

さて、これでリーダーの方は、マネージメントが少し楽になったのではないかなーと思います。
不測の事態を想定して、いろいろ覚えておくといいですね。

 ではでは。

2010/01/28

Softimage:PolygonIslandを使って、PolygonNormalを揃えてみた。

法線についての質問が某掲示板にあったので、解決するすべを考えてみました。
一つのオブジェクトの中に、法線の向きが反転してしまっている場合にそれを揃える問題です。



上の絵は、2つの Sphere を Merge して1つにして、真ん中の Polygon のみを反転させた状態です。
Border Line が見えますね。
真ん中だけ反転しているというものです。

このように、簡単な形状なら、真ん中の Polygon を選んで、Invert Polygons を実行すれば修正出来たことになりますが、ぐちゃぐちゃの場合、労力と気力と根性が必要です。

先ほど、Border Line が見えますとのことですので、ここで効力を発揮するのは、Polygon Island フィルターです。
Polygon Islandは、まさにポリゴンの島を選択するツールです。
これをセットして、F10を押し、Raycastモードにしてから、適当なPolygonをつつきます。
すると、下図のようになります。



Border のところで、選択が止まりました。
なので、これを Invert Polygons で反転してあげます。

というのを数回繰り返せば、向きを揃えることができますね。

数回繰り返すのもバカらしいという方は、スクリプトも作ってみました。
たぶん大丈夫だと思うのだけれど・・・。
今回は、Jscriptです。
バグあったら、教えてください。
あっ。ちなみに、オブジェクトの形状が複雑だと重いかも。
手動の方が良かったりするんですよね。



function GetIslands(in_obj)
{
  var arrIslands = new Array();
  var plyPolygons = in_obj.ActivePrimitive.Geometry.Polygons;
  var arrSeen = new Array(plyPolygons.Count);

  for ( var i=0; i    if(arrSeen[i]){continue;}
 
    var xsiCurrPolygons = new ActiveXObject("XSI.Collection");
    xsiCurrPolygons.Add(plyPolygons(i));

    var fltPolyIslandFilter = Filters("Polygon_Island");
    var xsiCurrIslands = fltPolyIslandFilter.Subset(xsiCurrPolygons);
 
    var plyCurrIslands = Dictionary.GetObject(xsiCurrIslands).SubComponent.ComponentCollection;
 
    for ( var j=0; j      arrSeen[plyCurrIslands(j).Index] = 1;
 
    arrIslands.push(plyCurrIslands);
  }

  for(var i=0;i    AlignNormal(arrIslands[i]);

  return arrIslands;
}

function AlignNormal(pIslandCol)
{
  var oCurPoly = new ActiveXObject("XSI.Collection");
  oCurPoly.Add(pIslandCol(0));
  var xsiCurrIslands = Filters("Polygon_Island").Subset(oCurPoly);
  ApplyTopoOp("InvertPolygon", xsiCurrIslands);
}

for(var i=0;i  GetIslands(Selection(0))

Perforce: 複数のワークスペースを更新するバッチ

batを叩けば全部更新。 @echo off set P4PORT=x.x.x.x:xxxx set P4USER=user set P4PASSWD=password echo %P4PORT% echo %P4USER% echo %P4PASSWD% echo %P4PAS...