この記事は、BlenderのジオメトリーノードであるString to Curvesノードについて解説しています。このノードは、文字列を曲線データに変換するための強力なツールです。Blenderのジオメトリノードを使用することで、テキストを3Dの曲線として扱い、自由に形状を編集したり、アニメーションを加えたりすることができます。特に、ロゴやタイトルのデザイン、3D文字のアニメーションを作成する際に便利です。
この記事では、String to Curvesノードの基本的な使い方を詳しく紹介し、Blenderでのテキスト表現をより快適にする方法を解説します。
この記事は、BlenderのString to Cuves(文字列のカーブ化)ノードについて詳しく知りたい中級者向けの記事です。
難易度
テキストオブジェクトとString to Curveノードの違い
3DビューポートでShift + Aで追加できるテキストオブジェクトとジオメトリーノード内で使うString to Curveノードは、どちらもBlenderでテキストを使った操作を行うための方法ですが、それぞれに特徴があります。
Shift + Aで追加するテキストオブジェクト

ジオメトリーノードで入力されるテキストカーブ

テキストオブジェクトとString to Curveノードのメリット・デメリット
テキスト入力方法 | メリット | デメリット |
---|---|---|
テキストオブジェクト | ●視覚的に直感的な操作が可能、3Dオブジェクトとして直接扱えるためビジュアルチェックがしやすい。 ●すぐに追加できる。原点調整も楽 | ●メッシュの修正やモディファイアやジオメトリノードでの操作が難しくなることがある。 ●分離するとアニメーションやマテリアルをつけるときに一つ一つ手作業になる。 |
String to Curveノード | ●高度なカスタマイズが可能、形状変更やアニメーションが簡単、モディファイアやノードでテキストの変形が可能。 ●文字をインスタンスとして一括で操作できる。 | ●編集が直感的ではなく、学習時間がかかる。 ●微調整や、文字ごとの細かなアニメーション、モデリングだとテキストオブジェクトの方が早いこともある |
どんなものを作りたいかによって使い分けが必要です。
複雑で、一文字ずつ違う動きをさせたい、ジオメトリーノードでは難しい変形をしたい →テキストオブジェクト
同じようなシンプルなアニメーションを一文字ずつさせたい、ジオメトリーノード内でできる変形で済む →String to Curvesノード
また、3Dビューポートから普通にテキストオブジェクトを出すと、日本語入力ができません。日本語を入力したいときは、メモ帳か何かに日本語をいれ、それをコピーしてペーストする、という方法で入力しなければいけません。
その点ジオメトリーノードは入力欄に日本語を入れることができて入力が楽です。
String to Curvesノードのパラメータ
String to Curvesノードは、ジオメトリーノードの中でかなり機能が多く(他のノードは移動させる、メッシュを貼るなどの単一な機能なので)結構複雑です。パラメータも多いし、出力されてる情報も多いですが、ただ単語を出力するだけならテキストを入力すればいいだけです。パラメータとか無視しても全然使えます。
String to Curvesノードの各パラメータ
Font…ファイルのアイコンをクリックすると、フォントを変更することができます。

最初はシステムに入ってるフォントしか選択できませんが、パスに
C:\Users\ユーザー名\AppData\Local\Microsoft\Windows\Fonts
と入れるとインストールしたフォントを使えるようになります。
Bookmarkしとくと便利です。
Overflow(Text Box Widthをはみ出したらどうするか)…モードが3つあります。
※英字の場合単語ごとに半角スペースが入り、そこが区切りになるんですが、日本語は全てがつながった単語扱いになってしまうため、半角で適度に区切らないと行に折り返されません
Overflow…半角スペースで区切ったテキストを、Text Box Widthで設定した幅サイズに入らなかったら次の行に折り返していきます。
半角スペースで区切った次のテキストが、Text Box Width内に入るなら同じ行に続けて出力されます。


Scale To Fit…Text Boxに横幅と縦幅を指定でき、そこをはみ出すと、その範囲に収まるように文字サイズを縮小する

Truncate…Text Box Width, Text Box Heightからはみ出したものはOutputソケットのRemainderに出力されます。そこにまたString to Curvesノードをつなぐと残りのテキストを出力できます。

Horizontal Alignment(水平配置)

Left…左寄せ
Center…中央寄せ
Right…右寄せ
Justify…両端揃え
Flush…文字間を等しく開けて両端揃え
Vertical Alignment(垂直配置)

Top…テキスト全体のトップを基準位置に合わせる
Top Baseline…1行目のベースラインを基準位置に合わせる
Middle…テキスト全体の真ん中を基準位置に合わせる
Bottom Baseline…最終行のベースラインを基準位置に合わせる
Bottom…テキスト全体のBottomを基準位置に合わせる
Pivot Point
Rotate Instancesノードなどに渡す、それぞれの文字のPivot Pointを出力します。
Midpoint…文字の真ん中
Top Left…左上
Top Center…真ん中上
Top Right…右上
Bottom Left…左下
Bottom Center…真ん中下
Bottom Right…右下
Set Positionなどに位置として渡すときは、なぜか水平位置Left,垂直位置TopBaselineのときしかうまく出力されませんでした。

String
テキスト入力欄です。
Stringノードなどと組み合わせて使ったりします。
英語などの、単語ごとに区切る言語に対応しているため、半角スペースで区切らないとTextBoxからはみ出たときに改行されません。

Size…文字サイズの目安(フォント、文字によってサイズはみんなバラバラです。ある数値にしたからといって横幅や縦幅がその数値にはなりません。)ほんとにただの目安
下図、白い枠線が1mの正方形。英字やフォントによってサイズは全然違う

Character Spacing…文字と文字の間のスペース
半角で区切った単語の間のスペースも広がります

Word Spacing…半角を入れて区切ると、そのスペースをここで調整できます。アルファベット、日本語も半角を入れて区切れば一単語とみなしてくれます

Line Spacing…行間スペースを調整できます

Text Box Width…ここをはみ出すと次の行へ移動させる、一行の幅のMaxの値。単語の途中ではみ出しても折り返さない場合もある。※詳しくはOverflowの項目参照
Text Box Height…すべてのテキストのMaxの高さ。ここをはみ出すとどうなるかはOverflowの項目参照

Output
Line…その行のインデックス番号をフィールド値として出力する。行ごとに操作できる

String to Curvesノードの基礎的な使い方
String to Curvesノードを使って文字を出力する基礎的な方法を解説します。
- 2D(平面)として使う
- 3D(立体)として使う
2種類の方法について書いています。
2D、3Dの文字は両方ともモーショングラフィック、ロゴなどいろいろ使い道があるのでとても便利です。
❶2D(平面)として使う
String to Curvesノードから出ているのはカーブオブジェクトなので、Fill Curveノードで面を張ってメッシュにします。(Fill Curveで面を張るときはN-gonsの方がトポロジーがシンプルでキレイです。)
Set Materialノードで好きな色やテクスチャをつけることができます。

❷3D(立体)として使う
❶でやったのと同様に、まずカーブにFill Curveノードで面を張ります。
次はExtrude Meshノードで面を押し出します。Facesにセットして、Offset Scaleを調整します。

この段階では、押し出しただけなので、裏面は面がない状態になっています。
↓裏面

裏にも面を張りたいのでFill Curveで面を張ったメッシュを裏に貼ります。その際、そのまま貼ると面が裏返っているのでFlip Facesノードで面をひっくり返して、Join Geometryノードでジオメトリを纏めます。
あとはRealize Instancesノード → Merge by Distanceノードでメッシュを繋げます。

ベベルを少しかける
ベベルをがっつりかけるのはかなり難しいんですが、少し角をとることはできます。
Fill Curveノードで面を張る前に、Resample Curveノードでカーブのポイントを少なくして整理してベベルをかけやすくしておきます。
それからベベルモディファイアを使うと、多少ベベルが効きます。


ちょっとベベルをかけると文字の角がとれていい感じに見えます。
カーニング(文字間調整)
カーニングして綺麗に揃えたいですが、カーニング機能なんてありません。自分でノードを組んで文字間隔を調整しなければなりません。自分なりに考えた方法でカーニングしていこうと思います。
文字間調整の手順
- 文字間隔を等しくする
- 特に調整したい文字を個別にカーニングする
結構めんどくさいのでいきなり❷で個別にカーニングしてもいいと思います。
❶文字間隔を等しくする
※わりとジオメトリーノード中級~上級者の知識を要するのでわからない場合は❷だけやればいいです。
String to CurvesノードのCharacter Spacingで字間を調整しても、綺麗にできません。まず文字間隔を無くして、等しく字間0にしていきます。

各文字幅を取得する原理

各文字のBounding Boxの最小値と最大値を取得し、最大値から最小値を引いて各文字のX方向の幅を計算します。
Accumulate Fieldで各文字の幅を足して計算していき、各文字のX方向の位置を出します。
ノードの全体

各セクション解説
文字位置を一か所に戻す
まず出力される文字カーブを0の位置に戻すため、Pivot Pointから出てるXの値に-1をかけて配置し直します。
このときPivot PointはMidpointにしておかないと少しズレが出ます(Pivot Pointのこういう挙動がちょっと謎でよくわかりません)

最小値と最大値をポイントに取得

インスタンスをポイントに配置するために、各文字のBounding BoxのIndex0のポイント以外を消す必要があります。そして0のポイントに位置の最小値と最大値をキャプチャしておきます。
インスタンス用のポイントを配置

さきほどポイントに取得した最大値から最小値を引いて、それぞれの文字の幅を計算します。さらにAccumulate Fieldで足していき(LeadingとTrailingのMix0.5)それぞれの文字位置を計算します。そのポイントをインスタンスのポイントにつなぎ、文字カーブをインスタンスにつなぎます。
途中についてるAddノードは字間の調節用です。

これで文字間0の配置ができました。

途中についてるAddノードで字間を広げたりできます
❷特に調整したい文字を個別にカーニングする
❶が終わった段階で、わりといい感じに字は揃っているんですが、文字によってはちょっと詰めたいところも出てきますよね。
または❶のノード組みを飛ばして、デフォルトのテキストカーブを個別カーニングして直すのもいいと思います。こっちの方が簡単で早くできます。

↓「ド」と「ー」を詰めて直したテキスト

ノードの組み方
❶の最後のInstance on Pointsから続けてもいいし、String to Curvesノードから続けてもいいです。
Set Positionノードで、動かしたい文字をIndex番号で指定して(Greater Than or Equalノード使用)、ConbineXYZのXの値を調節します。

カーニング用のノードグループを作る
せっかくノードを組んだので、さっきの個別カーニング用のノードをグループにして複数個つないでみたり、

全体をノードグループ化することで、カーニング用のノードを作ることもできます。
これでいつでも好きなようにカーニングできますね。文字組みや、ロゴなどのクオリティがかなり向上します。

テキストのメッシュが壊れる
テキストのメッシュが壊れる、トポロジー修復については以下の記事で書いていますので良かったら参考にしてみてください。↓