Shade online フォーラム
ログイン
ユーザ名:

パスワード:

IDとパスワードを記憶

パスワード紛失


【 3. ロープ形状を作成する 】

与えられた線形状に沿ってロープ形状を作成する方法はいくつも考えられますが、大きく分けると次の二つのアプローチに分類されます。

1)座標値を自前で計算する
2)可能な限り script を利用して Shade 上に中間形状を作成し、そこから得られる座標値を利用して作成する。

1)の方がすっきりしますが、ここでは理解しやすい 2)の方法の一案を提示します。
あくまでも一案ですので、他にいろいろ工夫して作ることもできるでしょう。

《 3.1 ロープの種類とロープ形状を決定するパラメータ 》

ロープの種類としては、数本を束ねて捩ったものや、三つ編みなどいろいろ考えられますが、ここでは基本形として3本を捩ってできるロープを作成するとして話を進めます。
( これを modify すれば三つ編みも全く同じ手続きで作ることができます )

また、対象は開いた線形状に限るものとしますが、少しだけ手を加えれば閉じた線形状を対象にすることも可能です。

さらに、ロープは与えられた線形状の全長にわたって作成するものとします。
これも手を加えれば、任意の区間内にロープを作成することも可能です。

ロープ形状を指定するパラメータとしては次のものが考えられます。
ユーザー入力項目はこれを参考として決定するといいでしょう。

ピッチ数:np as integer
進行方向に捻れたロープが一回転する区間をピッチととらえ、与えられた線形状に対して何ピッチのロープを作成するか。

巻きの向き:clockWise as boolean
進行方向に向かって右巻きか左巻きか

巻き数:n as integer
何本を捩ってロープを作成するか( ここでは 巻き数 = 3とする )

素材径:r as float
ロープを構成する一本の紐の半径

ピッチ径:rp as float
ロープ断面から見て、ロープを構成する紐の中心が並ぶ円の半径
  ロープ全体の半径 = ピッチ径 + 素材径

《 3.2 ロープ形状作成の一案 》

1)原点を中心として X-Y 平面内にピッチ径 rp に外接する正六角形を作成する

巻きの向きが右回りならアンカーポイントの並び順が右回りの六角形を、左回りなら左回りの六角形を描く

2)ロープ中心線形状をコピーし、これを N分割する( 第1章参照 )

N はピッチ数の6倍 N = 6*np とする( 三つ編みの場合は N = np*12 )

3)N分割した中心線形状の始端に正六角形をセットして掃引する( 三つ編みの場合は 正12角形 )( 第2章参照 )

4)掃引して得られた自由曲面を選択して 3.3項で述べるルールに従って3組のアンカーポイント座標を取得していく

5)得られた3組のアンカーポイント座標をそれぞれ結ぶ3本の折れ線を Shade 上に作成する

6)3本の折れ線にスムースをかける

7)3本の線それぞれについて、素材径 r の円形の線形状をその始端にセットして掃引きする( 第2章参照 )

これで3本を捻ったロープができあがります。

《 3.3 アンカーポイント座標取得のルール 》

取得するアンカーポイント座標は掃引で得られた自由曲面の U方向線形状毎に調べていきますが、全ての U方向線形状ではなく 始端と終端それに N分割によってオリジナルの線形状に追加されたアンカーポイント位置に相当する U方向線形状のみがその対象となります。

オリジナルの開いた線形状のアンカーポイント数が noap であったとすると、N分割によってアンカーポイント数は noap + N - 1 に増えており、掃引によって作成される自由曲面の U方向線形状の数も noap + N - 1 になっています。

このうち始端と終端を除くオリジナルのアンカーポイント位置に相当する U方向線形状はアンカーポイント座標取得において不要ですので、これを予め削除しておいた方が以降の操作が簡単になります。

何番目の U方向線形状が不要であるかを知るには、1.3項で N分割のために得た bezier parameter リストを利用するといいでしょう。
1.4項で script で連続してアンカーポイント追加するために modify した bezier parameter リストではないことに注意してください。

3.3.1 不要なU方向線形状の Iindex を取得

///////////////////////////////////////////////////
bezier parameter リストから不要なU方向線形状の
index を取得する擬似コード
///////////////////////////////////////////////////

dim t() as float  //  1.3 項で得られた bezier parmeter list
dim nt as integer  //  t() の配列数( 0基数 )
dim noap as integer  //  N分割を受ける前のオリジナルの線形状のアンカーポイント数
dim k as integer

nt = Ubound(t)  //  t() の配列数( 0基数 )
dim indexL(noap - 3) as integer  //  不要なU方向線形状の index を格納

k = 0
for i = 1 to noap - 2
 if k <= nt then
  if t(k) < i then
   do
    k = k + 1
    if k > nt then
     exit  //  do ループを抜ける
    end if
   Loop until t(k) >= i
  end if
 end if
 indexL(i - 1) = i + k
next

オリジナルのアンカーポイントが10個( index = 0〜9 )で、bezier parameter リスト が { 0.2, 0.6, 1.2, 2.0, 4.5 } であるとすると、N分割後のアンカーポイント数は 10 + 5 = 15( index = 0〜14 )であり、indexL には { 3, 5, 7, 8, 10, 11, 12, 13 } が返されることになります。
これが 始端と終端を除く 10 - 2 = 8 個のオリジナル線形状のアンカーポイントの N分割後の index を示しています。

3.3.2 不用なU方向線形状を削除

1)掃引で得られた自由曲面を選択
2)一番上にある子オブジェクト( 最初のU方向線形状 )を選択
3)script property ordinal によって、この最上位のオブジェクトの ordinal No.( 序数 )を取得する。
4)3.3.1 で求めた不要U方向線形状の index list( 0基数 )の各要素に 3)で取得した ordinal No. を加えると、削除するオブジェクトの ordinal list( 序数リスト )が得られる
5)この ordinal list を用いて script property set ordinal list で削除対象となる線形状を選択状態にし、script command clear で削除する。

3.3.3 3組のアンカーポイント座標を取得

3.3.2項の処理を経た自由曲面を選択します。
掃引で得られた自由曲面の中から一部のU方向線形状を削除したので、形はいびつになっていますが、六角形の U方向線形状は掃引中心線に沿って N分割された等間隔に並んでいます。
ここで自由曲面内の各U方向線形状毎にアンカーポイントを一つづつずらしながらその座標値を取得します。

1)最初のU方向線形状では ancor point No. 0 の座標を取得
2)次のU方向線形状では anchor point No. 1 の座標を取得
3)以下同様

U方向線形状は六角形ですから6個取得すれば六角形を一回り、つまりロープ断面の円周方向一回り分に相当します。
一方、最初にオリジナル線形状を N分割する際に、ロープのピッチ数 np の6倍を分割数としていますから( N = 6*np )、上記の6個分の座標値を取得すると、それはロープの捻れが一回りする進行方向1ピッチにちょうど一致することになります。

この操作を繰り返して N + 1 個の座標値を取得すると、ロープを構成する捻れた紐一本分の中心線座標が得られます。

ここでは3本の紐を捻ったロープを考えていますから、残りの二本分の紐の中心座標もアンカーポイント位置をそれぞれ2つづつずらしながら取得すればいいことになります。

三つ編みの場合もアンカーポイントの取得順ルールを変更すれば同様に作成することができますので、興味のある方は考えてみてください。
なお、 三つ編みの場合は正12角形のアンカーポイント座標以外に、途中で正12角形の中心の座標も取得する必要があります。( Mac をお使いの方は 043.Distributor の中に三つ編みのサンプルが納められていますからそれを参考にするといいでしょう )

《 3.4 巻き数 n と、分割数 N との関係 》

以上では、巻き数 n = 3 として話を進めてきました。
では、巻き数が n > 3 の場合はどうすればいいでしょうか?

ロープの進行方向1ピッチ分の分割数は 6 あるいは 8 が適切です。( 三つ編みの場合は12 )
これよりも少なければ、捻れた紐の中心線を表す線形状に smooth をかけても綺麗な形にはなりませんし、多すぎても無意味です。

1ピッチ分の分割数を 6 に固定すると考えると、ロープ中心線に沿って最初に掃引する断面形状は正6m角形( m >= 1 なる整数 )でなければなりません。

ですから、巻き数 n の場合には、最初に掃引する断面は n と 6 との最小公倍数にする必要があります。( n = 4 ならば正12角形、n = 5 ならば正30角形 )