« artist sideに登録… | トップページ | グループ内のオブジェクトをXPressoでスプラインに沿わせてみる。 »

artist sideで「列車をスプラインに沿わせる」と言うのがあったので、自分もXPressoで「スプラインに沿う」を遊んでみる。

残念ながら「列車をスプラインに沿わせる」ネタではありません。
初歩的なものなので、知ってる人は読み飛ばしてね…

確か以前に「スプラインに沿わせる」ネタがあったけ?最近物忘れがひどくて…

「XPressoで電球のフィラメント(うそ!)」
http://villager-and-c4d.cocolog-nifty.com/blog/2009/01/xpresso-92dc.html#more
そう言えば、こんなのあったね…全く参考にはならないけど…

「オブジェクトをスプラインに沿わせるXPresso」
http://villager-and-c4d.cocolog-nifty.com/blog/2009/01/xpresso-6205.html
これも参考にはならないけど…

今回も参考にならないんだろうなぁ…

では簡単なところで、「スプラインに沿って伸びる矢印」…簡単すぎだろうか?
矢印の三角の矢の部分は「アローヘッド」、線の部分は「シャフト」て言うんだね…知ってた?自分は今知りました。XPressoには何も関係ないですが…

Play_the_spline_01

矢印の基本形状は、こんな感じにします。
例えばアローヘッドの幅が100ならばシャフトの幅は33.3333という事です。

この矢印を変形させてスプラインに沿わせるわけではありません。難しいですし面倒です。
一番簡単な方法で、シャフトの部分は「スイープNURBS」で「終了端の成長率」で制御。アローヘッドは「ポリゴンプリミティブ」を「スプラインに沿う」エクスプレッションで制御。

では、矢印の軌道パスを適当に「ベジェ」で作成します。
ポイントの1箇所のハンドルをなくして角を作っておきます。

Play_the_spline_02

「スイープNURBS」の断面用のスプラインは、「線形」でシャフトの幅が33.3333になるよう軸を中心にポイントを追加します。

Play_the_spline_03

これで、「スイープNURBS」を適用します。

Play_the_spline_04

問題なしですね。
では、アローヘッドはポリゴンプリミティブで、「3角形」をチェックします。
ポリゴンの三角形の先端が軸にくるようにヌルオブジェクトを使います。

Play_the_spline_05

Play_the_spline_06

これでパーツは揃ったので、これを「スプライン矢印」と言う名前で呼びます。
この矢印を制御する為にコントロール用ヌルオブジェクトを追加し、更にユーザデータも追加します。このヌルオブジェクトの子オブジェクトとしてポリゴンプリミティブ、スイープNURBSをまとめます。

Play_the_spline_07

アローヘッドのヌルオブジェクトに「スプラインに沿う」エクスプレッションを取り付けます。パススプラインに「軌道」を指定します。
接線方向に向くにチェックを入れます。

Play_the_spline_09

一番上の「スプライン矢印」のヌルオブジェクトにユーザデータとXPressoを追加します。

ユーザデータは…

矢印の長さ 浮動小数点 パーセント 0%~100%
アローヘッドの大きさ 浮動小数点 実数 0.0~

Play_the_spline_08

もっと細かく設定する事も可能です。
アローヘッドの「幅」「長さ」「シャフトの幅」という具合に…
今回はアローヘッドの大きさだけで上記の3つを算出します。

XPressoは…

ユーザデータ「アローヘッドの大きさ」をポリゴンプリミティブの「幅」「高さ」に連結します。

Play_the_spline_10

シャフトの太さも「アローヘッドの大きさ」から算出します。

シャフトの太さ = アローヘッドの大きさ ÷ 3

です。
シャフトの断面スプラインの

ポイント:0(x : -(シャフトの太さ : アローヘッドの大きさ÷3) ÷ 2  ,  y : 0.0  ,  z : 0.0)
ポイント:1(x :  (シャフトの太さ : アローヘッドの大きさ÷3) ÷ 2  ,  y : 0.0  ,  z : 0.0)

にします。

Play_the_spline_11

完璧ではないですが、これでユーザデータ「アローヘッドの大きさ」を変更するとシャフトと共に大きさが変わります。

続いては、「矢印の長さ」を制御します。

とりあえず、ユーザデータ「矢印の長さ」とアローヘッドの「スプラインに沿う:スプライン上の位置」と「シャフト:終了端の成長率」をつなげます。

Play_the_spline_14

現在の位置は10%の位置です。

Play_the_spline_12

ここで、ユーザデータ「矢印の長さ」を変更してみます。

Play_the_spline_17

アローヘッドの先端とシャフトの先端がずれています。
「成長率」と「スプライン上の位置」は、同じ数値でも、位置が若干ずれています。

ずれているのは、「成長率」の方です。
これは「軌道」スプラインの補完法と連動しています。
スプラインを作成すると初期状態は「最適」になっているので、「均等」に変更してください。

Play_the_spline_18

Play_the_spline_30

シャフトの「終了端の成長率」の位置はアローヘッドのお尻に接続したいので、アローヘッドの先端の位置からずらします。

ずらす量 = アローヘッドの大きさ ÷ 軌道の長さ

要するに…

終了端の成長率 = 矢印の長さ - アローヘッドの大きさ ÷ 軌道の長さ

でもね、これも問題があるんだよね。
こんな具合になる可能性があるんだよね。

Play_the_spline_13

少しめり込ませた方が良いんだね。とりあえずアローヘッドの1/3位めり込ませて…先端から0.6666だね。
問題があれば0.8とか0.9とかね…

終了端の成長率 = 矢印の長さ - (アローヘッドの大きさ×0.6666) ÷ 軌道の長さ

では、こんな感じ…

Play_the_spline_16

Play_the_spline_15

一応、アローヘッドにめり込んでいるわけですね。

ここで、ユーザデータ「矢印の長さ」を変更してみてください。
急カーブの所でシャフトとアローヘッドが離れてしまってます。
他のところでも、シャフトがアローヘッドのお尻の真ん中に接続できていません。

Play_the_spline_19

アローヘッドの「スプラインに沿う:接線方向に向く」が働いているにもかかわらず、どうして?と思うだろうが…

ここで必要なのは接線のベクトルではないのです。必要なのは「アローヘッドの先端」から「アローヘッドとシャフトの接合部」へのベクトル。

Play_the_spline_31

このベクトルにアローヘッドを合わせます。

Play_the_spline_32

ベクトルから回転に変換する事はできますが、ターゲットエクスプレッションを使った方が簡単なので、こちらで対応しましょう。「アローヘッドとシャフトの接合部」になるように新たなヌルオブジェクト「アローヘッドの付け根」を追加します。

アローヘッドの「スプラインに沿う:接線方向に向く」のチェックをはづし、ターゲットエクスプレッションを追加し、ターゲットは新たに追加した「アローヘッドの付け根」にします。

Play_the_spline_20

追加したばかりなので、アローヘッドは原点にある「アローヘッドの付け根」に向いています。

この「アローヘッドの付け根」の位置は、先ほど説明した式を使います。

終了端の成長率 = 矢印の長さ - アローヘッドの大きさ ÷ 軌道の長さ

「アローヘッドの付け根」に「スプラインに沿う」エクスプレッションを取り付けてください。アローヘッドについている「スプラインに沿う」を複製すると良いでしょう。

ではXPressoです。
「シャフト:終了端の成長率」のXPressoに追加します。

Play_the_spline_21

追加したのは「V1 - V2 ÷ V3」とアローヘッドの付け根の「スプラインに沿う」 です。

Play_the_spline_22

アローヘッドが逆向きになりました。
アローヘッドのポリゴンプリミティブの回転Hを180°にします。

Play_the_spline_23

ポリゴンの位置は[0.0 , 0.0 , -50.0]になっているので、これも「アローヘッドの大きさ」が変更されたら位置もXPressoで調整します。

ポリゴンの位置 = [0.0 , 0.0 , アローヘッドの大きさ÷2]

先ほどのポリゴンプリミティブの大きさのXPressoに追加します。

Play_the_spline_25

Play_the_spline_24

隙間がなくなりました。
「アローヘッドの大きさ」「矢印の長さ」を変更して確認してみてください。

ほんの少しダメな部分がありますが、問題ないでしょう。
アローヘッドの大きさを大きくすると急カーブの所ではみ出しがあります。
シャフトのめり込み量を0.8位にすると解消されるでしょう。

Play_the_spline_26

では、最後の問題を…
矢印の長さが0.0の時、アローヘッドが垂直になっています。
これは、アローヘッドの先端とアローヘッドの付け根が同じ位置になった為、ターゲットエクスプレッションがこの様な計算結果を出したわけです。

どう対処する?
ま、そもそも矢印の長さが0.0なんだから、矢印自体が消えちゃえば良いんだよね…
消すには?
マテリアルで透明にする?
表示タグで可視性で透明にする?
簡単なのは、オブジェクトの属性の「基本:エディタでの表示/レンダリングでの表示」を隠すにする。

「比較」ノードを使って長さが0.0だったら「隠す」、それ以外だと「表示」。

[エディタ/レンダリング]での表示は…
表示:0
隠す:1
従う:2
です。

XPressoは…

Play_the_spline_27

比較ノードは…

Play_the_spline_28

「矢印の長さ」が0.0だとTRUE(1)。0.0以外だとFALSE(0)となります。
これで、完成です。

Play_the_spline_29

今回のファイル9.5は、「SplineArrow.ZIP」です。

|

« artist sideに登録… | トップページ | グループ内のオブジェクトをXPressoでスプラインに沿わせてみる。 »