fc2ブログ

[3ds max PFlow] Data Operatorでオブジェクトの色をパーティクルに焼き付ける

今回もData Operatorです。
オブジェクトの色を拾って、パーティクルに色を付ける方法をご紹介します。
Data Operatorではオペレータが用意されているので割りと簡単にできるようになっていました。

例としてPlaneを配置し、そこにパーティクルを敷き詰めておきます。 パーティクルを並べるところの解説は今回ありません。
20140730_01_alignParticle.jpg

Planeには、素材辞典の画像を貼り付けました。ここから色を拾おうと思います。 色が分かりやすいかと思いまして。
20140730_02_plane.jpg

結果からお見せしますが、パーティクルに色を焼き付けるとこのようになります。この方法を簡単にですが、解説したいと思います。
20140730_03_vertexColor.jpg

まず、Data OperatorとMaterial Staticをイベントに追加します。 Data Operator 001はパーティクルを並べるためのものです。ここではData Operator 002を追加しました。
20140730_04_addOperator.jpg

(後でも構わないですが)今回は先にパーティクルにアサインするマテリアルを準備します。標準マテリアルを作成して、Diffuse ColorにVertex Colorマップをアサインしています。3ds maxでパーティクルに色を渡してレンダリングするには、Vertex Colorとして色を出力して、それをマップとして貼り付けるという手順が必要になります。
20140730_05_vertexColorMap.jpg

Material Static上で作成したマテリアルを選択します。 これでパーティクルをレンダリングしたときに、Vertex Colorが参照されます。
20140730_06_materialStatic.jpg

続いて、Data Operatorの中を見て行きましょう。
20140730_07_dataOperator.jpg

  1. Select Objectサブオペレータで、参照するオブジェクトを選択します。
    このサブオペレータで参照するオブジェクトを指定します。詳しくはちょっと分からなかったのですが、ここからオブジェクト名とインデックスが出力されます。Select Objectは、複数のオブジェクトを選択することもできるので、インデックス付きなようです。

  2. Closet Point By Surfaceで各パーティクルに最も近いサーフェイスの位置が出力されます。
    Geometoryサブオペレータは、様々な種類の値を出力できる便利なオペレータです。ここでは、Object PropertyでCloset Point By Surfaceを選択します。各パーティクルに最も近いサーフェイス上のポイント(位置)が出力されます。サーフェイス上のの位置はオブジェクトのローカル座標のようです。ただし、出力される値のデータタイプはPairという種類なので、ローカル座標以外のパラメータと一緒に出力されています。

  3. サーフェイス上の色が出力されます。
    ここもGeometoryサブオペレータです。Object PropertyをPoint Colorにします。Point Colorでは、データタイプとしてオレンジ色のObjectとピンク色のPairの入力を求められます。それぞれ入力されると、サーフェイス上の色が出力されます。

  4. パーティクルが作成されたときにのみ評価されるようタイミングを指定します。
    Output Standard(Vertex Color)の右上の下三角マークは、フィルター入力と言います。サブオペレータが評価されるとき、条件をつけるために使われます。例えば、パーティクルIDの何番から何番だけに適用する、などのような使い方です。ここでは、パーティクルが発生したとき(イベントが動き始めたとき?)にだけ評価されるように、フィルターに接続しています。Input Standardサブオペレータで、New In Eventを選択してください。

    ここでのポイントとしては、パーティクル発生時に限定しているので、以降アニメーションして、パーティクルと参照しているオブジェクトの位置関係が変わっても、Vertex Colorは変わりません。逆に言えば、この接続を外してしまえば、位置関係が変われば色も変わる、というように設定することもできます。 (詳細な検証はしていないのですが)

  5. 取得したPoint Colorを各パーティクルのVertex Colorとして出力します。
    各パーティクルにVertex Colorを割り当てます。

そして、設定が済んでしまえば、パーティクルの数や配置を変更しても次のように反映されます。
20140730_08_vertexColor.jpg

以上です。

テーマ: 3DCG - ジャンル: コンピュータ

[3ds max PFlow] WIP パーティクルを整列させる

今回もPFlowのData Operatorです。
ちょっと作りたいものがありまして、その途中経過です。
後々ポイントを解説できたらいいなと思っています。

Data OperatorでパーティクルをSpawnして整列させてみました。 開発元のフォーラムを参考にしつつ、除算と剰余を組み合わせると綺麗に並べることが出来ました。 ビューポート上の赤いPlaneはガイドでしかありません。パーティクルが狙い通りに並んだかどうかを確認するために敷いています。
20140728_01_align.jpg


PFlowViewは下図のようになっています。 パーティクルは1個だけ出して、Data Operator側で増やしています。 右下に表示されたパラメータは整列させるために必要なもので、Expose Parametersして外に出してあります。 Planeの幅と、パーティクルの横の数と縦の数を入力するようにしています。 この例では、16x9=144個のパーティクルを並べてあります。
20140728_02_pflow.jpg


以上です。
Data Operatorを使うとこういったこともできますね。
今回のゴールとしては、ポイントクラウド的な表現をしたいと思って進めています。

テーマ: 3DCG - ジャンル: コンピュータ

[3ds max PFlow] Data Operatorで特定のパーティクルを削除する

PFlowのData Operatorの勉強中です。
今回は、特定のパーティクルを削除してみたいと思います。


花びらが舞うようなシーンを作っていたとします。

20140724_01_rendered_petal.jpg

あるフレームでパーティクルがキャラの顔に重なって邪魔になることがよくあります。
例えば、丸で囲んだところのように。

20140724_02_target_particle.jpg

こうしたときにData Operatorでこのパーティクルだけを削除することができます。
まずData OperatorをEventに追加します。

20140724_03_add_dataoperator.jpg

あくまでも一例ですが、Data Operator上で以下のようにサブオペレータを接続してみました。
パーティクルのIDを指定して、Amount Changeで削除するというような流れになっています。

20140724_04_dataoperator.jpg

  1. パーティクルのIDを出力します。
    Input Standardサブオペレータで出力する内容をID:Birth Indexにします。これでパーティクル毎にIDがIntegerで出力されます。
  2. IDをオフセットするために1を出力します。
    ID番号について、Pflow上ではIDが1から始まるのですが、Data Operator上では0から始まります。1つずれてしまっているので、1を足してオフセットします。数字を合わせた方がIDを指定しやすいのでこのようにしています。ScalarサブオペレータでOutputTypeをIntegerにし、valueを1にします。
  3. IDをオフセットします。
    Functionサブオペレータで入力を2つともIntegerにします。FunctionをAddition X+Yにします。PFlowのIDに合うように、Birth Indexに1を足すことでオフセットします。
  4. PFlowのIDを指定します。
    消したいパーティクルのIDをここで指定します。IDの確認方法は後述します。ScalarサブオペレータでOutputTypeをIntegerにしています。valueにIDを入力します。
  5. パーティクルIDと指定したID番号を比較します。
    IDを比較して一致していれば、trueが出力されるようにしています。一致していないときは、falseが出力されます。ConditionサブオペレータのInputTypeをIntegerにします。入力が一致しているかどうか判定するときは、Output True If Input ValueをIs Equal To Value Aにします。
  6. Trueが入力されたときに、パーティクルを削除します。
    Amount ChangeサブオペレータでTypeをDeleteにします。IDが一致しているときはtrueが入力されますので、ラジオボタンはTrue To Deleteを選択してください。これでIDが一致したパーティクルは削除されます。

パーティクルIDを確認する方法ですが、DisplayオペレータでShow Particle IDsにチェックを入れてください。

20140724_05_particleIDs.jpg

今回の例では273番が邪魔なようでした。

20140724_06_checkID.jpg

そして、そのIDをData Operatorで入力すると削除されます。

20140724_07_deleted.jpg

以上です。

Data Operatorについては、Zで行こう!さんやmemlogさんを参考にさせていただいています。いつもありがとうございます。
日本語の情報がほとんどないのが辛いところですね。そのため、ハードルが高いといいますか。

テーマ: 3DCG - ジャンル: コンピュータ

[3ds max] zookeeperの追記

1年ほど前にzookeeperの記事を書きましたが、その後気がついた点をいくつか。

1.zookeeperをResetしなくても、backburnerでレンダリングが回るようになった。

以前の記事で、zookeeperをResetしてからbackburnerに投げましょうということを書きました。これまではレンダリングでserverが走り始めても、pluginがないとエラーが出て回らないということがありました。ところが、どのバージョンからかは分からないのですが、いつの間にかResetしなくてもbackburnerに投げられるようになったようです。これが本来の使い方だとは思いますがストレスが減りました。(もしかしたら、backburnerのバージョンを2015にアップしたので、その影響の可能性もあります)

2.Dockableで表示した方が安定する。

Dockable in 3ds max にチェックを入れて、zookeeperのダイアログをmaxのUIにくっつけてしまった方が安定するようです。以前はデュアルディスプレイ環境でmaxとは別のモニタにzookeeperを表示するようにしていたのですが、何かの拍子によく落ちました。zookeeperを閉じようとすると固まることもよくありました。数ヶ月前に気がついて、Dockableで作業するようになってからは安定するようになりました。maxを道連れに固まるようなこともほぼ無くなりました。

zookeeper_dockable

日本のユーザーは少ないでしょうけれど、ご参考まで。
私は、MayaのOutlinerの代わりにzookeeperを利用していたのですが、2015からはmaxにもOutlinerが・・・

テーマ: 3DCG - ジャンル: コンピュータ

[3ds max] bipedselが外部参照のbipedを見つけてくれるようにするには

外部参照オブジェクトのbipedでもbipedselが使いたかったので、自分用に手を加えてみました。

bipedsel は3ds max用のスクリプトです。
3ds maxのキャラクターアニメーションに関わっている方で、お世話になっていない人はほとんどいないのではないでしょうか。
bipedsel は、以下のサイトで公開されています。

   d00

作者様、本当にありがとうございます。

手を加えたスクリプトそのものはもちろん公開できないので、手順だけ記載しました。
以下続きは、その詳細です。

テーマ: 3DCG - ジャンル: コンピュータ