てんちょーの技術日誌

自分がつまづいたこととかメモ

【Houdini】Font ノードで穴の開いたアルファベット対策

概要

Houdini で Font ノードを使っていると、囲われたところに面が出来てしまい
Z-fighting が起きてしまうことがあります

Hole Faces にチェックを入れていればいくらか回避できますが、
いつも上手くいくわけではないようです

今回はその対策をしてみます

環境

Windows 10
Houdini 19.0.455

手順

全体はこんな感じです

分かりやすくするため、Hole Faces のチェックは外しておきます

detect_inverse_face

forward ベクトルを指定できるようにしていますが、
特に何もなければ (0, 0, 1) でよいです (Z+ 方向に文字が向いているため)

float nDotF = dot(v@N, chv("forward"));
// -0.99 は適当です 
// 内積が -1 == 反対を向いた面 なので、少し誤差を許容しています
int isInverse = nDotF <= -0.99 ? 1 : 0;
setprimgroup(geoself(), "inversed_face", @primnum, isInverse);

Split と Reverse

inversed_face で分けます

右側(Non-Selected Geometry)は反対を向いているので、
ひっくり返してあげるとこうなります

boolean

最後に Surface 同士で boolean してあげればおしまいです

余談

この方法はアルファベットだと上手くいく...と思います
問題になるのは漢字です

eg) 回 の場合

Before

After (今回のノードで処理後)

これをなんとかしようと foreach で回しながら... とかやったんですが、
結局は Hole Faces にチェックを入れると解決しました

さいごに

アルファベットの B だけ怪しい...ので、狙い撃ちで対策してもいいかもしれません
この記事のアイディアは 杉村さんのworkshop に影響を受けています
よければそちらもご確認ください~!

何かあれば Twitter までどうぞ~