rn.log

備忘録など

【Houdini + Unity】点光源の影でグリッドを作って遊ぶ

はじめに

Unityのポイントライトの影でグリッドを出してみました。
今回はこの3Dモデルの作り方を紹介します。

f:id:r-ngtm:20210208013405p:plain
ポイントライトの影でグリッドを作ってみました
www.youtube.com

作り方

グリッドを球面へ投影したようなモデルを作ります。 このモデルと点光源が地面に映し出す影はグリッドの形になります。

f:id:r-ngtm:20210208010331p:plain
平面上の点を球面へ投影

投影点の座標の求め方

線分PAの長さをD, 線分PBの長さをd、球の半径をRとおいたとき、以下のようになります。
dが分かれば、投影点Bの座標が分かります。

f:id:r-ngtm:20210208005259p:plain
平面上の点を球面に投影

長さdの導出

三角形 HPA と 三角形BPHは相似なので、以下が成り立ちます。

 
\begin{align}
PB:PH &= PH : PA \\\
\\\
d:2R &= 2R : D \\\
\\\
d&= \frac{4R^2}{D}  
\end{align}

投影点Bの座標は以下のようになります。


\vec{B} = \vec{P} + d \cdot  \dfrac {\vec{PA}}{D}

Houdiniで実装する

投影点Bの座標が求まったので、次にこれをHoudiniで実装します。

Grid

Gridノードを使ってグリッドを作成します。

f:id:r-ngtm:20210208012423p:plain
グリッド作成

PolyExtrude

PolyExtrudeノードを使ってグリッドに穴をあけます。

f:id:r-ngtm:20210208012500p:plain
穴をあける

Attribute Wrangle

投影点の座標を計算して、グリッド点を球へ投影します。

f:id:r-ngtm:20210208012809p:plain
投影点の計算

vector origin = { 0, 1, 0 }; // 点Pの座標
vector p = (@P - origin); // 点Pから平面へ向かうベクトル
vector dir = normalize(p); // 正規化
float R = 0.5; // 球の半径
float D = length(p); // 点Pから平面上の点までの距離
float d = 4 * R * R / D; // 点Pから投影点までの距離

@P = origin + d * dir; // 投影点の座標で置き換える

投影したモデルは、ROP FBX Outputノードなどで3Dモデル化します。

完成

モデルをUnityへ取り込み、点光源を置くと、影がグリッドになります。

f:id:r-ngtm:20210208012942p:plain
モデルと点光源を配置

点光源の位置

f:id:r-ngtm:20210208013119p:plain
点光源の位置 (0, 1, 0)

モデルの位置

f:id:r-ngtm:20210208013143p:plain
モデル位置 (0, 0, 0)

関連書籍

www.amazon.co.jp