以前Blenderのジオメトリーノード:String to Curvesノードの基礎的な使い方を記事に書きました↓
が、フォントによってはメッシュが壊れるフォントも結構あります。
その対処法、トポロジーやメッシュの修正方法などについてまとめます。
この記事は、BlenderのString to Cuves(文字列のカーブ化)ノードのトポロジー修正について書いた中級者~上級者向けの記事です。
難易度
テキストのトポロジーが壊れるフォント
Blenderでテキストオブジェクトを作成すると、使用しているフォントによってテキストのメッシュが壊れることがあります。
Noto Sans JP
結構メジャーで使用する人も多そうなのにフォントが壊れます。テキストオブジェクトから追加した方が壊れ方が酷いですね。

Lexend
これもGoogle Fontの英字フォントですが、トポロジーが壊れています。

テキストトポロジーが壊れているときの解決法
解決法は主に4つあります。
- 壊れてないフォントを選択する
- 手動でメッシュを直す
- ジオメトリーノードで直す(漢字ひらがななどは無理)
- フォントのベクターから直す(英字)
❶はやっぱり簡単ですよね。代替できるフォントがあるならフォントを変えてしまった方がいいです。一番最初に考慮すべき事項だと思います。どうしてもフォントを変えることができないならその他の手法を考えるべきですね。❷はそのまま、メッシュを直すやり方です。わりとめんどい。❸もわりとめんどくさいですが、最初にノードを組んでしまえば次回も使えるかも。カタカナやローマ字などシンプルな字はうまくいくけど、漢字や一部ひらがなは直りませんでした。❹は英字フォントの場合すぐ直せていたんですが、漢字がきちんと直るのか怪しいです。
❶は飛ばして、❷から詳細に解説します。
❷手動でメッシュを直す
テキスト修正する準備

ジオメトリーノードからテキストを出すと、メッシュの貼り方をN-gonsで張れるので、テキストオブジェクトで出すより、トポロジーが綺麗です。なのでString to Curvesノードから文字を出力して直した方が早く修正できると思います。
ボコボコ穴が開いてるのは、カーブのスプラインがかさなってしまって、そこで交点ができてしまっているからです。

上の図のように、カーブが重なると、繋がってる近い方のカーブで囲ってメッシュを作ってしまいます。
これを、Fill Curveで、Indexごとにメッシュを貼るようにGroup IDにIndexをつなぐと、元のカーブの形でメッシュを貼ってくれます。
というわけで、テキストの穴を埋めた状態が右の図です。「な」の丸いところみたいに、一つのカーブなのに重なっているところは修正できていないのと、穴があくべきところまでふさがってしまっています。

これらはやはり手動で直していく必要があります。
なので、テキストをメッシュオブジェクトにする必要があります。
ジオメトリーノードはインスタンスをメッシュにできないので、Realize Instancesノードで実体化してから、モディファイアプロパティの画面から、下三角アイコンプルダウンメニュー内にあるApplyを押してメッシュにします。

手動でメッシュを直していく
編集モードで頂点や辺を選択しながら修正していきます。
穴を塞ぐ
「な」の穴があいた部分は、頂点選択してFで面をはります。
穴があいてる部分は同様に直していってください。


穴をあける
漢字などの、穴がふさがってしまっているところは、辺選択で、中の穴と、それを囲っている部分の辺を選択し、右クリックでメニューを出し、Loop ToolsのBlidgeで穴をあけることができます。(Loop Toolsがないという方は、アドオン追加してください)

残りも同じように、穴の部分と、それを囲む面の辺を選択してBridgeします。

これでメッシュは綺麗になりました。

インスタンスとして扱いたい場合
インスタンスとしてジオメトリーノードにもう一回読み込んで操作したい場合
一文字ずつ分離して、原点を移動させます。(右の画像の場合はそれぞれの文字の真ん中に原点を移動させている)
アルファベット順にインデックス番号がつくので、a,b,c…と名前をつけてコレクションにまとめます。


右のノード構成のように、コレクションをノードに読み込みます。Instances to Pointsでコレクションの中身をポイントにして、文字インスタンスを配置していくと、インデックス番号も順番通りになり、扱いやすくなります。
ここにSet Positionなどで

ここにSet Positionなどで変化をつけると、簡単にテキストアニメーションを作成することができます。
❸ジオメトリーノードで直す
ジオメトリーノードで直す方法は今のところ大きく二つあります。
- レイキャストノードで交差した部分だけ残す
- 壊れた文字・部分を分離して直す
ただ、どちらの方法も直せない文字が一部あります。カタカナやローマ字などシンプルな文字限定になってしまうかも。やってみないとわからないですが…。
レイキャストノードを使った修正方法
右のようなテキストだとカタカナが壊れています。
レイキャストノードで交差している部分だけを残し、合成して直すやり方です。

ノード全体の構成図


わかりやすくすると、文字を縮小(もっと微細な数値で)して、

小さい方からレイキャストでレイを出し、穴が開いたところ以外はヒットするので、その部分だけ消し、穴部分だけ分離して、あとから統合してテキストを修復します。
ヒットした部分を消し、交差した部分だけを残す↓

壊れた文字・部分を分離して直す
これは、ただ壊れた文字や部分を分離していって、それぞれ直してからまた統合するというやり方です。
右図のように感じやひらがななどの穴が埋まってしまった部分や、穴があいた部分を分離します。

ノード全体の構成図

Separate Geometryノードで、壊れた各部分のスプラインを分離していきます。

あとはMesh Booleanで穴をくりぬいたり、穴を塞いだりします。
ひらがなの穴埋めでは、以下のように穴が開いてるところを、Bounding Boxで囲って

もう一度Fill Curveすることで穴の部分に面が貼られることを利用しています。


これらノードでの修復方法は不完全なので、またいい方法があれば書きます
❹フォントのベクターから直す
そもそもフォントのベクターを直してしまおうという方法。
↓の動画のようなやり方で直せるようです。
これも英字などのシンプルな形なら良さそうなんですけど、ひらがな漢字あたりは一文字一文字ちゃんと直さないとおそらく無理なんですよね…。
ずっと使いたいフォントなどがあれば頑張って直すのもアリだと思います。
まとめ
テキストのトポロジー修正は、漢字、ひらがながほんとに鬼門です。とっても難しい。
まだ一発で直せるノードの組み方がわからないので、手間や時間を考えたら、一回オブジェクトメッシュにしてしまって、手で直してまたノードにもってくる、というやり方が現段階のベストプラクティスです。
いつかノードで直せるようになりたい。何か良い方法がありましたら教えてください。