まえがき
この記事は、
QiitaのBlender Advent Calendar 2021 の6日目と、
BLUGjpさん主催のBlender Advent Calendar 2021 の4日目の記事です。
さて今年のアドベントカレンダーが始まって少し立ちましたね。
あんまりエントリーが集まらない事に時代の流れを感じます。
かつて「俺だけが良さを知っているんだ…」という気分で使っていたblenderもどんどんメジャーになっていって日々話題に事欠かなくなったのであんまりアドベントカレンダーのお祭り感がなくなったのかなと思っているblender厄介オタクです。
記事概要
この記事では私が実装したtategaki text toolsアドオンを紹介します。
このアドオン何ができるかというと、blender上で縦書きテキストの作成が出来ます。
まず、blenderのテキストオブジェクトって縦書きに対応してませんよね。
これが地味に不便だなーと思っていて、無理やり素のblenderで縦書きテキストを作ろうと思うと1文字ずつ改行する必要があるので面倒だし、複数行にしようとするとレイアウトが汚くてイマイチになる…
これらを解決してblender上で縦書きテキストオブジェクトの作成、レイアウトの調整、メッシュなどへ変換する機能を実装しました
出来上がったもの
機能紹介
以下機能は縦書きテキストのコンテナ(エンプティオブジェクト)を選択状態で使えます
縦書きテキストに変換
- 選択テキストオブジェクトから縦書きテキストを生成
テキストオブジェクトのフォントやマテリアルを引き継いだ状態で生成することができます
分割解像度だけ、縦書きテキスト生成時に重くなるので下げて生成します
縦書きテキストを複製
- 選択された縦書きテキストから新規に縦書きテキストを生成
単純にコレクションとか、選択して複製するとIDかぶりするので同じ状態のオブジェクトをIDを変えて再生成します
行間調整
- 行間を調整する
字間調整
- 字間、自動カーニングの有無を調整する
固定値での文字配置と、グリフの大きさを基準にした文字配置の調整ができます
グリフの大きさ(というか高さ)をいちいち計算すると重かったのでキャッシュするようになっています
行文字数調整
- 縦書きテキストの 1 行あたりの文字数制限を調整する
作文用紙みたいに一定の文字数で改行したいときに調整します
内部データの行を分割して改行表示しているので一応非破壊に調整できます
変換
縦書きテキストを単一のオブジェクトにそれぞれ変換する
- メッシュ
- カーブ
- gpencil
縦書きテキストオブジェクトは大量のテキストオブジェクトで構成されているので、作りっぱなしにしているとオブジェクトの参照などが遅くなっていきます。
なので必要に応じてメッシュやカーブに変換しておくと良いです。
gpencilへの変換は、例えばgpencilで漫画を描いたときに文字入れするのに使えないかなと思って実装してみました。
あとがき
そんな難しくないだろうと思って実装し始めたら結構たいへんでした
縦書き時に回転する文字とか位置の調整が必要な句読点など細かい工夫があります
愚直に実装すると動作が重くなりすぎるので細かい軽量化や最適化をしてあります(bpy.opsで処理すると重い部分をbpy.dataで代替する処理を色々実装)
コア部分で1200行を越えててでか過ぎるなーと思いつつファイルを分割するとアドオン開発時にリロードがうまく行かなくなったりそもそも分割する領域が定かじゃないので手が付けられない…
本文編集機能も実装したいなーと思いつつめんどくささが勝っているのでしばらくはやらないと思います
この記事とは別に、つい最近rename toolというアドオンを書いたのでちょっと紹介
https://github.com/nepia11/rename_tool
ざっくり紹介すると、非ascii文字を含む語句を含むアイテム名(オブジェクトとかモディファイアとか色々)を一括置換するツールです
blendファイル内のマルチバイト文字を一層したいときに使えます
それでは