2019年1月23日水曜日

Houdini で作成した物理アニメーションをゲームエンジンに出力する手順 FBXアニメーション編

昨年末ですが、Qiitaに記事を書きました。

Houdini で作成した物理アニメーションをゲームエンジンに出力する手順 FBXアニメーション編


Houdiniで作成した物理シミュレーションによるアニメーションをUnreal Engine 4 に出力する手順です。
物理シミュレーションをゲームエンジンに出力したい場合、トランスフォーム情報をテクスチャ化してゲームエンジンで再生する Vertex Animation Texture (VAT) という方法が有名ですが、こちらで紹介する方法はもう少し手軽な、FBXの中に物理アニメーションも含めて出力する方法になってます。

2018年11月7日水曜日

UVを波打たせる


前回の記事のサンプルモデルで使用している波打つUVを
Houdiniで作成する方法について解説します。


サインコサイン

波打つUVですが、以下のVEXで作成します。

v@uv;
@uv.y += cos(@uv.x*3+(@Frame*0.3))/3;


式内にでてくる数字は見た目の調整用の係数であまり重要ではなく、
ポイントとなるのは以下の部分

@uv.y += cos(@uv.x+@Frame)


分解して解説すると

まず
cos(@uv.x)

cos()というのはコサイン関数で
Houdiniに限らずいたるところで登場する関係でWeb上の情報も豊富なので詳細は省きます。
簡単に解説すると @uv.x の変化、つまりUVのUの値にしたがって、
-1~1の間で波状の値を得ることができます。
sin()関数を使っても同じような結果になります。

この結果を @uv.y つまり UVの Vに足し算することで波打つUVになります。
@uv.y += cos(@uv.x)


さらに引数@uv.xに時間をプラスすることで時間変化に伴いsin()が受け取る値が変化することになり

@uv.y += cos(@uv.x+@Frame)

結果、時間の変化にともなってV値がアニメーションするというわけです。

シンプルな例

では改めて実際に作成してみます。
円柱ではUVのつなぎ目部分などで少し手間が発生するので、よりシンプルなgridで。



今回、@Flameに0.1をかけて、フレームに対する変化の速度をゆっくりにしました。

再生ボタンを押すとこんな感じに波打ちます。



2018年5月10日木曜日

Copy to Point の向きをUVでコントロール

今回は、Copy to Point の Tips を共有します。
UVの形状に応じて向きをコントロールする方法です。

サンプルファイルはこちら→リンク

物体の向きを定めるには

ある物体の向きを定めようとするときには「前」と「上」の2つの向きを指定すれば定まります。

Copy to Point で配置するオブジェクトもこれらを指定することで向きをコントロールすることができます。

Copy to Pointでの向きの制御

Copy to Point では「前」方向を指定するアトリビュートを@N、「上」方向を指定するアトリビュートを@upという名前にすることで、向きをコントロールします。
これらは方向を示すアトリビュートなのでベクトルのアトリビュートになります。
このとき配置オブジェクトにとっての「前」が+z、「上」が+yとなります。


サンプルファイルの場合でいうと、配置するオブジェクトを「鱗」、配置先のオブジェクトを「円柱」と呼ぶとして円柱側のポイントに@Nと@upを仕込むことになります。


UV に応じた向きの制御

UVの向きに合わせて向きをコントロールする方法ですが、簡単に言うと「前」を決める@NをUV由来のデータにすれば良いです。

「UV由来のデータ」とは何かというと「tangent」と「binormal」というベクトル情報です。これはHoudiniに限らずUVを持ったポリゴンモデルなら多分どのソフトのものでも持っている情報で、タンジェントスペースノーマルマップなどで利用されてる情報です。
UV回転させたりすると「tangent」と「binormal」合わせて回転します。
Houdiniでこれを取得するにはUVを持ったオブジェクトに続けてpolyframe SOP を接続すれば取得できます。

一方、配置時の鱗の「上」を決めるベクトル@upは、円柱の法線(ポイントノーマル)をそのまま流用します。これで「円柱の面の向き」=「配置時の鱗の上の向き」になります。
この法線情報もpolyframe SOPから取得できます。

で、Polyframe SOP の設定はこちら。

Normal Name の欄にupを記載(Nomalを@upに代入している)、Bitangent Name の欄にNを記載(Bitangentを@Nに代入している)します。※BitangetはBinormalと同じ意味です。
以上のように設定することで、今回の目的に沿った@up,@Nを作成することができます。

サンプルファイルでは赤のノードの部分です。

この後にCopy to Point を使うことでUVの向きに応じてオブジェクトを配置することができます。

Polyframe SOP より手前の工程の解説は簡単に、以下のとおりです。
UVを持った円柱を準備しているだけです。


サンプルではUVに対して波打つアニメーションを与えてますが、オレンジ色になっている Wrangle SOP で行ってます。
ここでコサイン関数を使ってUVを波状にしているのですが、この解説はまた別の機会にでも解説します。

2018年2月2日金曜日

[Houdini] 直線を分割している不要なエッジの削除

こんにちは、
またまた Houdini の小技記事です。

今回の記事は、直線や平面を分割している不要なエッジやポイントを削除する方法です。

平面上、あるいは直線上のエッジの削除

サブディバイドなどすると、なめらかな形状をつくれてよいのですが、余計なエッジもできちゃって、プログラマさんに嫌な顔をされたりしますよね?
そんなときに有効な方法です。
image.png

グラフ構成はこの図のとおり。「shape4」がハイポリメッシュになります。


対象のハイポリ形状に続けて「Group」SOPをつなぎ以下のパラメータ設定をします。

  • 「Group Type」を「Edges」に
  • 「Include by Edges」の「Enable」をオンに
  • 「Max Edge Angle」を360に設定

つづけて「Dissolve」SOP を繋いで、先程作成したエッジグループを指定してリムーブするという流れになります。

直線上のポイントを削除

次は、メッシュ境界のエッジで直線上の余計なポイントを削除する方法です。

使うノードは「Facet」SOP。

パラメータは以下のとおり。

  • 「Remove Inline Points」パラメータをオンに
  • 「Distance」を0.001に設定(デフォルト値)

すると、直線状にあるポイントが消えてくれます。

「Distance」の値を調整することで、下図のように曲率にあわせてポイントのリダクションも可能です。


簡単ではありますが、今回はここまで。

※独学で仕入れている知識のため、より良いやり方があるかもしれません。
※Houdini のバージョンは 16.5 となります。

2018年1月26日金曜日

[Houdini] カーブを延長

先日 Houdini でカーブを延長する方法が分からず調べた情報を共有します。
カーブに新たなポイントを追加する形で延長する方法になります。

Add SOP でカーブを延長

カーブを延長するには Add SOP ノードを使います。


追加したいポイント数を「Number of Points」欄に入力し、その下に座標を指定
「Polygons」タブで「By Group」タブを選択することでカーブが延長されます。

延長する向きのコントロール

ちなみにポイントIDの大きい側からカーブが延長されます。
逆の向きに延長したい場合は「Sort SOP」でID順を逆にしましょう。

ちなみに、自分的に引っ掛かりポイントだったのですが「Reverse」SOPでカーブの向きを逆にしてもポイントIDは逆にならないので注意です。
カーブの向きとIDは別物のようです><

※独学で仕入れている知識のため、より良いやり方があるかもしれません。
※Houdini のバージョンは 16.5 となります。

2018年1月8日月曜日

[UE4][TIPS] UV DIstortion の仕組み

前回紹介した UV Distortion の仕組みについて解説します。

Unreal Engine 4 の UV オフセット

UV Distortion の理解のために、まず UV のオフセットという基本的なところを確認したいと思います。
UV Distortion はこれから確認する基本の仕組みを使っているだけなので、イコール UV Distortion の解説でもあったりします。

ということで UV のオフセットですが、ご存知「TextureCoordinate」に対して足し算をすることで位置のオフセットが可能です。
「TextureCoordinate」は2チャンネルのベクター情報なので、ここでは 「Constant2Vector」を使って足し算しています。
これはモデルのUVがテクスチャのどのピクセルを見に行くかという「TextureCoordinate」の情報を書き換えることで実現する現象です。
例えばもともと1であったVの値に0.4を足すことで1.4になると、当初V値が1を見に行くはずだったモデルはV値1.4(つまり0.4)に相当するテクスチャを参照することになります。

これをテクスチャ画像で考えると下図のように位置が上にずれることになります。


また掛け算をすることでタイリング数をコントロールすることができますがこれも原理は一緒です。
例えばVに2をかけた場合、もともと1だったV値は2になり、また0.5だったV値は1 になります。

その変化に従って画像を当てはめると下のようになり、画像のタイリング数が変わることになります。

この数字によるUVの計算を画像でやろうというのが UV Distortion になります。

簡単な画像を使って歪ませてみる

ではこちらの「円をぼかした画像」を使って計算するとどうなるのか?
明度の数値を見ると、中央が1(白100%)で周囲が0(黒)になっています。
これを「TextureCoordinateの」V値(Gチャンネル)に足すグラフを作成します。
するとこのようになります。
どういうことかというと、白い部分のみV値に1を足したことになり、その箇所だけ1オフセットさせたことになります。黒いエリアは数値としては0なので足し算しても変化はありません。
さらに1以下の少数値を画像に対して掛け算してオフセット量を減らしてみると

歪みを視認できる程度におさえることができます。


これが UV Distorting と呼ばれるものの仕組みです。

UV への計算に数値ではなく画像を使うことで UV を部分的にオフセットさせて結果テクスチャが歪むというわけです。
Unreal Engine 4 のマテリアルエディタはマイナス値も扱えるので、画像にさらに0.5を引くことでグレーよりも暗い部分を反対方向にオフセットさせることもできます。


また、画像の明度を数値として計算に使っている関係上、その画像の階調が細かいほうがより細かなオフセット量を与えることができます。ということはオフセットに使う画像は1チャンネル32bitのHDR画像を使うとよりなめらかな結果になります。そのへんはメモリと相談しつつの使用となるかと思います。

2017年12月17日日曜日

[UE4][Tips] UV Distortion

今回は UnrealEngine4 のマテリアルのTipsを共有します。

UV Distortion について。
UV Distortion とは簡単にいうとUVの値を変化させてテクスチャを歪める手法のこと。
炎などエフェクト表現で使われる機会が多い技術ですね。


早速つくってみる

どういう仕組でこうなるのかの解説の前にまず作ってみましょう。
上のサンプル動画よりもう少し簡単なものを例に作成手順を解説します。

まず以下のような「歪ませたい画像」と「適当なノイズの画像」を準備します。
※下の画像はそれぞれ画像上で右メニューからダウンロードできます。

・歪ませたい画像


・ノイズ画像



これらをUnrealに読み込みます。
ノイズの画像、アセットをダブルクリックして開いたウィンドウでsRGBのチェックをオフにしてください。


このsRGBのチェックボックスは「色」として扱う用途ではないテクスチャ、例えばマスク用画像などの場合にオフにします。
こうすると例えばレッド0.5の色はそのままの0.5の数値としても扱うことができるようになります。

マテリアルの設定

次にマテリアルを作っていきます。

コンテンツブラウザの [Add New] から新規マテリアルを作成。



歪ませたい画像とTextureCoodinate を下図の用に接続。つまりモデルのUVに素直にテクスチャを貼ります。




この TextureCoodinate からTexture画像につながっている UV情報に手を加えることで UV Distortiom 実現します。
どのように手を加えるのかというと TextureCoordinate の出力にノイズ画像を加算します。
[Add]を作成して下図のように接続。


するとテクスチャが図のように変化します。
元画像と全然違う絵になってしまいますが、これは歪みが大きくて元の形状の跡形がない状態。


歪みを小さくするにはノイズ画像を暗くすると小さくなります。
ノイズ画像を暗くするためには、ノイズテクスチャに1以下の数値を乗算すれば良いので、とりあえず0.2のスカラーパラメータをMultiplyをつかって図のように接続します。

テクスチャが確認できる程度の歪みになります。
この数値を変化させると歪み具合の変化が確認できます。

このマテリアルをマテリアルインスタンスにしちゃえば、数値調整しながらリアルタイムにテクスチャの変化を見られるようになります。

マテリアルインスタンス化の手順は基本操作なので今回は説明しませんが、参考までに手順を動画にしました↓

ちなみに、このノイズをUVスクロールさせるとこの記事はじめのアニメーションが実現できます。


簡単な仕組みの解説


ではどうしてこんな事が起こるのか・・?
細かい説明は次回にしますが、簡単にいうとUV位置を移動(オフセット)させてるだけです。
よくテクスチャをタイリングするときにTexture Coordinate に数値を掛け算しますがあれと原理は一緒です。

次回、もう少し詳しく仕組みを解説してみようとおもいます!

2017年12月3日日曜日

[Houdini]ポリゴンカーブよ、お前は何者?

今回は、最近Houdiniのカーブをさわってて、ん??と思って調べたことを共有したいと思います。
「Polygon Curve」についてです。

Houdiniのカーブの種類

「Curve」SOPで作成するカーブには種類があり「NURBS Curve」「Bezier Curve「Polygon Curve」の中から1つを選択してカーブを作成していくことになります。


それらの違いとしては「Polygon Curve」がポリポリしたカーブでそれ以外が滑らかなカーブといった認識だったのだけど、それ自体は間違いではないのだけどどうもそれだけじゃないことを最近知ったわけです。

どうも「Polygon Curve」はカーブでもありポリゴンでもあるのです。
ポリゴンと言ったらいわゆる「面」のこと。
つまりポリゴンカーブは線でもあり面でもあるんです。

「な、何を言っているのかわからねーと思うが おれも何をされたのかわからなかった。」
というのは言いすぎですがまぁそんな感じ(?)です。

この辺Houdiniをずっと触きた方々には当たり前の概念なのかもなんだけれど、新入りの自分にはなかなか驚きの発見だったのです。

ポリゴンカーブのコンポーネント構成は?

では実際に確かめてみます。
まずシンプルな四角形のポリゴンを「Grid」SOPで作成。


次にその隣に「Curve」SOPで「Polygon Curve」を、図のように4つのポイントを打って作成します。


この状態で「Close Curve」をオンにして閉じたカーブにします。
今までこの閉じたカーブのことを、単にカーブの始点と終点が繋がったカーブであり「カーブが閉じると中が塗りつぶされるんだな」程度に考えてたわけです。

見た目が同じこの2つのデータの情報を見てみます。


それぞれのノードにカーソルあわせてマウス中押しで開いたウィンドウの内容を見てみます。
2つともコンポーネントの構成は同じです。
(それにしても、Primitve はポリゴンのことなはずなのだけど、「Primitives」と「Polygons」がわざわざそれぞれ記載されている意味は何なのだろう…?)

ポリゴンカーブの挙動を見てみる

ではこれらの挙動を調べてみます。

カーブの始点と終点を切り離す「Ends」SOPを繋ぎ「Close U」を「Open」にして開いたカーブに変更します。
(「merge1」は2つの結果を同時に見るためのもの)

するとグリッドから作成したポリゴンがカーブと同じ挙動を始めます。

ではポリゴンを押し出す「Poly Extrude」SOPを繋いで適当に押し出してみます。
(先ほどの「Ends」SOPは削除しときます)

今度はカーブがポリゴンと同じように押し出されるのがわかります。


この2つは確認したデータも同じなら挙動も同じ。
つまりカーブはそのままシームレスにポリゴンになっているといえます。

この辺の概念を覚えておくと、ポリゴンカーブに対してポリゴン用SOPを使えたり、ポリゴン(primitive)に対してカーブ用SOPを使ったりと、よりコンポーネントをコントロールできるようになるんじゃないでしょうか。
他のツールからHoudiniに移行してかつモデリングもしようと考えてる人には覚えておくと良さそうなHoudiniならではの部分かとおもいます。

最後にこの2つをくっつけて「Fuse」SOPでつなげてみます。
これをいじってみるともうすかっりポリゴンです。

間違いなどありましたらご指摘ください。