はじめに
以前Simple deformationを使ってテキストを曲げました。Raycastを使っても曲げられます。しかし挙動をしっかり理解していないので勉強します。
Raycast
参照元
https://github.com/nortikin/sverchok/blob/master/docs/nodes/analyzer/raycaster_lite.rst
機能
機能性は、bpy.context.scene.ray_cast
とobject.ray_cast
の2つの組み込みblender演算子にほぼ完全に類似しています。光線は”開始”ベクトルから”終了”ベクトルへキャストされて入力オブジェクトにヒットさせられます。
参照ドキュメント: bpy.types.Object.ray_cast と bpy.types.Scene.ray_cast
入力ソケット
- Verts光線を受け取るオブジェクトのベクトル
- Faces光線を受け取るオブジェクトのフェイス
- Startレイキャストのスタートポイント
- Directionレイキャストの方向
出力
- Location全部の例キャストのヒットした場所
- Normalヒットしたポリゴンの法線
- Indexヒットしたポリゴンのインデックス
- Distance開始地点とヒット地点間の距離
- Success
True
またはFalse
どのポリゴンもヒットしていなければFalse
その他
使用例が公式にあるので見てみてください
使ってみる
テスト
- 黄色い部分が光線を受け取るオブジェクト
- 青い部分が光線の開始位置
- 赤い部分が光線の方向
- 可視化の為LineとViewer Drawを使用
- 緑の部分が結果
- 光線をメッシュにヒットさせた後のメッシュ
- 🤔開始点をCubeの外側にして中央に向かっていく例です。
- 黄色い部分が光線を受け取るオブジェクト
- 青い部分が光線の方向
緑の部分が結果- 光線をメッシュにヒットさせた後のメッシュ
- 🤔開始地点を(0, 0, 0)にして外側のPlaneに光線の方向を指定した例です。
テキストを投影する
- 赤い枠 テキストを作成
- 後でテキストに厚みを持たせる為、Extrudeを行っている。値を非常に小さくしておく事で押し出したところに3つ以上の頂点の頂点が入らないようにする必要がある
- 後でテキストに厚みを持たせる為、Extrudeを行っている。値を非常に小さくしておく事で押し出したところに3つ以上の頂点の頂点が入らないようにする必要がある
- 黄色い枠 テキストをMeshへ変換 + 返還後オブジェクトにRemesh モディファイア―を適用
- Meshへの変換方法は単に Object Inでテキストオブジェクトを参照し、そのままMesh Viewerに渡すだけ
- Remeshモディファイア―メモ
- Remove Disconnected のチェックを外す必要がある
- Octree depthが低すぎるとテキストが欠けて見える
- 高くすると奇麗なMeshになる半面で処理がすごく遅くなる
- テキストの長さに応じて数値を調整する必要がある
- テキストが全部表示されるかつ汚いメッシュで調整した後でレンダリングの時にOctree depthを上げるのが良さそう
- 青い枠で Remeshモディファイア―後のオブジェクトを参照する
- Objects inのPostにチェックを入れるとモディファイア―適用後のメッシュ情報が参照できる
- 白い枠は投影先のスフィア
- 見本の為、Draw Viewerで表示しています
- 緑の枠でRaycastノードを使ってテキストをSphere上に投影し変形する
- テキストはわずかにExtrudeした結果立体になっている。この頂点は後で表面側と奥側(Z=0)で2分する為にVector Sortで並び替えをしている
- Scaleではテキストのサイズが変更可能。主にYのスケール(縦の幅)を変えたい場合はここで行う
- Raycastを使ってテキストを投影
- List Lengthで頂点の数を数えて2で割る(divide)事でテキスト表面の頂点数を算出
- Number Rangeで0~表面の頂点数までのリストを作成
- List Itemで表面の頂点を取る
- 次のスケールでは押し出しの幅を変える事ができる
- 押し出した頂点と押し出していない頂点をJoinして2分したリストを元に戻す
- Merge by Distanceで不要な頂点を削除
- Recalc Normals で法線を再計算
- 最後にMesh Viewerでオブジェクト作成
- Matrix で回転させているのはただたんに垂直にオブジェクトが見えるようにしています。
- メモ
- テキストをExtrudeせず後でSolidifyで厚みを付ける事も可能ですがメッシュが壊れる為、途中で頂点を2分割して押し出して結合しています。
- スフィアのサイズが小さすぎると文字のメッシュが壊れます。
- スフィアをY軸に動かすことでスフィアのど真ん中ではなく上部や下部に投影させて異なった形にすることができます
- スフィアだけではなく任意の表面(ディスプレイスした表面など)に投影できますがあまりきれいになりません。
最後に
いくつかこの方法で投影したサンプルがありますので参考に載せておきます