cg memo

備忘録をまとめるブログ

Version Icon

この記事はWindows10環境を前提にしております。

f:id:satyk:20190805000103p:plain

Houdiniは、マイナーバージョンを含め複数インストールしている方が多いと思います。
私は毎回スタートにピン留めしていますが、アイコンだけでは一目でバージョンが分かりにくく…

そこで、バージョン番号が書かれたアイコンを自動生成する仕組みを考えてみました。

バージョンアイコンの自動生成

手順としては、

  1. イコン画像を用意する
  2. Python SOP でバージョンを取得する
  3. COPでアイコン画像とバージョン番号を合成して出力する
  4. Hbatchでhipを実行する

です。

イコン画像を用意する

まずはベースとなるHoudiniのアイコン画像を用意します。
私は「Quick Any2Ico」というフリーソフトを利用して、exeからico(アイコンファイル)を抽出していますが、そのあたりはご自由にどうぞ。
f:id:satyk:20190805002616p:plain

Python SOP でバージョンを取得する

後の互換性のため、今回はなるべく低いバージョンのHoudiniでhipを作ると良いかもしれません。

f:id:satyk:20190805003227p:plain
まず Python SOP を作って、現在起動しているHoudiniのバージョンを取得します。

ver_tuple = hou.applicationVersion()
ver_string = ','.join(map(str,ver_tuple))
ver = ver_string.replace(',','.')

#check
print ver

applicationVersion() では、メジャーバージョン、マイナーバージョンなどがタプルで返ってくるので、ここでは全て文字列に変換してつなげています。
得られたバージョンはいったんDetailのアトリビュートに入れます。

geo.addAttrib(hou.attribType.Global, 'version',"",create_local_variable=False)
geo.setGlobalAttribValue('version', ver)

PythonではDetailのことを Global と書くのでよくハマりました。
また、文字列の場合は addAttribdefault_value が利用できないので、別途setしてやる必要があります。

f:id:satyk:20190805004641p:plain

COPでバージョン番号をアイコンに合成する

COP2 Network を作って、その中でアイコン画像を加工していきます。

File COP でベースになるアイコン画像を読み込み、
Font COP で、さきほどDetailに格納したバージョン番号を参照します。

`details("../../python1","version")`

文字列は detail ではなく details というようにsが必要なので、ここは expression のハマりポイントな気がします。

f:id:satyk:20190805013008p:plain

COPはあまり詳しくないですが、文字の色や位置を調整して、こんな感じ…?
最後に ROP File Output します。

f:id:satyk:20190805012929p:plain

出力するファイル名の末尾にもバージョン番号を入れると分かりやすいかもしれないですね。

$HIP/houdini_icon_`details("../../python1","version")`.png

ここで Render ボタンを押せばそのまま1枚出力されます。

次に、COPから出て再び Geometry階層に戻ります。
Python SOP をもう一つ作って、今度は ROP File Output の Render ボタンを押すノードを作ります。

n = hou.node('../cop2net1/rop_comp1')
n.parm("execute").pressButton()

このノードをクックすると、画像が出力されます。
 

Hbatchでhipを実行する

※これ以降はライセンスを使用します。

ここで最初のpythonノードの前に、何かしらのメッシュを繋いでおきます。
このメッシュは全く使わないのですが、ジオメトリに実体が何も存在しないと、次のステップの時にエラーが出てしまいました。

f:id:satyk:20190805015414p:plain

いったんhipを保存して、次はバッチファイルを作成します。
テキストエディタを起動します。

mread "C:/test/make_icon.hip"
opcook obj/geo1/python2
quit

mreadコマンドラインからhipファイルをロードし、opcookで指定ノードをクックします。
ファイル名やパス名は一例です。スラッシュの向きはWindowsと違うので注意が必要です。
このファイルは .cmd 形式で保存します。

このcmdファイルを、Houdiniパッケージに含まれている Command Line Tools で実行します。
Command Line Tools は、普通のコマンドプロンプトとは違い、Houdiniの各種スタンドアロンツールなどを、環境変数にパスを通したような状態で実行することができます。

f:id:satyk:20190807004851p:plain
Command Line Tools を起動したら、hbatch の次にさきほどのcmdファイルを指定してリターンします。

hbatch C:\test\icon_gen.cmd

hbatch はHoudiniをコマンドラインから実行するものです。(※ライセンスを使用します)
各バージョンに紐づいて実行されるので、バージョンごとの Command Line Tools で実行するたびに、それぞれのバージョンアイコンが生成されます。

f:id:satyk:20190805021340p:plain

これで各バージョンのアイコン画像ができましたので、前述の「Quick Any2Ico」などのツールを使って ico に変換します。
スタートメニューにピン留めされているショートカットの場所を開き、プロパティから新しいアイコンを指定したら完成です!

f:id:satyk:20190805131909p:plain

うわ~つぶれて見えない…!

…アイコンとしてはもう少し調整が必要そうです。
今ではPDGを使えばもっとスマートに色々できるかもですね。
ではまた。

piece of Procedural - men tan pin

プロシージャルモデリングの習作

メンタンピン

プロシージャル配置の作例(?)としてご紹介してみます。
麻雀用語が多めで申し訳ないです。

メンタンピンの定義(ざっくり):
  1. メンゼンリーチである …牌が全て並んでいる
  2. タンヤオである …1と9と字牌が無い
  3. ピンフである …シュンツで構成されている(シュンツ…1,2,3のような並び)

今回は「局」や「他家」、リーチ棒などは考慮しない事にしました。

手続きの流れ

まずは牌そのものの代わりにpoint群を用意しました。
Attribute Wrangle でどかっと作り、同時に牌の種別を表すアトリビュートを付与します。(m1=マンズの1)
"polyline"で接続されている理由は後ほど説明します。
f:id:satyk:20180822005605p:plain

各牌は4枚づつ存在するので、点群を複製し、同時に残り枚数を表すアトリビュートも付与します。
f:id:satyk:20180822005614p:plain

polylineで接続されているpointの中から、シュンツの「中央」になる可能性のあるpointを抜粋します。
タンヤオなので1と9は除かれます。2と8もシュンツの中央には来ないので除かれます。
f:id:satyk:20180822005622p:plain

point群の中から、1つのpointをランダムで選択します。これが1つ目のシュンツの「中央」の牌です。
f:id:satyk:20180822005629p:plain

ランダムなpointを1つ選ぶ方法は、今回は Sort SOPを使用しました。ソート方法を「Random」にして、次に繋いだGroup SOP で「0」番のpointを選択しています。
ランダムシードは別のノードに一括でまとめています。
f:id:satyk:20180822011432p:plain

候補牌を抜粋する前のpoint群に対して Group Transfer SOP でシュンツの「中央」を教えてやり、
Find Shortest Path SOP で両隣のpointを取得します。このために polylineで繋いでみました。
これでシュンツが1つ決まりました!
f:id:satyk:20180822005641p:plain

Attribute Wrangle で残り牌をカウントダウンし、シュンツのグループは残り数の小さいほうに移動します。
なぜかというと、polylineで繋ぎなおすのが面倒だから、というだけです。
f:id:satyk:20180822005654p:plain

1つ目のシュンツはpoint群から split し、また次のシュンツ候補の中から、同様の処理でシュンツを選んでいきます。
f:id:satyk:20180822005702p:plain

ただし、同じシュンツは3回以上選択されないように小細工をする必要があります。
同じシュンツが2つなら一盃口になりますが、同じシュンツが3つになると三暗刻になってしまい、メンタンピンではなくなるからです(たぶん…)。
f:id:satyk:20180822005710p:plain

最後に雀頭を取得します。
雀頭は、1と9以外で、かつ2枚以上残っている牌からランダムで選択します。
f:id:satyk:20180822005718p:plain

これで全ての牌が選ばれ split されたので、それらを全て Merge します。
f:id:satyk:20180822022106p:plain

見やすいようにリーパイ(ソート)したら…
f:id:satyk:20180822022151p:plain

事前に作成しておいた牌と差し替えて、メンタンピン完成です!
f:id:satyk:20180822022249p:plain

ランダムシードは$Fベースですが、早すぎてデバッグできない…!:D
f:id:satyk:20180822023354g:plain


画像は「麻雀の雀龍.com」の無料麻雀牌画をお借りしました。
麻雀牌画・無料素材(フリー画像)のダウンロード可能! - 麻雀の雀龍.com

Houdini modeling operation

Houdini ではノードを組んでいく事が多いので、MAYA/MAX のようにモデリングすることは頻度が低いかもしれませんが、
それだけにたまに何かやろうとするとよく忘れるので、ビューポートでの基本的な操作をメモしてみました。
マニュアルを読めば良いのですが、ゲーム始める時に取説読まない人間なので…。
ちなみにキーはwindows版です。

マウスボタンの略称も念のためメモ。
LMB … Left Mouse Button(マウスの左ボタン)
MMB … Middle Mouse Button(マウスの中ボタン)
RMB … Right Mouse Button(マウスの右ボタン)


ビューポートカメラ操作

とりあえずAltを押しておけば何とかなります。このあたりは一般的ですね。AltではなくSpaceが公式のようです。

key Action icon
Alt + LMB カメラ回転 f:id:satyk:20180127162823p:plain
Alt + MMBコロコロ ズームインアウト f:id:satyk:20180127162823p:plain

ビューポート上で

key Action icon 備考
Space + 1 パースペクティブ ビュー f:id:satyk:20180127170842p:plain  
Space + 2 Top ビュー f:id:satyk:20180127171012p:plain もう1度押すと Bottom ビュー
Space + 3 Front ビュー f:id:satyk:20180127171232p:plain もう1度押すと Back ビュー
Space + 4 Right ビュー f:id:satyk:20180127171109p:plain もう1度押すと Left ビュー
Space + 5 UVビュー f:id:satyk:20180127171338p:plain  
Space + G 選択にフォーカス    
Space + A 全体にフォーカス    


選択

続きを読む

Houdini Group Work

Houdini でのグループ操作の備忘録をまとめました。ショートカットキーなどはWindows版となっています。


グループの確認

Viewport上で[9]キーで、グループ選択ディスプレイ(?)のON/OFFができます。
point や primitive などのコンポーネントの変更は、歯車マークから。
ハイライト色が見づらければ、右側の色の付いた四角をクリックすると変更できます。

f:id:satyk:20180110132848j:plain


ノード名をグループ名にする

Group (Group Create) SOP の Group Name 欄に、以下のように入力すると、ノード名がグループ名となります。

`opname(".")`

この方法は「gametutor」で知りました。
http://www.gametutor.com/live/home-live/

`$OS

上記でも同様の効果があります。
こちらは杉村さんのワークショップで知りました。ありがとうございます。:)

続きを読む

Houdini Wire Work

Houdini でのワイヤ操作をまとめました。ショートカットキーなどはWindows版となっています。

基本

[Alt]を押しながらノードをドラッグすると、パラメータを保持したまま複製してくれる。

https://i.gyazo.com/0572661ce0b9670bfe82c709a75fa050.gif

ノードを選んで[G]キーを押すと、そのノードにフォーカスしてくれる。

https://i.gyazo.com/584d47d08fde15e52980dbfc2dbb16c0.gif

続きを読む

Procedural Random Agate - breakdown

Allegorithmic の Materialize というコンテストに応募したアセットについて、おこなったアプローチを紹介します。


リファレンス

今回作成したのは、アゲート(メノウ)という鉱石です。
カラーバンドの形状や、水晶の色に無限のバリエーションがあるので、ランダムシードのみでプロシージャル生成を楽しめるようにしました。

Agate - Smithsonian Institution
f:id:satyk:20171128000650j:plain:w300

グラフ

全体の構成は下図のようになっています。特徴的なノードや構成を紹介していきます。

f:id:satyk:20171128003856j:plain:w1000

続きを読む