18
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Houdini ApprenticeAdvent Calendar 2020

Day 1

Houdiniでドット絵作成

Last updated at Posted at 2020-11-30

#はじめに
Houdiniでドット絵を作る方法を書いた
使用ツールはHoudini Apprentice 18.5.351

画像生成、コンポジット・・・COP2
レイヤー等編集・・・SOP
タスク管理・gif作成・・・TOP

#1.要点
Houdiniでドット絵を作る上で比較的重要な点を述べる

##リファレンス画像
リファレンス画像はFileノードで読み込める
bandicam 2020-11-11 22-14-48-063.jpg

下のgifはリファレンス画像を見ながらGroup Paintノードを使って星の形にgridをグループ化しているところである
シーンビューではgridのf@Alphaアトリビュートを0にすると透明1にすると不透明になるので見やすい値に変えると良い
output.gif
- Alphaを変えながらGroup Paintノードでグループ化

##画像の生成
VOP COP2 Generatorノードで解像度を設定
bandicam 2020-11-11 22-01-20-578.jpg
bandicam 2020-11-11 22-04-53-928.jpg
- 32x32ピクセルに設定された画像

#COPの画像をSOPへ
SOP内にCOP2 Networkノードを作ると画像をVolumeMeshとして持ち込める
bandicam 2020-11-11 23-23-26-203.jpg
bandicam 2020-11-11 23-25-03-534.jpg

Mesh一つのピクセル一つのポイントとして表現されている
この記事ではMeshの状態のものを編集する

##ペイント
COP2 Networkノードで作られたMesh色v@Cd不透明度f@Alphaポイントアトリビュートを持っている
SOPでこれらのアトリビュートを変更していく

####方法

  • v@Cdを変更すると色が変えられる
  • 透明にしたい部分はf@Alphaを0.0にする
  • 不透明部分は1.0にする

Attribute Paintノードで直接Cdを変更する手もあるが、後から色を変更したくなった場
合などでもすぐ対応できるよう、先に着色する場所をGroup Paintノード等でグループを設定すると良いだろう

Colorノードを使えば指定したグループを一気に染められる


###カーブ・ストロークによるペイント

####方法

  1. Meshはあらかじめf@Alfha0.0に設定しておく
  2. Draw Curveノード等で自由にポリゴンカーブを作る
  3. カーブはv@Cdを編集、色を付けてf@Alpha1.0にする
  4. Meshにカーブからv@Cdf@AlphaAttribute Transferノードで転送するとペイントされている!

bandicam 2020-11-26 00-25-15-343.jpg
- 自由に作ったカーブ

bandicam 2020-11-26 21-46-16-687.jpg
- Meshのポイントアトリビュートv@Cdの編集


###ピクセルパーフェクトな線
ピクセルパーフェクトな線をある程度Houdiniで再現することが出来たので紹介する
output.gif
- 実際にHoudiniで描いた様子

bandicam 2020-11-27 16-04-39-997.jpg
- 主要なノード

pixel_perfect.hipnc


###任意のジオメトリからMesh(レイヤー)へ色を転送

####方法

  1. 好きなジオメトリを用意する
  2. 下の画像の様にMeshと1のジオメトリを並べる
  3. Meshのポイントにベクトルを設定する
  4. Rayノードを使って色(v@Cdやf@Alpha)を移す
  • 法線等のベクトルをポイントに持たせるとRayノードを使ってベクトルの方向にあるv@Cd等のアトリビュートを取得できる
  • RayノードCreate Point Groupにチェックを入れると色が移せたポイントをグループ化してくれる

※このグループはアウトラインの作成にも使える

bandicam 2020-11-27 12-59-48-623.jpg
- Before front

bandicam 2020-11-21 13-47-13-209.jpg
- Before perspective

bandicam 2020-11-21 13-49-53-567.jpg
- After perspective


###アウトライン
bandicam 2020-11-26 22-20-09-283.jpg

####方法

  1. アウトラインを付けたいMeshのポイントグループGroupExpandノード広げる
  • GroupCombineノードで元のグループを引く
  • グループの外側にグループができるのでそこをColorノード等で着色する

bandicam 2020-11-26 22-19-55-299.jpg
bandicam 2020-11-26 22-19-41-222.jpg
- グループのブーリアン


###グラデーション
bandicam 2020-11-26 22-26-25-192.jpg

####方法

  1. グラデーションさせたい場所にカーブを引く
  • Resampleノードf@curveuを作る
  • Rayノードf@curveuアトリビュートをラインから取ってくる
  • f@curveuを使ってColorノードAttribute Rampを付ける

bandicam 2020-11-30 21-27-29-734.jpg

bandicam 2020-11-26 21-56-55-292.jpg
- Curve U Attribute

bandicam 2020-11-30 21-34-42-503.jpg
- Rayノードパラメータ

bandicam 2020-11-30 21-27-53-029.jpg
- Rampによる着色


###Game Boyの色を使う
bandicam 2020-11-29 21-59-30-243.jpg
HoudiniではないがAsepriteには良いプリセットがたくさんある
試しにGame Boyのプリセットを画像としてHoudiniに持っていく

AsepriteからpngでExportし、HoudiniのColor Editorで読み込む
下の画像の赤枠をクリックすると画像ピッカーが表示される
bandicam 2020-11-29 22-28-00-271.jpg

画像をクリックするだけで簡単に色を抽出できる

念のため色をHoudiniで確認してみる
bandicam 2020-11-29 22-35-55-181.jpg
- AsepriteのRGB

bandicam 2020-11-29 22-37-05-761.jpg
- Houdiniで255を掛けたRGB

色の一つはきちんと**(RGB 155 188 15)**になっており、寸分の狂いなく抽出出来ている


##シーンビューでもう少し見やすく

Meshの持っているv@Cdやf@Alphaはポイントアトリビュート
その為シーンビューの映像と最終的に出力される画像にはギャップがある
bandicam 2020-11-21 12-02-38-647.jpg
- シーンビューの映像

####改善方法

  1. ResampleノードでDistance Attributeをpscaleとして作成
  2. Meshの下に接続する
  3. 一辺がgridを作る
  4. 2と3をCopy to Pointノードにつなぐ

bandicam 2020-11-21 12-12-47-168.jpg

bandicam 2020-11-21 12-12-58-150.jpg
- Distance Attribute

bandicam 2020-11-21 12-13-13-353.jpg
- 出力画像に近くなった

ライトのSpecularEmissionを切っておくとなお良い
bandicam 2020-11-26 00-09-56-051.jpg
- シーンビューのライト

##フレーム毎のバリエーション
バリエーションを作りたい部分をたくさんコピーして変更・マージ・必要なフレームの取り出しをする

下の画像ではフレーム毎にEditノードを使ってバリエーションを付けている
またそれぞれのフレームを判別するための識別子をAttribute Expressionノードで作っている
bandicam 2020-11-21 11-26-48-360.jpg
- フレーム毎に変化をつける

Object Mergeノードでワイルドカードを使って一気にマージすると楽である
たくさんのバリエーションを作っていてもNULLノード名前さえ合っていればマージしてくれる
bandicam 2020-11-21 11-31-41-133.jpg
- マージされたバリエーションたち

Blastノードを使うとフレームの識別子からフレームを取り出せる
bandicam 2020-11-21 11-39-25-434.jpg
- i@frameというアトリビュートを基にフレームを取り出す

##SOPのレイヤー(Mesh)をCOPへ
SOPからCOPへの画像の移動は以下のツイートを参考にした

####方法

  1. 事前にSOP内のMesh(レイヤー)をX,Y座標共に0から1の範囲にピッタリ合うように大きさを変えておく
  2. COP内のVOP COP2 GeneratorVOP COP2 FilterノードVOPを組む事でSOP内のv@Cdf@Alphaを画像のR,G,B,Aとして拾ってくる事が出来る

※1は縦・横の比率が変わって問題ない
大きさをピッタリ変えるにはMach Sizeノードが便利だ
bandicam 2020-11-28 22-02-11-851.jpg
- Mach Sizeノードのパラメータ

bandicam 2020-11-21 11-53-00-715.jpg
- VOP COP2 Filterノードによる画像の取得
VOP COP2 GeneratorVOP COP2 Filterノードは入力のワイヤーを繋ぐと上流ノードの解像度を引き継ぐ事が出来る
※解像度を入力する手間が省ける

bandicam 2020-11-26 00-41-39-905.jpg
- VOPによるR,G,B,Aの設定

##コンポジット
VOP COP2 GeneratorVOP COP2 Filterノードで得られた画像を合成していく
最後にROP File Outputノードで画像を出力している
bandicam 2020-11-21 12-25-24-150.jpg

bandicam 2020-11-28 21-20-20-035.jpg

##画像の拡大
ドット絵はそのままだとピクセル数が少なく画像としては小さい
ピクセル数を増やして大きくしたい場合がある

Scaleノードを使うと**解像度(大きさ)**を変更できる
bandicam 2020-11-28 20-52-20-326.jpg
- Scaleノード

下の画像ではScaleノードで縦と横のスケールを10倍にしている
また、Upscale FilterをPointにするとピクセルの形をクッキリ綺麗に保ってくれるのでドット絵的にはよろしいと思う
bandicam 2020-11-28 20-53-07-272.jpg
- Scaleノードのパラメータ

bandicam 2020-11-28 21-03-28-004.jpg
- 大きくなってもクッキリ綺麗な画像

##タスク管理
タスク管理を行わない場合、SOPの計算の前にコンポジットが行われる等意図しない動作も起こり得るようだ
一度全てのレイヤー(Mesh)を外部に書き出してそれをもとにコンポジットする必要がある
bandicam 2020-11-21 12-56-41-997.jpg
- レイヤーの書き出し

bandicam 2020-11-21 12-58-52-921.jpg
- 1フレーム毎にコンポジット

##gif化
FFmpegをインストール・Pathを通すとTOP内でFFmpeg Encode Videoノードが使えるようになる
bandicam 2020-11-21 12-59-17-606.jpg

FFmpeg Encode Videoノードの設定

  • File Tagは上流ノードでコンポジットした画像のタグをfile/imageにしていたのでfile/imageと書く
  • Output File Pathで出力するファイル名を****.gifにする
  • Frame Per SecondとFormatにチェックを付ける
  • 大きさを変更したい場合にはSizeの値を変える

bandicam 2020-11-21 12-40-32-496.jpg

FFmpeg公式ドキュメント

#2.作例紹介
下のgifは実際にHoudiniで作ってみたもの
Dot_Picture.2.gif
- 星と丸い何かが動くgif

全体のノードの構成は下のようになっている
bandicam 2020-11-13 22-21-39-230.jpg

###各ノードの内容

  • cop2net1

 画像の生成・レイヤーの合成を行う処理

  • reference_picture

 リファレンス用画像

  • grid

 Meshの状態の何も書かれていない画像
 サイズをリファレンス画像の大きさに近づけてある
 全てのレイヤーの基本になる

  • library

 何度も行う処理はここにまとめておいた

  • Layers

 レイヤー別にMeshが置いてある

  • topnet1

 1.各レイヤー・フレームのキャッシュをとる
 2.レイヤーの合成
 3.画像の出力
 4.gif化
 この4つを順番に実行させる処理

Dot_Picture.hipnc

#3.今後の課題
カラーパレットの効率的な準備
フレーム毎に持続時間を変える

18
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?