« artist sideで10個のカメラを一気にレンダリングね…追伸 | トップページ | C4D XPressoでタイヤを地面ポリゴンオブジェクトの上を転がす。 »

C4D タイヤを転がす。という事は…

タイヤを転がす、一番簡単な方法を考えると、やはりスプライン上を転がすと簡単だろう…
「接線方向に向く」をONにしておけば、いつでも進行方向に向いていてくれる。
タイヤの位置を「スプライン上の位置」で指定する事で、始点から転がった距離を求めることができ、タイヤの回転量も距離と半径から求めることが簡単にできるよね。
これにより、逆進しても問題なくタイヤも逆に回ります。

スプラインにタイヤを沿わせるわけだ。

Wheel_01

簡単に考えると、こうなるわけだよね。
でも、転がるということは、対象物(地面)があるわけだ。
この状態で地面を転がすとなると、スプラインを地面から半径分浮かせる事になる。
地面に凹凸がある場合は、地面にスプラインを投射して、座標のY値に半径分足す。

Wheel_02_2

地面が平面ならば、これでも良いのだが…
凹凸がある場合、タイヤがめり込む事がある。
場合によって、めり込みを問題としなければ、これで作業を進めることになる。

Wheel_03

なるべく、めり込みをさせない場合は、スプラインを地面に投射し、タイヤをスプラインから半径分離す。

Wheel_04

だからといって、スプライン上のグローバル位置にvector(0.0 , 半径 , 0.0)を足せば良いというわけではない。
これだと、地面に投射したスプラインを地面から半径分浮かした状態と同じになる。
解決策は、スプライン上の接線に直角方向に半径分移動させる。

Wheel_05

XPressoやC.O.F.F.E.E.を使って?難しくはないが、面倒だね。
一番簡単なのは、ヌルオブジェクトを使う。もっとも一般的だね。

このブログは一般的ではないネタでは…と思った人もいるだろう…
ごめんなさい、今回はヌルオブジェクトで…

タイヤをヌルオブジェクトの子オブジェクトにして、タイヤのローカル座標を(0.0 , 半径 , 0.0)とすれば良いのだ。

Wheel_06

それならヌルオブジェクトを使わず、タイヤの軸を中心から半径分下に移動させれば…なんて考える人はいないと思うが、この後タイヤを回転させるので軸は中心のまま。

あとは、ヌルオブジェクトをスプラインに沿わせ、接線方向に向かせると、めり込みは軽減される。
でも、このように処理したから絶対にめり込まないと言うわけではないのだ。

Wheel_07

沿わせるスプラインは、なるべく凹な角を作らない(滑らかに)ようにする事…

Wheel_08

これは、これで別の問題が発生するけど、ここでは素通りします…

では、回転処理に移ろう…
以前のネタにも移動距離と円の回転角を取り上げたけど…

転がった回転数と移動距離は比例関係にある。

例えば…
1回転で10cm移動するなら、4.5回転(4回転と半分)だと[4.5×10]45cmだね。
逆に、10cm移動で1回転だから95cm移動すると[95÷10]9.5回転だね。

Wheel_09_2

こんなグラフだね…
回転数を角度で示すなら、回転数に360を掛けると良いわけだ…
95cm移動すると[95÷10×360]3420度

要するに、1回転分の移動距離がわかれば移動量から回転角が求められると言う事だ。

1回転分の移動距離…
これは、この円の円周の長さと同じである。

Wheel_10

円周の長さから半径を求めるには…

半径 = 円周の長さ÷π÷2

この1回転で10cm移動する円の半径は[10÷3.14÷2]≒1.59

半径が計算で求めることができたので…
半径と移動距離から回転角を求めることができるわけですね…

回転角 = 移動距離÷(2π×半径)×360
     
= (移動距離×180)÷(π×半径)

ソフトウェアなどで使われている円に関する関数は、度数ではなくラジアンと言う単位用しで使ます。
一般の人はなじみが無いので、入力(ユーザインターフェイス)では度数、プログラム内でラジアン変換してから計算します。

ラジアン…

Wheel_11

180°でπ。360°で2π。

180°→ 3.14
360°→ 6.28
540°→ 9.42
720°→ 12.56

度数からラジアンに変換する式は…

ラジアン = 度数×π÷180

半径と移動距離から度数を求める式からラジアンを求めると…

ラジアン = (移動距離÷(2π×半径)×360)×π÷180
   = (移動距離×180π)÷(180π×半径)
   = 移動距離÷半径

と、簡単な式になりました。

では、スプライン上を転がる円の角度を求めてみよう。

Wheel_12

スプラインの長さが、1000.0
半径が、100.0
スプライン上の位置が、0.27

では、先ほどの
ラジアン = 移動距離÷半径
を使って求めるのだ。

スプライン上の位置は0.0~1.0の範囲だよね。要するに長さに対する割合だ。

開始位置からスプライン上の位置までの距離 = スプライン上の位置×スプラインの長さ

で求められる。

ラジアン = (0.27×1000.0)÷100.0
  = 2.70

ラジアンを度数に変換するには

度数 = ラジアン×180÷π

2.70ラジアン ≒ 154.7°

最後に必要な知識は…回転軸

Wheel_13

回転させるのだから、オブジェクトの回転軸はZ軸かX軸にするのが普通だろう。

回転角は、軸方向を手前にしたときX軸Z軸ともに+方向は反時計回りになる。

Wheel_17

上の図でタイヤを左に転がすなら、回転角の増分は(+)。
反対に、右に動かすなら回転角の増分は(-)。

通常、オブジェクトを移動する方向にZ軸を使う。X軸でもY軸でも可能ですけど…
スプラインに沿わせて接線方向を向く軸はZ軸ですし…

そうすると、タイヤの回転はX軸が良いだろう。

Z軸方向は、上の図では右なので回転角の増分は(-)になる。

ま、これはオブジェクトの作りかたにもよるし、作り手にもよるので、全てがそうだとは言えないけど…

それでは、タイヤをスプライン上を転がす必要な知識は十分に得たと思うので、実際にタイヤをスプライン上に転がしてみよう。

いつも、プリミティブを使っているので、今回は少しだけ気分を出すためタイヤのようなオブジェクトを使います。手抜きですが…

Wheel_14

一部に高さのあるスプライン上を転がしました。

勿論、スプラインに直接沿わしているのはヌルオブジェクトです。

Wheel_15

では、XPressoです。

Wheel_16

散々、難しそうに説明しましたが、これだけです。
あとは、「スプラインに沿う」タグの「スプライン上の位置」の数値を変化させるだけで、前進/後進どちらでも問題なくタイヤは転がります。

それでは、今回のファイル9.5は、「Wheel.ZIP」です。
このファイルは「スプラインに沿う」タグの「スプライン上の位置」をアニメートしています。

|

« artist sideで10個のカメラを一気にレンダリングね…追伸 | トップページ | C4D XPressoでタイヤを地面ポリゴンオブジェクトの上を転がす。 »