今まで使ってきたデジカメ(Sony DSC-RX100)が壊れたため
新しいデジカメを購入した。
買ったのは先日発売されたばかりのCanon PowerShot G7 X MarkII。
コンパクトデジカメだが、1.0型サイズ2,010万画素のセンサーを積んでいる。
持ち運びを優先するので、基本的にこのサイズのカメラしか買わない。
早速、朝のエルを撮ってみた。
毛のディテールもかなりはっきり出ており
背景のボケ味もいい感じ。
噂通り良いカメラだった。
いい買い物をした。
以前ブログに書いたキーボード「キネシス」
http://www.serenelight3d.com/blog55/?p=1777
自分の場合は通常のキーボードを使っているときに
右手首の痛みがひどくなったため、手首に負担をかけない
エルゴノミクスキーボードを色々試した結果
最後にキネシスに落ち着いた経緯がある。
本日、Houdiniのトレイナー向けのセミナーがあり
講師の方(Houdiniを開発された方)もキネシスを使っているとの話があった。
キネシスでHoudiniを使ってる人がいるのが今日わかって
妙な共感を覚えた(笑)
ただ自分の場合、キネシスに完全対応できたわけではない。
キネシスだとタイプミスも結構あるし、タイプのスピードは以前より遅くなった。
しかし手首の痛みは全くなくなったので今後も使っていく。
教科書「Houdini SOP&VEX編」がついに完成した。
1年がかりで執筆していた教科書。
最終的に全522ページ、オールカラー、A4サイズの書籍となった。
持った感じは辞書レベルの重さ。
教科書タイトルにもあるように、この書籍は全編オールSOP&VEXの内容で構成されており
一貫して「プロシージャル」というテーマに沿った内容になっている。
書籍ではSOP4割、VEX6割程度の内容になっている。
また、この書籍は学校で使用する教科書になるため、Houdiniの本質を理解するためにも
シェルフは極力使用せず、オペレーターを一から作成していくスタイルをとっている。
さらに今回、アルゴリズムを解説し、それを実際にVEXを使って実装していく章なども盛り込んだ。
VEXを使用する上で重要になってくる数学理論にもかなりのページを割いて解説している。
SOPを理解するためには本の中でいかに良質なチュートリアルを揃えるかが
重要になってくるため、チュートリアルに関しては今回かなりの分量を準備した。
(計17チュートリアル)
さらにVEXやSOPの章では使用頻度の高いオペレーターや関数をカテゴリー別に分けて解説した。
その際、わかりやすいサンプルコードやサンプルネットワークを付けて解説するように心がけた。
今回は26部しか作らないらしいが(自分のクラスの学生分)
需要があれば、いずれ外部向けにも出版したいと考えている。
ちなみに、この教科書は4月から日本電子専門学校の
CG研究科2年生の授業で使用していきます。
最近またHouidiniのL-systemを触っている。
L-systemを使えば再帰ループよって様々な植物モデルを
文字コードの羅列で作成できる。
文字コードには以下の様なものがある。
F 枝を伸ばす
& 枝のX軸回転
/ 枝のY軸回転
+ 枝のZ軸回転
“ 枝の伸長率
! 枝の太さスケール
; 枝の回転スケール
T 重力
[] 新しい枝に分岐
~ 枝のランダム回転
これらを再帰ループのメカニズムの中で使用していくと
様々な様相の木々が作成できる。
今回L-systemを使って様々なテストをしてみた。
まずはスタンダートな木の作成。
次にタイプの異なる木を作ってみる。
まずは幹、太枝を生成して…
さらに小枝を生やして…
最後にランダム要素を追加してメッシュを生成。
さらにL-systemの文字コードを細かく調整。
Houdiniを使えばコピースタンプを使って
バリエーション増やすことも簡単。
これぞプロシージャル。
よく忘れるので、HoudiniのデータをMayaへエクスポートして
VRayでレンダリングするやり方を書いておく。
1.RopOutputDriverなどでジオメトリを連番OBJファイルへエクスポート
2.以下のバッチを実行。
for %%T in (*.obj) do ply2vrmesh “%%T” “%%~nT.vrmesh”
これで連番objファイルを連番のVRayメッシュへコンバートしてくれる。
Alembicであれば.objの部分を.abcへ書き換える。
(ちなみにbgeoファイルはエラーが出てコンバート不可だった)
ply2vrmeshはVRayに付属するコンバーター。
事前に環境変数のパスを通しておくこと。
3.MayaからVRayProxyを作成し、2で吐き出したvrmeshを読み込む。
その際ファイル名を次のように設定するとパディング4の連番vrmeshを読み込んでくれる。
パス\ファイル名.<frame04>.vrmesh
以前作った血管アニメーションのバージョン2。
今回は全てをSOPのWrangleで実装しておりDOPは使用していない。
通常POPを使うような部分もSolver SOPで代用している。
Wrangleにおけるポイントクラウドの扱いや、
動的なグループの組み換えがわかるようになれば
SOPでできることが格段に増えると実感した。
Houdini Vein Test ver02 from shuichi sakuma on Vimeo.
血管が広がる開始点は自由に設定でき、かなりのパラメータをUI上に公開してるので
パラメータからWangleのVEXが制御できるようになっている。
Houdini備忘録
AttributeWrangleについて
AttributeWrangleをダブルクリックして中に入るとAttributeVopがある。
さらにAttributeVopをダブルクリックして中に入るとSnippetがあるが、
AttributeWrangleに書いたコードは実際にはこのSnippetに記述されるように
なっている。
肝要なのはこのSnippetがCVEXコンテキストで実行され
特定のコンテキスト内で実行されるわけではないこと。
よって、以下のグループ系関数を
AttributeWrangleに記述するとエラーとなる。
// pop,sopコンテキストのみで有効な関数
void addgroup(string group_name, int point_number)
int ingroup(string group_name, int point_number)
void newgroup(string group_name)
void removegroup(string group_name, int point_number)
ついでにCVEXコンテキストで有効なグループ系の関数をまとめてみた。
// stringには0-10や@Cd.x>0.5のような一時的なグループを使用することができる
// 空の文字列の場合すべてのポイント(プリミティブ)に相当する
int [] expandpointgroup(string filename, string groupname)
int [] expandpointgroup(int input, string groupname)
int [] expandprimgroup(string filename, string groupname)
int [] expandprimgroup(int input, string groupname)
// ポイント番号で指定したポイントが指定したグループ内にあれば1を返す
int inpointgroup(string filename, string groupname, int pointnum)
int inpointgroup(int input, string groupname, int pointnum)
int inprimgroup(string filename, string groupname, int primnum)
int inprimgroup(int input, string groupname, int primnum)
// ジオメトリの指定したグループ内のポイントの数を返す
int npointsgroup(string filename, string groupname)
int npointsgroup(int input, string groupname)
// ジオメトリの指定したグループ内のプリミティブの数を返す
int nprimitives(string filename, string groupname)
int nprimitives(int input, string groupname)
// 指定グループにポイント(プリミティブ)を含める
// その際valueには0以外の値を設定する
// 0を設定した場合にはグループからの除外を意味する
// グループが存在しなかった場合は【グループが作成される】
int setpointgroup(int geohandle, string name, int pt, int value, string mode=”set”)
int setprimgroup(int geohandle, string name, int prim, int value, string mode=”set”)
// 現在のポイント/エッジ/プリミティブ/パーティクルが指定グループ内にあるかは以下のやり方で判定可能
if(@group_グループ名 == 1)
// グループへの追加、グループからの解除
@group_グループ名 = 1;// グループへエレメントを追加
@group_グループ名 = 0;// グループからエレメントを削除