エンボス in 3Dモデル

 とある考えのもとに、Metasequoiaスクリプトとして「emboss.py」(仮)を作ってみました。Metasequoiaの機能と見分けるため、ベベル(bevel)や押し出し(extrude)以外の単語を使って、エンボス(emboss)と呼ぶことにしておきます。
※とはいえ、ピクセルシェーダによるバンプマッピングというわけでもありません。

  • 「押し出し」の「通常」や「ベベル」に似た加工ですが、同じではありません。
  • 基本的には以下の画像のように、「Create text」によってフォントから生成されるような3Dモデルへの適用を想定しています。
  • 3Dで演算しているので、もとのモデルはどちらを向いていても処理できます。(ただし、どんなものでもきれいに見えるというわけではありません)
  • 当面の目標は「前から見てきれいに見える」ところまでです。優角(180°<θ<360°:reflex angle)であっても、見えないところに不要なポリゴンを生成しています。

スクリプトを適用してみる

こちらは45°傾斜になる設定(size = 10, depth = -10)で試した結果です。上から「元のモデル」「1回適用」「2回適用+近接する頂点をくっつける」の状態のスクリーンショットです。2回適用してもうまくいくようですね。それを超えるときれいでない部分まで、前方から見えるようになります。
同じく45°傾斜になる設定です。文字ではなく適当な向きにそろったポリゴンに適用した結果です。エッジ表示をしているので、このスクリプトの性質がわかるかと思います。このスクリプトは、輪郭になっているエッジの外に矩形を追加し、輪郭になっているコーナーの外側にファンを追加します。追加の頂点の位置関係は、スクリプトの直接書き変えながらも、幅と深さと、ファンの分割角度をパラメータとして変更できます。
実装を最適化していないので重くなりますが、緩い角度になる設定を使えば、多段適用してもきれいな結果が出てきました。そこで、パラメータを変えながら3段階適用してみた結果です。

 「とある考え」というのは、「これで作れる素材を使って〜しよう」というものですが、それは進展があった際のお話としましょう。

Metasequoiaスクリプトの余談

 いくつかの点で時間を要しました。

  • MetasequoiaスクリプトPythonベース
  • MQPointで手軽な「複製」「スカラー * MQPoint」などのメソッドが見当たらない模様。
    • 「和」「差」「内積」「外積」「正規化」はある。
  • 任意軸回転は、Quaternionクラスの自作で解決した。
    • 行列(MQMatrix)はあるが、用意された回転操作は、オイラー角(MQAngle)ベースのメソッドしかない。
  • 関数内のエラーが、トップレベルの呼び出しのエラーとして知らされるので、問題の修正が難しい。
C#思考的Pythonミスコーディング
  • 「var」と書いてしまう。ローカル変数で余計な宣言をしようとする。
  • 「if」や「else」に「:」を忘れる。
  • 三項演算子を書こうとする。(すっきりしない方法では書ける模様。Python 2.5以降では「then_value if predicate else else_value」があるらしい)
  • 「&&」と書いてしまう→「and」。