[C4D]XPressoでシンプルなCar Rigging
From "C4D XPresso car tutorial 1" https://vimeo.com/115767919
1. CubeとCylinderで簡素な車オブジェクトを作成

2. サスペンションを作成
・Simulate → Dynamics → Connector
・ConnectorのType(Connectorの"Object"内のエディターから)を"Wheel Suspension"を選択
・ConnectorオブジェクトのX軸を90度回転させる
・Connectorオブジェクトを複製し4つ(タイヤの数分)作成する。それぞれタイヤの中心に移動させる

・Connectorオブジェクトのエディター内"Object"にある、「Object A」「Object B」に以下のオブジェクトを割り当てる。
Object A → Bodyオブジェクト
Object B → それぞれのタイヤオブジェクト
・さらにエディター内"Object"にある"Suspension Stiffness"の値を1から増加(とりあえず10ぐらい)させる。
・TireオブジェクトとSuspensionオブジェクトでそれぞれNullオブジェクトを作りグループ化する。さらにその2つのNullをBodyオブジェクトの子にする。

・上記BodyオブジェクトとWheelsのNullにそれぞれRigid BodyのTagをつける。 ※WheelsはNullなのでそのままではその中のWheelsオブジェクトにはダイナミクスが反映されない。なので、Tag内の"Collision"にある"Inherit Tag"を"None"から"Apply Tag to Children"に変更する。

・Fieldオブジェクトを作り"Collider Body"Tagをつけて、アニメーション再生してみる。サスペンションを効かせてオブジェクトがFieldに着地する。
3. モーターを作成
・Motorオブジェクトを90度X軸に回転させる。

・Motorオブジェクトを4つ(タイヤの数)複製し、Nullでグループ化する。さらにBodyオブジェクトの子にする。
・

・X軸&Z軸を0cm、Y軸(Cood.)を1cmにする。
・Motorオブジェクトのエディター内"Object"の「Object A」「Object B」にそれぞれ下記を割り当てる。
Object A → Body
Object B → それぞれのWheel

・上記内の"Angular Target Speed"と"Torque"の値を調整する(とりあえず両方とも500)
・この時点でアニメーション再生をしてみる。タイヤが回転しながら車が前進すればOK。
・ただ、この状態では車がFieldに着地した瞬間もタイヤが回転している。つまり、摩擦力が発生していないことになる。
→ Fieldオブジェクトのエディター内"Collision"の"Friction"の値を300に変更する。
4. Xpressoとコントローラーの作成
・Nullオブジェクトを作成し、XPressoタグをつける。とりあえず一旦Xpressoは後でやるので置いておく。
・さらにもう1つNullオブジェクトを作成する → 車を操作するコントローラー用のオブジェクト

・ControllerのNullオブジェクトの"User Data"から"Manage User Data"を選択。
・現れたウィンドウから"Add Data"をクリック。
・Speed用のData:下記写真のように変更する。
Name → speed
Data Type → Float
Unit → Real
Unit Min → 0
Unit Max → 50

・さきほど作ったXpressoを立ち上げる。
ControllerオブジェクトをXpressoに入れる。Outputにさきほど作ったSpeed用コントローラー("User Datta"→ "speed")を指定する。
4つのMotorオブジェクトをXpressoに入れる。Inputに"Angular Target Speed"("Object Properties" → "Angular Target Speed")を指定する。

さらにControllerのOutputとMotorのInput(4つとも)を紐づける。
この時点でアニメーション再生してみると、Speedの値に応じてスピードが変化する。Speedの値をスライダーで変更することで速度が変化する。
・ステアリングのコントローラーを作成する。
すでに作成したControllerのNullオブジェクトのエディターから"User Data"から"Manage User Data"を選択する。現れたウィンドウから"Add Data"をクリックする。
下記のように設定する。
Name → steer L_R
Data Type → Float Slider
Unit → Percent
Unit Min → -100
Unit Max → 100

さきほどのSpeedと同じ要領でXpressoを構成させていく。
Xpresso内にSuspensionオブジェクトを2つ(モーターと違ってステアリングは2つ(前と後ろ)で1組とするため)入れる。InputにはSteering Angle("Object Properties"→''Steering Angle")を指定する。

ControllerのOutputに、"steer L_R"を追加する("User Data"→"steer L_R")
現在ステアリングの値は%に指定しているが、よりSensitiveに値をいじれるように、"Range Mapper"(New Node → Xpresso → Calculate → Range Mapper)を間に挟む("steer L_R"の値と"Steering Angle"の値をConvertする)。
"Node Properties"の"Input Range"を"Percent"に変更。
"Parameter"の"Input Lower"を-100に変更。"Output Lower"を-0.5に、"Output Upper"を0.5に変更。
下記にように紐づける。

この状態でアニメーション再生すると、スライダーの-の値で右に、+の値で左に車が曲がるが、Range Mapperの"Reverse"にチェックを入れると反転させることができる。

5. より詳細なセッティング
・0F〜5Fまではハンドルはまっすぐで、6Fからハンドルが曲がるようにする。
Xpressoにて、"Time"ノードを追加する(New Node → Xpresso → General → Time)。
デフォルトの状態では、値がフレームではなく秒になっているため、フレームに変更する。デフォルトのOutputを削除し、Outputに"Frame"を追加する。
"Compare"ノードを追加する(New Node → Xpresso → Logic → Compare)。エディター内の"Function"を">"に変更する。さらに"Name"を"Compare >5"に変更する。"Parameter"の"Input 1"を0に、"Input 2"を5にする。

"Time"のOutput(Frame)と"Compare > 5"のInput 1を紐づける。"Result"ノード(New Node → Xpresso → Genaral → Result)を追加すし、Inputを"Compare > 5"のOutputと紐づける。

上記画像の"Animation Refresh"がオンになっていれば、Resultの値がリアルタイムで変化する。アニメーション再生してみて、6Fから値が変化することが確認できれば、Resultノードは確認用なので削除する。
"Condition"ノードを追加する(New Node → Xpresso → Logic → Condition)。このConditionノードは"Compare > 5"の値が0(0〜5Fの時の値)であれば2つあるうちの上部のInputの値に、1(6F〜の値)であれば下部のInputの値が反映してくれる役割をもつ。
紐付けを下記のように行う。

6. コントローラーの作成その2:後進・ストップ・前進ボタン
・先ほどと同じ要領で、Contorollerオブジェクトのエディターから"User Data → Manage User Data"でUser Dataウィンドウを開く。
・"Add Data"をクリックし、下記のように設定する。
Name:gear
Data Type:Integer
Interface:Quicktab Radio
Cycle Option:0;reward
1;stop
2;forward

・Xpressoを立ち上げる。
ControllerノードとMotorノードの間にノードを挟み、-1、0,+1をかけることによってreverse、stop、forwardを切り替える仕組みを作る。
ControllerノードとMotorノードの紐付けを切り離し、ControllerノードのOutputに先ほどのgearノードを追加する(User Data → gear)。
Conditionノードを追加(さきほど作ったものを複製)し、Inputを2つから3つに追加する(gearのreverse,stop,forward用)。Conditionノードのエディターにて、3つのそれぞれのInputの値を-1,0,1と変更する。

"Controller"のOutput"gears"とConditionの"Switch"を紐づける。
上述の-1,0,+1を掛け算するための"Math"ノードを追加する(New Noder → Xpresso → Calculate → Math)。Mathのエディター内のFunctionを"Multiplay"に変更する。
下図のように紐づける。

これでアニメーション再生しながら、reverse・stop・forwardボタンを押すとそれに応じて車が後進・ストップ・前進する。
※CINEMA4Dではstopして2秒以上stopしたままにすると、その後reverserやforwardを押してもDynamicsが働かなくなるので注意。その問題を解消させるには以下の数値をいじる。
WheelsとBodyオブジェクトのエディター内、"Dynamics"の"Deactivation"の"Linear Velocity Threshold"と"Angular Velocity Threshold"の値を0にする。
