2013年2月5日火曜日

近況

もしかしたら「萌えるCGテクニカル読本」よまれてこのサイトにこられた方も居るかも知れませんが、見ての通り、ここ1年ほどアップデートされないで止まったままです。

このブログ「魔法使いの弟子」は元々MayaジェネラリストからHoudiniスペシャリストへ転身するために記録と、以下に早く習得するかその手法を編み出すためのメモをかねて書いていたのですが、途中から有料チュートリアルなども参考にし始めました。
さすがに有料で公開されている内容を記載するのはマズイと思い、有料チュートリアルの内容を含む個人バージョンと、含まない「一般公開版」にわけたのですが、なにぶん管理能力のない自分には、二つのブログなど両立できず、なんだかぐちゃぐちゃになってしまったので、そのまま個人バージョンのみのアップデートを続けて時間が出来たら一般公開版を整理しようと思っていました。

その後はEvernoteを使うようになり、目的のためには編集も容易で検索も早いEvernoteだけになってしまいました。


そうこうしているうちに、Houdiniスペシャリストとして仕事をする機会がえられたため、しばらくはそちらへ集中するためにブログの更新はストップしました。
現在も仕事を継続中、一人前になるために自分のことで精一杯。
しかも、そのうち契約切れるので次の仕事をさがさなくてはならず、忙しい状態が続く見込みで更新再開の予定はたっていません。


仕事をしている間も様々なノウハウやTIPSをEvernoteには記録し続けてきてはいるのですが、まだ仕事で一人前になるためで精一杯でブログの更新をする余裕はありません。

でも、いつしかその内容をこのブログデ公開できたらと思っています。

過去の内容については、このブログの検索でいろいろご覧いただけますので、ご活用下さい。
 
またTwitterでは@melonvfxとしていろいろくだらないことつぶやいてますので 、みかけたら声かけて(スルーして)やって下さい。

2012年2月7日火曜日

メモ:Basics : ForEach I (ビデオチュートリアル)by Peter Quint

Basics : ForEach I by Peter Quint

foreachSOPの概略

-ForEach SOP
-For Eachの代わり
-プリミティブグループに対する繰り返し処理
-アトリビュートによる繰り返し処理
-ある操作を複数回繰り返す


FroEachは複雑で、最もデバッグするのが難しいので、できれば使用は避ける方がよい。
同じような効果を、ほかのSOPのパラメータにエクスプレッションを入れることで実現できる。


<<forEachを使わない例>>
1)gridSOPを作成し中に入る。
2)gridSOPのOutputにPolyExtrude(SOP)を作成。
 Translate Z: rand($PR)


<<forEachの使用例>>
1)gridSOPを作成し中に入る。
grid1(SOP):
Orientation: XY plane
Rows: 2
Columns: 2
これによりPrimitiveは1つになる。
(マス目一つの状態。もしRow3,Coumns3にすると一つのGridが4分割され4マスできる、この場合はPrimitiveは4となる)

2)grid1(SOP)のOutputにPolyExtrude(SOP)を作成。
PolyExtrude(SOP)
Inset: -1(入力例)

※このInset値「-1」はAbsolute値となる。
プリミティブのサイズに対するRelative値ではないため複数の異なるサイズプリミティブを、一つのforEachを通して使用するときは危険である。
そのため、forEachを通す前に、バウンディングボックスなどを利用して値をRelative値にしてやると良い。
Inset値: -0.1* max(max($SIZEX, $SIZEY), $SIZEZ)
$SIZEX,$SIZEY, $SIZEZはバウンディングボックスのサイズである。

maxエクスプレッション:二つの値を比較して大きい方を返す。
http://www.sidefx.com/docs/houdini11.1/expressions/max
使い方:max(value1, value2)
例:  max (5,3) = 5
このエクスプレッションではバウンディングボックスの最大値を取得している。
まず$SIZEXと$SIZEYの値を比較し、最大値を取り出し、
さらに、それを$SIZEZ比較し最大値をだしている。
ようするにバウンディングボックスの一番大きな値を取得してそれを-1/10している。
Gridのサイズが10ユニットで、中心から+X側5ユニット、ーX側5ユニットである。
結果的にこのエクスプレッションで「-1」という結果を得るわけだが、
グリッドのサイズが(現在の10x10から)変更して5x5になっても1/10である「-0.5」が得られるようにしている。
スケール比で必ずInsetがGridサイズの1/10になる。


3)Polyextrude1(SOP)を選択した状態でPolygonタブからPolysplitをクリック
ビューで右クリックメニューからsnap  to perpendicularを選択し、底辺から1/4ぐらいの位置を分割。
右クリックメニューからFinish Splittingをクリック。(Enterでもよい)
Polysplit1(SOP)が作成される。

ノート:forEachを使うとうことは、Houdini内ではこのフローを毎回繰り返し処理するということである。
ここでフェイス番号を表示すると分割した部分の下の方の番号は「5」であることがわかるが、毎回同じこのフェイス「5」を処理することになる。


4)Polysplit1(SOP)のアウトプットにPolyextrudeSOPを作成
Group: 5
Translate: -0.5*max(max($SIZEX, $SIZEY),$SIZEZ)
これでバルコニーの形状ができる。
ーーーーーここまでが複製したい元形状を作るフロー

5)
Polyextrude1(SOP)
Polysplit1(SOP)
Polyextrude2(SOP)
の3つを選択し「コピー」

6)
forEach(SOP)を作成。
For: Each Group
foreach1(SOP)の内部に入り「貼り付け」する。

7)each1のアウトプットをpolyextrude1のインプットに接続する。

7)Geometryレベルに戻りgrid(SOP)を作成。
gird2(SOP)
Rows: 5
Golumns: 5
Orientation: XY plane

※ここでのforEachは各「Group」に対して働くので、このプリミティブを個別のグループに分離する必要がある。

8)grid2(SOP)のアウトプットにpartitionSOPを作成。
Patition SOP:
ユーザーにより用意されたルールに従いポイントやプリミティブをグループ化する。
例えば、各ポイントをそれぞれpt_(ポイント番号)という名前のグループに入れたければ「pt_$PT」とういルールを入力する。
http://www.sidefx.com/docs/houdini11.1/nodes/sop/partition

partition1
Rule: face_$PR
これにより各フェイス(プリミティブ)はface_1などの通し番号がつき、それぞれが1グループとなる。

9)partition1(SOP)のアウトプットをforeach1(SOP)の左端のインプットに接続。
foreach1(SOP):
Group Mask; face*

※これで各プリミティブにバルコニーが作られる。

(注)このメモはビデオチュートリアルを見ての私的なメモで、完全な記録ではありません。
各自の利用は自己判断でお願いします。
抜け落ち、間違いの指摘は歓迎です。

2012年1月25日水曜日

ネットワークペインの最大化

チュートリアルでよく使われて居るショートカット。
ネットワークペインの最大化: ctrl + b
その右上にパラメータ・ペインを表示: p
(その他の画面の表示は 最大化された画面内で右クリック> Viewing Control で選択できるし、ショートカットも知ることが出来る)

2011年12月31日土曜日

メモ:Basics : Volumes II (ビデオチュートリアル)by Peter Quint

Basics : Volumes II by Peter Quint


Houdiniのボリュームへの入門、第二部ではVolume Ramp(SOP)をボリュームの値を調整するために使います。
また同様にVOPコードを使うためにVolume VOPを使います。



--------------
<<Volume Ramp(SOP)>>
1)volumeramp(SOP)を作成
2)isoSurface(SOP)を作成
Implicit Function:  ($Y+1)*0.5
Build Volume: On

$Y値に伴う値の変化 
0 > (0+1)*0.5 = 0.5
1 > (1+1)*0.5 = 1.0
2 > (2+1)*0.5 = 1.5
3 > (3+1)*0.5 = 2.0
4 > (4+1)*0.5 = 2.5
5 > (5+1)*0.5 = 3.0
6 > (6+1)*0.5 = 3.5
7 > (7+1)*0.5 = 4.0
8 > (8+1)*0.5 = 4.5
9 > (9+1)*0.5 = 5.0
10 > (10+1)*0.5 = 5.5

これは下から上に向けての濃度グラデーションで表現される。

3)iso1(SOP)出力を、volumeramp1の入力へ接続
※iso1からのフローは1つのVolumeしなかいことに注意。

4)volumeramp1(SOP)
NewName:Cd
Scalar Ramp:適当に二つの山谷を作る。
(谷となったところは透明に山の所は濃くなる)
Use Color Ramp: オン

「User Color Ramp」をオンにしたことでここからのVolumeは3つになる。
Red、 Green、 Blueのカラーの3つのボリュームになる。
入力されるボリュームはカラースプライン(Color Ramp)にフィードされ、色情報が付加されて出力される。

--- カラーを確認するにはレンダリングする必要がある。
5)カメラとディレクショナルライトを作成して設定。
6)Material Paletteで「Basic Smoke」マテリアルを作成
7)/objレベルでgeo1を選択
Materialタブ
Material > Chooser > basicsmoke
8)Create Render Node >Mantra
レンダリングしてみる。

Color Rampの左側の色が下部に右側の色が上部に適用されることがわかる。


<<Volume VOP(SOP)>>
1)isoSurface(SOP)を作成
Implicit Function:  ($Y+1)*0.5
Build Volume: On

2)isosurface(SOP)のアウトプットに、volumeVOP(SOP)作成
※エラーが起きる。
Warning: Cannnot find primitive attribute 'name' , binding volume as 'density'.
これはisoSurfaceはデフォルトではname(名前)を持っていないからである。

3)isosurface(SOP)とvolumevop(SOP)の間にname(SOP)を作成
作成した時点でエラーは消える。
Group: 0 (現在入力されるプリミティブは1つで番号は「0」である)
プリミティブ番号「0」に以下のNameをつける)


もう一つの方法は、
4)volumevop(SOP)
Volume Bindingsタブ
Autobind by Name オフにする。
Number of Bindings: +ボタンをおして1にする。
primitiveはひとつなので、「0」を入力。
Name : density

これでプリミティブはDensityにバインドされる。
このDensityをベースに計算が行われ、ボリュームに対してフィードバックされる。
※Autobind by Nameはオンに戻して次へ進む

5)volumevop(SOP)にダイブする。
parameterノード作成
ノード名:myvol_in
parameter Name: myvol
Invisible: オン

6)myvlo_inノードをデュプリケート
ノード名:myvol_out
デフォルトでは同じパラメータ名(ここではmyvol)は一つのノード内では使えないので、myvol_outのパラメータはグレイアウトしている。

Use This Node to Set Parameter Attributes : オンにする。
Export: Never > Alwaysに変更

7)Turbulent Noiseノード作成
volumevopglobal1のポジション(p)を turbnoise1(Position)に接続

8)multiplyノード作成
turbnoise1のノイズ(Noise)をMultiply1の入力(inpupt1)に接続

9)myvol_inのmyvolをmultiply1のinput2へ接続

10)multiply1の出力(product)をmyvol_outのinputへ接続

11)volumevopglobal1のdensityとvolumevopoutput1のdensityの接続を解除

12)ノードの接続をVEXコードで確認
turbnoise1ノードを右クリックして「View VEX Code...」を選択

View Code画面で
// Code produced by : multipoly1
myvol = noise * myvol;
となっている。



--------------
※ Volume マテリアルのボクセルについては
SideEffectsのMantra Master Classでカバーされている。


(注)このメモはビデオチュートリアルを見ての私的なメモで、完全な記録ではありません。
各自の利用は自己判断でお願いします。
抜け落ち、間違いの指摘は歓迎です。

2011年12月11日日曜日

メモ:Basics : Volumes I (ビデオチュートリアル)by Peter Quint

Basics : Volumes I by Peter Quint


HoudiniのVolumeに関する入門
まずVolumeを見ていきます。
- Volume IsoOffset(SOP)を使って作り、それらの値を調整します。



--------------
<Volume (SOP)>
簡単なボリュームの作成
1)Geometry(OBJ)ノード作成 
2)file(SOP)を削除
3)Volume(SOP)を作成
Name: myvol
Initial Value X:0.5


Rank
どのような種類の値をボリュームで使用するのか

「Uniform Sampling」はノード中クリックで表示される詳細にある「Volume Resolution」と同じである。

例:
Volumeのsizeが1,1,1のとき、Uniform Samplingが10のときVolume Resolutionは[10,10,10]となる
Volumeのsizeを1,2,1にして、Uniform Samplingを10にすると、Volume Resolutionは[5,10,5]になる。

※ようするに最大sizeの分割数がUniformSamplingと同じになる。


Rankを「Vector」にすると3つのボリュームをオーバーラップして持つことになる。
それぞれ違う名前をもつことになる。
0:myvol.x
1:myvol.y
2:myvol.z



--------------
<IsoOffset(SOP)>
ジオメトリをコンバートしてボリュームを作成する。
1)Sphere(SOP)を作成する
2)isooffset(SOP)を作成する。
デフォルトではサーフェイスを作るだけなのでボリュームにするにはOutput TypeでFog Volume, SDF Volumeを設定する必要がある。
(ここではFog Volumeを選択)

Fog Volume:オブジェクトの中にある各ボックスは値1、外のボックスは値0となる。

SDF(Sign Distance Field) Volume:中心から最も近いサーフェイスまでの距離の情報を使う。
サーフェイスから中はネガティブ値になり、サーフェイスから外はポジティブ値になる。
※内部がスフィアの形状に雲がない状態になるので外からはわかりにくい。


Offset:入力ボリュームのサーフェイスをオフセットする。

Laser Scan:カップなどの中がへこんだ形状では正しく計算されない。その場合はこれをOffにしてみる必要があるかも知れない。


--------------
<IsoSurface (SOP)> 
インプットジオメトリ無しでボリュームを作る事が出来る方法

実際には、入力ジオメトリを接続することは出来るが、ボリュームサイズは形状を使うことができるがいろいろと問題がある(ヘルプ参照)
例:
1)Isosurface(SOP)を作成
Implicit Function:noise($X,$Y,$Z)
Build Volumeをオンにしてボリュームを表示する。



--------------
<Volumemix(SOP)>
ボリュームを変更したり、結合する。

例1)二つのインプットがあるが1つだけのインプットでもいい。
1)先ほどのiso1(SOP)を左のインプットに接続
IsoSurfaceを
Mix Method:User
Value:$V(デフォルト)*0.5
ボリュームのノードを半減させる。

例2)二つのボリュームを混合することが出来る。
isooffset1を右のインプットに接続
Mix Method:Multiplay

結果としてノイズのボリュームがスフィア内部にだけ存在するようになる。



(注)このメモはビデオチュートリアルを見ての私的なメモで、完全な記録ではありません。
各自の利用は自己判断でお願いします。
抜け落ち、間違いの指摘は歓迎です。

2011年11月22日火曜日

メモ:Basics:選択(Selection) (ビデオチュートリアル)by Peter Quint

Basic Selection by Peter Quint

- オブジェクトの選択
- ポイント、エッジ、フェイスの選択
- ループ
- 選択の拡張と縮小



--------------
grid(SOP)
sphere(SOP) ->polygon
box(SOP)

box(OBJ)内部に入り
torus(SOP)を作成しtransformで移動、mergeでboxとマージする。

※ これでビュー上では4つのオブジェクトがあるように見える。
しかしながらHoudiniではboxとtorusは一つのオブジェクトとして認識されており、

objレベルでこれらを別々に選択する事は出来ない。


<選択>
選択(Selection)モード(ショートカット:s
Show Handleモード(現在選択している状態でEnterを押すとこのモードになる)


<選択モードの種類>
何を選択しているかを決めるのは左端ツールバーの上4つで決められる。
●オブジェクト:Object Select Mode(ショートカット:
●コンポーネント:Geometry Select Mode(ショートカット:2(ポイント)、3(エッジ)、4(フェイス)、5(バーテックス)
●パーティクル・システム:Particle Selct Mode(ショートカット:6
●ダイナミック・オブジェクト:Dynamics Select Mode(ショートカット:


<オプション>
●オプションはこれらのアイコンを右クリックして表示。
●3Dビュー内で右クリックすると選択状態を切り替えるオプションが表示される。
●PreferenceでPopup Menu Selectionを設定する事も出来る。
TreeビューでFilterにオブジェクト名(例:boxを入れて)リストからオブジェクトを選択することも可


<選択方法の違い(オブジェクトモードでの説明>
オブジェクト選択モード(ショートカット:1
選択ツール(ショートカット:

※選択ツール・アイコンを右クリックで選択方法のオプションが表示される。
Box Picking: クリックして選択もしくは、ドラッグで矩形を描いて複数選択できる。
選択に追加(Add to Selection): Ctrl + Shift  (追加のみ、選択解除不可)
選択をトグル(Toggle Selection): Shift (追加/選択解除可能)
選択から除く(Remove from Selection): Ctrl (選択解除のみ、追加不可)
選択を入れ替える(Replace Selection): (ショートカット無しの通常モード)


<右クリック・オプション(ビュー内)>
全オブジェクト/ジオメトリ選択(Select All Objects): a または Ctrl+a
全オブジェクト/ジオメトリ選択解除(Select No Objects): n
オブジェクト選択反転(Invert Object Selection): Ctrl+i
境界選択(Select Boundary): Shift + B (選択範囲の境界のみ選択)
選択範囲縮小(Shrink Selection): Shift + S 
選択範囲拡張(Grow Selection): Shift + G
-- ループ選択機能 --
※エッジ、ポイントを選択すると赤い矢印が現れる。
●矢印の向きを変える: Shift+R
●矢印方向の次のコンポーネントを選択: F
●ループ選択: L


<コンポーネント(Geometry Select)モード>
2: ポイント
3: エッジ
4: プリミティブ(フェイス)
5: バーテックス

●コンポーネントは1度に1オブジェクトのコンポーネントのみ選択できる。
●通常、ジオメトリ選択モードの時、オブジェクトレベルでオブジェクトを選択すれば(自動的に)ジオメトリ・レベルへ降りる。
●あるモード(例:エッジ)でコンポーネントを選択した状態で、別のモード(例:ポイント)へ切り替えたとき、選択されたコンポーネントに含まれるものが選択状態になる。(例:エッジ1つ選択状態 →その両端のポイントが選択状態)

※ フェイス選択モード
フェイス・ノーマルをビュー表示すれば、フェイスを直接選択する代わりにノーマル

をクリックしてそのフェイスを選択することが出来る。

一つのオブジェクトコンテナで複数のジオメトリがあるときに一つのジオメトリを

全選択するには。(例:box(OBJ)内のTorus(SOP)の全ポイント選択)
Select Connected Geometry(ショートカット:0でトグル)


(ショートカット:bで切り替え)
Select Front and Back Facing (正面と背面のフェイスを選択)
Select Front Facing Only (正面フェイスのみ選択)
Slect Back Facing Only (背面フェイスのみ選択)


(注)このメモはビデオチュートリアルを見ての私的なメモで、完全な記録ではありません。
各自の利用は自己判断でお願いします。
抜け落ち、間違いの指摘は歓迎です。

2011年11月18日金曜日

メモ:Basics: Polygons II (ビデオチュートリアル)by Peter Quint

Basics: Polygons II  by Peter Quint

<Subdivde(SOP)の使用>
1)Box(SOP)
2)フェイスを全選択
3)Facetを適用
Unique Pointsをオン
4)Subdivideを適用

※各面が分割されるが、平面の形状は保っている。

5)FacetをOffにする。

※各面が分割され、球体に近い形になる。
これは元のBoxの頂点がつながったままだからである。

6)「Override Crease Weight Attribute」をオンにして「Crease Weight」のスライダを動かしてみる。

※Weightの数値が大きくなると折り目が鋭角になってくる。



<Consolidate>
以下の説明で使用されるネットワーク
box(SOP) -- Point(SOP) -- facet(SOP)
Point(SOP):  Add Normal
Facet(SOP): Unique Points オン


1)Facet(SOP)のUnique PointsをOnにする。

「Consolidate」の説明
バラバラのポイントを一つにまとめたければConsolidateを使う事もできる。
しかしConsolidateを使うよりは「Fuse(SOP)」を使った方がよい。



<エッジラインの中程に残ったポイントを削除する>
以下の説明で使用されるネットワーク
box(SOP) -- Point(SOP)
Point(SOP):  Add Normal

1)EdgeLoopツールを使いboxを分割する。(Polysplit SOPが作成される)
2)選択(Select)モード(sキー)でエッジ二つを選択し、Dissolveツールをクリック
エッジが削除されdissolve(SOP)が作成される。
※エッジの真ん中にポイントが残る。

3)真ん中のポイントを選択して移動(tキー)する。
edit(SOP)が作成される。

4)edit1(SOP)が選択された状態で、Facetノードを作成
「Remove Inline Points」をオンにする。
※しかし何も起きない。(ポイントは消えない)

5)これは角にあるポイントからの閾値が低すぎるからで
Distanceの数値を上げてやるとポイントが削除できる。
※例:0.2



<ノーマルが反転したフェイスを修正する>
1)Box(SOP)でトップのフェイスのみを選択し、3DビューでTabメニューから「reverse(SOP)」を作成
※トップのフェイスのみNormalが反転する。(NormalをDisplay表示するとよい)
このフェイスの反転はモデリング時などに時々みかける現象である。

2)全フェイスを選択する。
※これにより全てのノーマルの方向を比較しどちらの方向を向いているのかを判断できる。

3)Facet(SOP)を作成し、「Orient Polygons」をオンにする。
※これでノーマルの反転が戻る。




<ポリゴンを平面化する>
※モデリング時に非平面ポリゴンが発生することはよくある。
これを修正する。
1)Box(SOP)で選択モードで一つのポイントを移動して非平面ポリゴンにする。

2)非平面のポリゴンを選択し、Facetツールをクリックするか、3DビューでTabメニューから「Facet(SOP)」を作成

3)「Make Planar」をオンにする。

※ビデオでは、全プリミティブ(フェイス)を選択しているがエラーが起き、フェイスを1つだけ選択しなおしている。

※複数の平面を選択して平面化するには、Divide(SOP)を使い三角ポリゴンに変えたほうがよい。


(注)このメモはビデオチュートリアルを見ての私的なメモで、完全な記録ではありません。
各自の利用は自己判断でお願いします。
抜け落ち、間違いの指摘は歓迎です。