やりたいこと
こちらの動画のようなブロッホ球をジオメトリノードで再現したい。
ブロッホ球の構成要素
まずはブロッホ球の構成要素を確認します。
動かない部分
- XYZ軸
- 球
- 数字
動く部分
- 矢印
- XYZ軸周りの円
動かない部分の作成
軸や球、数字は動かないので通常の方法でモデルを作成し、適当な色を付けておきます。
動く部分の作成
矢印の作成
矢印の3Dモデル「arrow」オブジェクトと、その先端の1点のみを抽出した「arrow_tip」オブジェクトの2つを作成しておきます。
ジオメトリノードの作成
全体像がこちらです。
ブロック1:矢印の回転を制御
ブロック1(赤枠)では、矢印の回転を制御しています。
- オブジェクト情報:arrowオブジェクトの読み込み
- グループ入力:arrowオブジェクトの回転角の入力
- トランスフォーム:入力された回転角をarrowオブジェクトの回転に反映
ブロック2:矢印先端の座標を取得
ブロック2(黄色枠)では、矢印先端の座標を取得しています。
- オブジェクト情報:arrow_tipオブジェクトの読み込み
- トランスフォーム:入力された回転角をarrow_tipオブジェクトの回転に反映
- 属性統計:入力されたジオメトリ(arrow_tip)の位置の平均を計算する。arrow_tipには頂点が1つしかないため、その1つの頂点の位置が算出される。
- 位置:上記の属性統計ノードで計算の対象となる属性を指定
ブロック3:XYZ軸周りの円の中心座標と半径の計算
ブロック3(青枠)では、XYZ軸周りの円の中心座標と半径の計算をしています。
- XYZ分離:矢印の先端の座標をXYZそれぞれの成分に分離
- XYZ合成:円の中心座標を指定するベクトルを作成する。
- パワー、追加、平方根:円の半径を求める。
ブロック4:軸周りの円を表示させる
ブロック4(緑枠)では、XYZ軸周りの円を表示させています。
- カーブ円(上):軸周りの円
- トランスフォーム:軸周りの円の向きと中心座標の指定
- カーブからメッシュへ:カーブ円(上)をメッシュに変換し、レンダリング可能な状態にする。
- カーブ円(下):軸周りの円の太さを指定
- マテリアル設定:軸周りの円のマテリアルを指定
まとめ
このようになりました。
矢印先端の座標を取得する方法が分からず、苦肉の策でarrow_tipオブジェクトを導入しました。
ジオメトリノードをもっと使いこなせれば、より良い方法がありそうです。