UDN
Search public documentation:

UsingSkeletalControllersJP
English Translation
中国翻译
한국어

Interested in the Unreal Engine?
Visit the Unreal Technology site.

Looking for jobs and company info?
Check out the Epic games site.

Questions about support via UDN?
Contact the UDN Staff

UE3 ホーム > アニメーション > 骨格コントローラを使用する
UE3 ホーム > アニメーター > 骨格コントローラを使用する

骨格コントローラを使用する


概要


SkelControl (骨格コントロール) を使用することによって、骨格メッシュ内の 1 つのボーンまたはボーンのグループをプログラミング的に修正することができます。SkelControl は、アニメーションブレンドの場合と同じツールである AnimTree Editor (アニメーションツリーエディタ) 内で設定します。AnimNode (アニメーションノード) と SkelControl を接続することはできません。これらは別々のシステムですが、便宜上同じワークスペースに表示されているにすぎません。このことは、次のように考えてみることができます。すなわち、アニメーションがルートの AnimTree (アニメーションツリー) ボックスに流れてきて、さらに SkelControl にも流れてくることによって、なんらかのやり方で各ボーンを修正できるようになる、といったことです。

SkelControl ノード


SkelControllerNode.jpg

  1. SkelController (骨格コントローラ) ノードの名前、および、ユーザーによって設定された SkelController の名前です。
  2. この SkelController のための出力コネクタです。
  3. strength (強さ) のスライダーです。SkelController の強さをセットすることができます。
  4. 強さのブレンドを上げ下げするトグル (切り替え) です。そのためには、SkelController ノードで定義される Blend In Time (ブレンドイン時間) と Blend Out Time (ブレンドアウト時間) を使用します。
  5. この SkelController のための入力コネクタです。
  6. SkelController の現在の強さです。

新たな SkelController を追加する


コントローラを追加して、キャラクターの頭部が特定のターゲットを向く (look at) ようにさせるには、次のようにします。

1. 青色の AnimTree ボックスを右クリックして、[Add SkelControl Chain] (骨格コントロールチェーンの追加) を選択します。
AddSkelControl_0.jpg

2. コンボボックスが表示され、そこから制御したいボーンを選択することができます。なお、ボーン 1 つにつき、コントロールチェーンは 1 つしか使えないことに注意してください。
AddSkelControl_1.jpg

3. Head bone (頭蓋骨) を選択すると、AnimTree 内に Head (ヘッド) というラベルが付いた緑色のコネクタが表示されます。
AddSkelControl_2.jpg

4. バックグラウンドを右クリックして新たな SkelControlLookAt を作成します。
AddSkelControl_3.jpg

5. SkelControlLookAt を Head コネクタに接続します。
AddSkelControl_4.jpg

既存の SkelController を編集する


既存の骨格ボーンチェーンのためのボーンを削除または変更するには、次のようにします。青色の AnimTree に付いている緑色のボックスを右クリックします。コンテクストメニューが現れ、削除変更などの操作を選択できます。

SkelControllerContextMenu.jpg

連結化と共有化


SkelControl は、互いと連結 (chain) させて、接続した順番で適用させることができます。したがって、SkelControlLookAt の後に、回転を追加する SkelControlSingleBone を連結させた場合は、ボーンがまずターゲットの方を見てから、その回転によってオフセットされます。

SkelControl は、複数のボーンによって共有されることも可能です。したがって、多数のボーンが同一のターゲットに向くようにさせるには、ただ 1 つの SkelControlLookAt を使用して、複数のボーンをそれに接続します。

UnrealScript で SkelControl ノードを参照する


SkelControl は、UnrealScript で参照することが可能です。その方法は、Animation ノードの場合とほとんど同じです。AnimTree 内の各 SkelControl ノードには、 Control Name (コントロール名) プロパティがあります。これを、AnimTree 内で設定することができます。

ガーベジコレクタによってあらゆるものが確実にクリーンアップされるようにするには、所有しているアクタが破棄される際に、SkelControl への参照も確実に削除するようにすべきです。

YourActorClass.uc
var SkelControl ASkelControl;
var() Name ASkelControlName;

simulated event PostInitAnimTree(SkeletalMeshComponent SkelComp)
{
  Super.PostInitAnimTree(SkelComp);

  if (SkelComp == Mesh)
  {
    ASkelControl = Mesh.FindSkelControl(ASkelControlName);
  }
}

simulated event Destroyed()
{
  Super.Destroyed();

  ASkelControl = None;
}

SkelControl のプロパティ

あらゆる SkelControl に共通するプロパティがいくつかあります。

  • Control Name - 特定の SkelControl をコードから検索して修正するために、プログラマーが使用する名前です。
  • Control Strength - 現在の SkelControl の強さです。
  • Blend In Time - SkelControl がブレンドインするのに要する時間です。(単位 : 秒)。
  • Blend Out Time - SkelControl がブレンドアウトするのに要する時間です。(単位 : 秒)。
  • Blend Type - ブレンドの仕方を指定します。
    • ABT_Linear - ブレンド時に線形補間を実行します。 Wiki
    • ABT_Cubic - ブレンド時にキュービック補間を実行します。 Wiki
    • ABT_Sinusoidal - ブレンド時に正弦波補間を実行します。 Wiki
    • ABT_EaseInOutExponent2 - ブレンド時に「インビトウィーニング」補間を実行します。 Wiki
    • ABT_EaseInOutExponent3 - ブレンド時に「インビトウィーニング」補間を実行します。 Wiki
    • ABT_EaseInOutExponent4 - ブレンド時に「インビトウィーニング」補間を実行します。 Wiki
    • ABT_EaseInOutExponent5 - ブレンド時に「インビトウィーニング」補間を実行します。 Wiki
  • Post Physics Controller - 当該の SkelControl が、物理パスの後に適用されます。
  • Set Strength From Anim Node - true の場合は、制御の強さが指定された AnimNode (複数も) と同じになります。これによって、ノードとコントローラ間の移行が容易になります。
  • Controlled By Anim Metadata - true の場合は、ウエイトのデフォルト値が 0 に設定されるとともに、アニメーションのメタデータが、アニメーションのウエイトに基づいて、ノードを有効にします。
  • Invert Metadata Weight - true の場合は、ウエイトのデフォルト値が 1 に設定されるとともに、メタデータが 0 にセットすることによって、骨格コントローラを無効にします。
  • Propagate Set Active - true の場合は、当該の SkelControl がアクティブになると、チェーン内の次の SkelControl もアクティブになります。
  • Strength Anim Node Name List - SkelControl の制御の強さを設定するために問い合わされるアニメーションノードのリストです。これは、 Set Strength From Anim Node (アニメーションノードから強さを設定する) といっしょに使用します。
  • Bone Scale - SkelControl が機能しているボーン、および、すべての子ボーンに対して、スケーリングを適用することができます。
  • Ignore When Not Rendered - メッシュが現在レンダリングされていない場合は、当該の SkelControl が適用されません。
  • Ignore At Or Above LOD - アクタの LOD がこの値を超えている場合は、SkelControl が無効になります。

SkelControl によって指定されているほとんどの位置と回転によって、それが定義される「空間 (space)」(すなわち 「基準座標系 (reference frame)」) を選択することができます。以下は、各種オプションの簡単な説明です。

  • BCS_WorldSpace - ワールド内の位置として指定します。
  • BCS_ActorSpace - アクタの原点を基準とします。
  • BCS_ComponentSpace - Skeletal Mesh Component (骨格メッシュコンポーネント) の原点を基準とします。
  • BCS_ParentBoneSpace - SkelControl が制御しているボーンがもつ親のボーンの基準座標系を基準とします。
  • BCS_BoneSpace - SkelControl が制御しているボーンを基準とします。
  • BCS_OtherBoneSpace - 骨格の階層においてユーザーによって指定された他のボーンを基準とします。(SkelControl 内に BoneName というオプションがあり、ボーンを指定することができます)。

Limb (四肢)

SkelControlLimb


SkelControlLimb コントローラは、「Unreal Engine 3」の インバース キネマティクス ソルバを使用します。このコントローラは、ワールド空間内におけるターゲットの位置を使用し、制御されるボーンよりも上に位置する 2 つのボーンを回転させることによって、ターゲットに到達しようとします。ターゲットに到達できない場合は、ボーンができるだけ近くに配置されます。limb (四肢) の端のターゲット位置を指定するとともに、関節が曲がる方向のターゲットも指定します。(これは、3D ビューポートにおいて、ピンク色のダイヤモンドで示されています)。

なお、腕の階層内にロールボーンがある場合、Limb コントローラは機能しない場合があります。(すなわち、下腕が上腕ロールボーンの子である場合)。また、腕が 4 つのボーンではなく 2 つのボーンで構成されるように骨格を作成する必要があります。下図は、この問題について示したものです。

ArmSkelHierarchy.jpg

左側にあるボーンは、3D のパッケージで典型的なものですが、リアルタイムの骨格制御にとっては非効率です。この腕チェーンにおいて、IK (インバース キネマティクス) を使用すれば、IK チェーンが 4 つのボーンから構成されることになります。ところが、下図の右に示されているように、2 つのボーンだけで済ますことができます。この両方の状況において、ロールボーンは、アームボーンの子となります。両者の違いは、左図の方が、上腕から手まで 4 つのボーンが連続した階層であり、右図の方が、上腕から手まで 2 つのボーンから構成される階層になっていることです。

SkelControlLimbExample.jpg

プロパティ
  • Effector Location - 制御されるボーンの望ましい位置です。
  • Effector Location Space - Effector Location が定義される空間です。
  • Effector Space Bone Name - Effector Location Space が BCS_OtherBoneSpace である場合、このプロパティの値がボーンの名前として使用されます。
  • Joint Target Location - ジョイントが曲げられたときに動く方向の、空間内における位置です。
  • Joint Target Location Space - Joint Target Location が定義される空間です。
  • Joint Target Space Bone Name - Joint Target Location Space が BCS_OtherBoneSpace である場合、このプロパティの値がボーンの名前として使用されます。
  • Bone Axis - ボーンに沿った方向を向いている、libm 内のボーンの軸です。
  • Joint Axis - ジョイントの軸に合わせるべきボーンの軸です。したがって、肘 (ひじ) に関しては、肘が曲がるときの軸でなければなりません。
  • Invert Bone Axis - BoneAxis ベクターが反転 (invert) される必要があるかどうかを指定します。
  • Invert Joint Axis - Joint Axis ベクターが反転される必要があるかどうかを指定します。
  • Maintain Effector Rel Rot - true の場合は、終端エフェクタボーンとその親ボーン間の相対的な回転を変更します。false の場合は、終端ボーンの回転が、コントローラによって変更されません。

UnrealScript で使用する方法
以下の例では、SkelControlLimb を使って、単純なアニメーションを作っています。(ポーンがバーベルを持ち上げます)。 SkelControlLimb を使って、ワールド空間のある位置を、両手の目的地としてセットします。動的なトリガーが使用されて、両手が動いていくべき位置がマークされます。Matinee を使用してバーベルが上下に動く際、動的なトリガーは、アタッチされているため、いっしょに動きます。ティック 1 回につき 1 度、SkelControlLimbs が更新されます。その際、 Effector Location が、動的なトリガーと同じ位置にセットされます。

SkelControlLimbPumpingIron.jpg

SkelControlLimbPawn.uc
class SkelControlLimbPawn extends Pawn
  Placeable;

var(SkelControl) Name LeftArmSkelControlName;
var(SkelControl) Name RightArmSkelControlName;
var(SkelControl) Actor LeftArmAttachment;
var(SkelControl) Actor RightArmAttachment;

var SkelControlLimb LeftArmSkelControl;
var SkelControlLimb RightArmSkelControl;

simulated event PostInitAnimTree(SkeletalMeshComponent SkelComp)
{
  Super.PostInitAnimTree(SkelComp);

  if (SkelComp == Mesh)
  {
    LeftArmSkelControl = SkelControlLimb(Mesh.FindSkelControl(LeftArmSkelControlName));
    RightArmSkelControl = SkelControlLimb(Mesh.FindSkelControl(RightArmSkelControlName));
  }
}

simulated event Destroyed()
{
  Super.Destroyed();

  LeftArmSkelControl = None;
  RightArmSkelControl = None;
}

simulated event Tick(float DeltaTime)
{
  Super.Tick(DeltaTime);

  if (LeftArmSkelControl != None && LeftArmAttachment != None)
  {
    LeftArmSkelControl.EffectorLocation = LeftArmAttachment.Location;
  }

  if (RightArmSkelControl != None && RightArmAttachment != None)
  {
    RightArmSkelControl.EffectorLocation = RightArmAttachment.Location;
  }
}

defaultproperties
{
  Begin Object Class=SkeletalMeshComponent Name=PawnMesh
  End Object
  Mesh=PawnMesh
  Components.Add(PawnMesh)

  Physics=PHYS_Falling

  Begin Object Name=CollisionCylinder
    CollisionRadius=+0030.0000
    CollisionHeight=+0072.000000
  End Object
}

SkelControlFootPlacement


SkelControlFootPlacement (骨格制御 足の配置) は、キャラクターの足を適切に地面に配置するように設計されている SkelControlLimbの特別な型です。このコントロールは、キャラクターの足のボーンにアタッチする必要があります。腰のボーンの位置から、足のボーンの位置まで毎フレームごと、ラインチェックが実行されます。何にもヒットしなければ、脚は変更されません。何かにヒットすれば、コントロールの Effector Location が、そのヒットポイント (衝突点) に設定され、脚が曲げられて、足が地面に配置されます。 Effector Location は、自動的に生成されるため、コントロールでウィジェットを用いて編集することができません。ただし、 Joint Target Location を編集することによって、脚が正しい方向に曲がるように調整することができます。

SkelControlFootPlacementExample.jpg

プロパティ
  • Foot Offset - 生成された Effector Location に適用されて、ラインテストに沿って引き戻すためのオフセットです。足のボーンは通常、足の底面にはないため、このオフセットによって、グランド上での足の高さを調整することができます。
  • Foot Up Axis - Orient Foot To Ground が true の場合に、サーフェス法線に合わせるべき足のボーンの軸です。
  • Foot Rot Offset - Orient Foot To Ground である場合に、足に適用される付加的な回転です。足のボーンに上向きの軸がない場合に、必須とすることができます。
  • Invert Foot Up Axis - Foot Up Axis を反転させるべきか否かを指定します。
  • Orient Foot To Ground - 足のボーンを回転させることによって、ラインチェックでヒットしたサーフェス法線に合わせる必要があるか否かを指定します。
  • Max Up Adjustment - SkelControl によって足が上に動かされるときの最大量です。
  • Max Down Adjustment - SkelControl によって足が下に動かされるときの最大量です。
  • Bone Axis - ボーンが伸びている方向に合わせるべき、グラフィカルなボーンの軸です。
  • Joint Axis - ジョイントのヒンジ軸に合わせるべき、グラフィカルなボーンの軸です。
  • Invert Bone Axis - ボーンの変形 (transform) を作成する際に Bone Axis を反転させる場合は、true をセットします。
  • Invert Joint Axis - ボーンの変形 (transform) を作成する際に Joint Axis を反転させる場合は、true をセットします。
  • Rotate Joint - 新たな行列を作るのではなく、ジョイントボーンの回転 ( Rotate Joint bone) を試みます。
  • Maintain Effector Rel Rot - true の場合は、終端エフェクタ ボーンとその親のボーン間における相対的な回転を修正します。 false の場合は、終端ボーンの回転が、コントローラによって変更されません。
  • Take Rotation From Effector Space - true の場合は、エフェクタボーンの回転が、 EffectorSpaceBoneName によって指定されたボーンからコピーされます。

AnimTree エディタでは、足の配置をテストするために、フロアのメッシュに関するプレビューを表示することができます。ツールバー上にある [Show Floor] (フロアの表示) ボタン ShowFloorButton.jpg をクリックすると、フロアのメッシュが表示されます。フロアを移動および回転させるには、Ctrl キーを押しながら次のボタンを使用します。

  • 左マウスボタン - X および Y 軸に沿ってフロアを平行移動させます。
  • 右マウスボタン - Z 軸を中心にフロアを回転させます。
  • 左 + 右マウスボタン - Z 軸に沿ってフロアを平行移動させます。

高度な足の配置
足の配置 SkelController ノードによって、たいていのことには対処できます。ただし、シーンに応じてうまく機能させるためには、足の配置 SkelController ノードを調整または変更しなければならない場合もしばしばあります。

メッシュのオフセット
アニメーションは、平らなグラウンドでオーサリングされます。したがって、キャラクターがグラウンドよりも高いものに足を運ぶ場合、足配置のコードによって足が持ち上げられ、万事良好に見えるようになります。さてここで、コリジョンがアニメートされたグランドレベルよりも下で生じた場合 (例 : 階段を降りる場合)、足が空中に浮いたままになるか、脚を下に踏み出そうとして伸びすぎてしまうことになります。これは見苦しいです。そこで、通常は、ゲームコードが両足から実際のフロアまでの最短距離を見つけ、そのオフセットでメッシュを移動させることになります。その際、補間をいくらか行うと、よりスムーズに見えるようになるでしょう。このようなコードの例は、「Unreal Tournament 3」のソースコードである AUTPawn::DoFootPlacement in UTPawn.cpp にあります。 -->

ご覧のように、ポーンは、ポーンのコリジョンによって配置され、正しいレベルに置かれています。ただし、ポーンが浮かんでいるように見える場合があるということにもなります。そのような場合を修正するには、メッシュを平行移動させることによって、強制的に下げます。それ以降は、足配置が残りの処理を担当します。

FootPlacementMeshOffset.jpg

この方法は、スロープでも有効です。

FootPlacementMeshOffsetOnSlopes.jpg

コードのロジックは、下に向かってトレースを実行するに過ぎません。その際、左足および右足のボーンにアタッチされているソケットの X および Y の位置を使用します。Z の位置は、ポーンが立っているフロアをトレースが突き抜けないようにするためのポーンの位置です。ヒットの位置が分かると、メッシュの平行移動ベクターが適切に計算されて、メッシュに渡されます。フロアが検知されなかった場合 (ポーンは泳いでいるのでしょうか) は、メッシュの平行移動が、このティックで適用されません。ポーンが落下している場合は、このプロセス全体も中止されます。

AdvancedFootPlacementPawn.uc
class AdvancedFootPlacementPawn extends Pawn
  Placeable;

var(FootPlacement) float FootTraceRange;
var(FootPlacement) Name LeftFootSocketName;
var(FootPlacement) Name RightFootSocketName;
var(FootPlacement) float TranslationZOffset;
var(FootPlacement) Name LeftFootPlacementSkelControlName;
var(FootPlacement) Name RightFootPlacementSkelControlName;
var SkelControlFootPlacement LeftFootPlacementSkelControl;
var SkelControlFootPlacement RightFootPlacementSkelControl;

simulated function EnableLeftFootPlacement()
{
  SetSkelControlActive(LeftFootPlacementSkelControl, true);
}

simulated function DisableLeftFootPlacement()
{
  SetSkelControlActive(LeftFootPlacementSkelControl, false);
}

simulated function EnableRightFootPlacement()
{
  SetSkelControlActive(RightFootPlacementSkelControl, true);
}

simulated function DisableRightFootPlacement()
{
  SetSkelControlActive(RightFootPlacementSkelControl, false);
}

simulated function SetSkelControlActive(SkelControlBase SkelControl, bool IsActive)
{
  if (SkelControl != None)
  {
    SkelControl.SetSkelControlActive(IsActive);
  }
}

simulated event PostInitAnimTree(SkeletalMeshComponent SkelComp)
{
  Super.PostInitAnimTree(SkelComp);

  if (SkelComp == Mesh)
  {
    LeftFootPlacementSkelControl = SkelControlFootPlacement(Mesh.FindSkelControl(LeftFootPlacementSkelControlName));
    RightFootPlacementSkelControl = SkelControlFootPlacement(Mesh.FindSkelControl(RightFootPlacementSkelControlName));
  }
}

simulated event Destroyed()
{
  Super.Destroyed();

  LeftFootPlacementSkelControl = None;
  RightFootPlacementSkelControl = None;
}

simulated event Tick(float DeltaTime)
{
  local Vector LeftFootHitLocation, LeftFootHitNormal, LeftFootTraceEnd, LeftFootTraceStart;
  local Vector RightFootHitLocation, RightFootHitNormal, RightFootTraceEnd, RightFootTraceStart;
  local Vector DesiredMeshTranslation;
  local Rotator SocketRotation;
  local Actor LeftFootHitActor, RightFootHitActor;

  Super.Tick(DeltaTime);

  if (Mesh == None || Physics == PHYS_Falling)
  {
    return;
  }

  Mesh.GetSocketWorldLocationAndRotation(LeftFootSocketName, LeftFootTraceStart, SocketRotation);
  LeftFootTraceStart.Z = Location.Z;
  LeftFootTraceEnd = LeftFootTraceStart - (Vect(0.f, 0.f, 1.f) * FootTraceRange);
  // Trace down to find the position for the left foot
  ForEach TraceActors(class'Actor', LeftFootHitActor, LeftFootHitLocation, LeftFootHitNormal, LeftFootTraceEnd, LeftFootTraceStart,,, TRACEFLAG_Bullet)
  {
    // Block if we've hit world geometry
    if (LeftFootHitActor.bWorldGeometry || LeftFootHitActor.IsA('InterpActor'))
    {
      break;
    }
  }

  // Trace down to find the position for the right foot
  Mesh.GetSocketWorldLocationAndRotation(RightFootSocketName, RightFootTraceStart, SocketRotation);
  RightFootTraceStart.Z = Location.Z;
  RightFootTraceEnd = RightFootTraceStart - (Vect(0.f, 0.f, 1.f) * FootTraceRange);
  // Trace down to find the position for the right foot
  ForEach TraceActors(class'Actor', RightFootHitActor, RightFootHitLocation, RightFootHitNormal, RightFootTraceEnd, RightFootTraceStart,,, TRACEFLAG_Bullet)
  {
    // Block if we've hit world geometry
    if (RightFootHitActor.bWorldGeometry || RightFootHitActor.IsA('InterpActor'))
    {
      break;
    }
  }

  // Not in range to touch the ground
  if (LeftFootHitActor == None && RightFootHitActor == None)
  {
    return;
  }

  if (LeftFootHitActor != None && RightFootHitActor == None)
  {
    DesiredMeshTranslation.Z = (LeftFootHitLocation.Z - Location.Z) + Mesh.default.Translation.Z + TranslationZOffset;
  }
  else if (LeftFootHitActor == None && RightFootHitActor != None)
  {
    DesiredMeshTranslation.Z = (RightFootHitLocation.Z - Location.Z) + Mesh.default.Translation.Z + TranslationZOffset;
  }
  else
  {
    // Adjust the desired mesh translation
    if (LeftFootHitLocation.Z < RightFootHitLocation.Z)
    {
      DesiredMeshTranslation.Z = (LeftFootHitLocation.Z - Location.Z) + Mesh.default.Translation.Z + TranslationZOffset;
    }
    else
    {
      DesiredMeshTranslation.Z = (RightFootHitLocation.Z - Location.Z) + Mesh.default.Translation.Z + TranslationZOffset;
    }
  }

  // Set the mesh translation
  Mesh.SetTranslation(DesiredMeshTranslation);
}

defaultproperties
{
  LeftFootSocketName="LeftFootSocket"
  RightFootSocketName="RightFootSocket"
  FootTraceRange=96.f

  Begin Object Class=SkeletalMeshComponent Name=PawnMesh
  End Object
  Mesh=PawnMesh
  Components.Add(PawnMesh)

  Physics=PHYS_Falling

  Begin Object Name=CollisionCylinder
    CollisionRadius=+0030.0000
    CollisionHeight=+0072.000000
  End Object
}

このシンプルな方法によって、メッシュが正しい位置に置かれるようになり、それにともなって、足配置 SkelControl がうまく機能するようになります。ただし、この方法は高速ではありますが、ポーンが動いている場合や複雑な動作を行っている場合には、あまりうまく機能しません。

動いている間の足配置
動いている場合 (じっと立っている場合だけではなく) の足配置を実現する 1 つの方法としては、足のボーンとアニメートされたグラウンドのレベル (これは通常、Root Bone (ルートボーン) の位置によって表わされます) の間のオフセット (高さの) を考慮に入れるというやり方があります。ここで、Foot Bone (足のボーン) を、実際にグラウンドがある位置に動かさず、Foot Bone にオフセットを加えます。(アニメート化されたグラウンドの高さと実際のグラウンドの高さの間の差分を加えることになります)。これで、アニメーションによって脚が正しく上がり、ワールドをたどるようになります。出来映えを向上させるには、少しばかり補間や、スムージング、またメッシュのオフセットが必要となります。ただし、この方法は、導入するのにかなりシンプルなソリューションであり、うまく機能します。 システムは、足の真下のグラウンドレベルをモニタするため、ラグが少しばかり発生する傾向にあります。これを改善する 1 つの方法としては、足が着地する場所を予測するというやり方があります。ただし、そのためには、移動のアニメーションを分析して足の着地点を正しく予測する複雑なシステムが実装される必要があります。次のスクリーンショットは、「Gears of War 2」のコードを使用してプロトタイプされたシステムのものです。

FootPlacementWhileMoving.jpg

Floor Conforming (フロアとの整合)
Floor Conforming (フロアとの整合) とは、キャラクターまたはその足 (またはその両方) をスロープに対して正しい方向に向けることによって、足がスロープと平行に動くようにすることです。これを簡単に実現するには、キャラクターの骨格に IK Foot Bone Setup (インバース キネマティクス 足ボーンの設定) を置きます。基本的に、IK Foot Root ボーンは、Root Bone から由来し、IK Foot Right ボーンと IK Foot Left ボーンは、アニメーションの毎フレームにおいて、足のボーンと正確に一致します。さらに、IK Foot Root ボーンを平行移動および回転させることによって、スロープの方向に対して足の動きを正しく方向づけることが容易になります。ここでも、スムーズに仕上げるには、若干の補間とメッシュのオフセットが必要となります。さらに、メッシュ全体を回転させることによって、スロープおよびスロープの変化に対してキャラクターの胴体を調整して、より自然に仕上げることができます。(動いているときはスロープにややのめり込むようにし、止まっているときはやや反り返るようにします)。空間内で所定の地点をキャラクターに狙わせたままにさせておくために、メッシュの回転分を相殺するのは、非常に簡単です。次のスクリーンショットは、「Gears of War 2」のコードを使用してプロトタイプされたシステムのものです。

FloorConforming.jpg

動くベース
キャラクターが動くベース (Mover とも言われます) の上に立っている場合、その Mover が回転すると、キャラクターはスライドし、完全に地面から離れているように見えてしまいます。上記で解説した Floor Conforming (フロアとの整合) は役に立ちますが、それでもキャラクターがベースに対してスライドして、足がまったく接地していないように見えてしまいます。なぜこのようなことが起きるのでしょうか? その原因は、ポーンのコリジョンのために、AABB (軸並行境界ボックス) を「Unreal」が使用していることにあります。そのため、そのボックスは Mover とともに回転しないのです。さらに悪いことには、Mover が回転すると、ボックスが上下に押されてしまいます。しかし、ちょっとした計算をすることによって、足の位置を算出して、必要な埋め合わせをすることが可能です。また、その際に Mover がポーンよりも前にティックされなければなりません。次のスクリーンショットは、「Gears of War 2」のコードを使用してプロトタイプされたシステムのものです。

FootPlacementMovers.jpg

反動 (recoil)

GameSkelControl_Recoil


この SkelControl は、武器が発砲したときに腕に適用される力 (反動) をシミュレートします。アニメーションを利用しても同じエフェクトを、実現することができますが、この SkelController を利用すると、他の SkelControl と組み合わせることができるという利点があります。このノードを使用する場合、単一のボーンにだけ影響を与えればよい場合が多いです。この例では b_IK_Gun がそれに該当します。SkelControlLimb が左右の手のボーンで使用されることによって、b_IK_Gun にアタッチしている手のボーンでインバース キネマティクスが実行されます。

SkelControlRecoilAnimTree.jpg

プロパティ
  • Bone Space Recoil - true の場合は、照準 (aim) が無視され、反動だけがローカルのボーン空間で適用されます。
  • Play Recoil - 反動の有効 / 無効を切り替えます。
  • Recoil (反動) - 反動の情報です。
    • Time Duration - 反動の振動が生じる長さ (秒数) です。
    • Rot Amplitude - 回転の大きさを示すベクターです。
    • Rot Frequency - 回転の頻度を示すベクターです。
    • Rot Params - 回転のパラメータです。
    • Loc Amplitude - 位置に関するオフセットの大きさを示すベクターです。
    • Loc Frequency - 位置に関するオフセットの頻度を示すベクターです。
    • Loc Params - 位置のパラメータです。
  • Aim - [-1.f, 1.f : -1.f, 1.f] の範囲で表現される照準のベクターです。

UnrealScript で使用する方法
以下の例では、ポーンが Link Gun を 0.2 秒ごとに発砲し、その武器の発砲により腕が反動を受けます。

SkelControlRecoilPawn.uc
class SkelControlRecoilPawn extends Pawn
  Placeable;

var() Name RecoilSkelControlName;
var() float FireRate;

var GameSkelCtrl_Recoil RecoilSkelControl;

simulated event PostInitAnimTree(SkeletalMeshComponent SkelComp)
{
  Super.PostInitAnimTree(SkelComp);

  if (SkelComp == Mesh)
  {
    RecoilSkelControl = GameSkelCtrl_Recoil(Mesh.FindSkelControl(RecoilSkelControlName));
  }

  SetTimer(FireRate, true, NameOf(PlayRecoil));
}

simulated event Destroyed()
{
  Super.Destroyed();

  RecoilSkelControl = None;
}

simulated function PlayRecoil()
{
  if (RecoilSkelControl != None)
  {
    RecoilSkelControl.bPlayRecoil = true;
  }
}

defaultproperties
{
  FireRate=0.2f

  Begin Object Class=SkeletalMeshComponent Name=PawnMesh
  End Object
  Mesh=PawnMesh
  Components.Add(PawnMesh)

  Physics=PHYS_Falling

  Begin Object Name=CollisionCylinder
    CollisionRadius=+0030.0000
    CollisionHeight=+0072.000000
  End Object
}

単一のボーン

SkelControlSingleBone


SkelControlSingleBone は、単一のボーンの回転または平行移動 (またはその両方) を修正する簡単なコントロールです。たとえば、アンテナなどを回転するときに便利です。

SkelControlSingleBone.jpg

プロパティ
  • Apply Translation - 平行移動に対して何らかの変更を加える必要があるか否かを示します。false の場合は、平行移動に関する他の全設定値が無視されます。
  • Add Translation - true の場合は、指定された平行移動がアニメーションの結果に加えられます。true の場合は、アニメートされた平行移動の代わりとなります。
  • Bone Translation - ボーンに適用する平行移動です。
  • Bone Translation Space - 平行移動が適用される空間です。
  • Translation Space Bone Name - Bone Translation Space が BCS_OtherBoneSpace である場合、このプロパティの値がボーン名として使用されます。
  • Apply Rotation - Apply Translation の場合と同様に、回転を変化させてそれを有効にするためには true にセットしなければなりません。
  • Add Rotation - true の場合は、アニメーションの結果に加えられます。false の場合は、既存の回転に取って代わります。
  • Bone Rotation - ボーンに適用する実際の回転です。
  • Bone Rotation Space - ボーンの回転を適用する基準座標系です。
  • Rotation Space Bone Name - Bone Rotation Space が BCS_OtherBoneSpace である場合、このプロパティの値がボーン名として使用されます。

UnrealScript で使用する方法
次の例では、ポーンが背骨 (spine bone) を回転させることによって、あなたに向き合います。

SkelControlSingleBonePawn.uc
class SkelControlSingleBonePawn extends Pawn
  Placeable;

var() Name SkelControlSingleBoneName;
var SkelControlSingleBone SkelControlSingleBone;

simulated event PostInitAnimTree(SkeletalMeshComponent SkelComp)
{
  Super.PostInitAnimTree(SkelComp);

  if (SkelComp == Mesh)
  {
    SkelControlSingleBone = SkelControlSingleBone(Mesh.FindSkelControl(SkelControlSingleBoneName));
  }
}

simulated event Destroyed()
{
  Super.Destroyed();

  SkelControlSingleBone = None;
}

simulated event Tick(float DeltaTime)
{
  local PlayerController PlayerController;
  local Rotator R;

  Super.Tick(DeltaTime);

  if (SkelControlSingleBone != None)
  {
    PlayerController = GetALocalPlayerController();
    if (PlayerController != None && PlayerController.Pawn != None)
    {
      R = Rotator(Location - PlayerController.Pawn.Location);
      SkelControlSingleBone.BoneRotation.Yaw = R.Yaw;
    }
  }
}

defaultproperties
{
  Begin Object Class=SkeletalMeshComponent Name=PawnMesh
  End Object
  Mesh=PawnMesh
  Components.Add(PawnMesh)

  Physics=PHYS_Falling

  Begin Object Name=CollisionCylinder
    CollisionRadius=+0030.0000
    CollisionHeight=+0072.000000
  End Object
}

SkelControl_Handlebars


この SkelControl_Handlebars (ハンドル) コントローラは、「Unreal Engine 3」のビークル (乗り物) システムとともに使用するように設計されています。このコントローラは、SkelControlWheel によって修正済みの車輪の回転を参照することによって、それがコントロールするボーンを調整します。これによって、たとえば、自動化されたハンドルを設定することが容易になります。

SkelControlHandleBar.jpg

プロパティ
  • Wheel Roll Axis - 車輪が回転するときの軸です。
  • Handlebar Rotate Axis - ハンドル操作を行うときの軸です。
  • Wheel Bone Name - ハンドル操作を制御する回転を有するボーンの名前です。
  • Invert Rotation - 制御されるボーンに適用する回転を反転させます。

SkelControl_Multiply


この SkelControl_Multiply (乗算) コントローラは、これより前に行われた骨格のブレンド結果を乗算するために使用します。

SkelControlMultiply.jpg

プロパティ
  • Multiplier (乗数) - これより前に行われた骨格のブレンドに掛け合わせる数を表す float 値です。

SkelControl_TwistBone


この SkelControl_TwistBone (ボーンをひねる) コントローラは、twist (ひねる) / roll (回転させる) ボーンをプロシージャルに処理するようにできています。アニメートされたポーズと参照ポーズの間において Source Bone Name (ソースボーン名) の回転を調べ、スケーリングをともなう回転を roll ボーンに適用します。

SkelControlTwistBone.jpg

プロパティ
  • Source Bone Name - 調べるソースボーン名です。たとえば、この SkelControl のためのソースとして左上腕のボーンを使用している場合は、この名前に左手のボーンをセットします。
  • Twist Angle Scale - スケーリングする回転の角度の量を指定します。

SkelControlWheel


この SkelControl_Handlebars (ハンドル) コントローラは、「Unreal Engine 3」のビークル (乗り物) システムとともに使用するように設計されています。ビークル (乗り物) では、 各車輪 (wheel) のためのボーンをもつ SkeletalMeshes (骨格メッシュ) が使用されます。ゲーム内で車輪が動き、方向転換するようになるには、まず、各車輪のために SkelControlWheel を作成する必要があります。さらに、それに名前を付け、その名前を使ってビークルのシステム内にあるコントロールを特定します。ビークルのシステムによって、毎フレーム、コントロールが更新されることによって、基礎的なシミュレーションである垂直方向の動き、ロール (回転)、方向転換と車輪が一致するようになります。Vehicle (ビークル) 内に格納されている Steering (方向転換) と Throttle (スロットル) を使用することによって、ステートが決まります。

SkelControlWheel.jpg

プロパティ
  • WheelDisplacement - 車輪の垂直方向の動きを単にプレビューするためだけのものです。この数をセットすると、車輪が上がります。
  • WheelMaxRenderDisplacement - 車輪が動く最大垂直距離を保持します。これによって、車輪がシャーシジオメトリにけっしてめり込まないようにすることができます。
  • WheelRoll - WheelDisplacement と同様に、車輪のロール (回転) をプレビューするために使用されます。正の値をセットすると、自動車が前に進むときのように車輪がロールします。
  • WheelRollAxis - どの車輪のボーンの軸を中心にして車輪がロールすべきかを指定します。
  • WheelSteering - 車輪の方向転換の動きをプレビューするために使用されます。正の値をセットすると、車輪が右方向に動きます。
  • WheelSteeringAxis - 車輪が方向転換する際に回転のために使用する車輪ボーンの軸を指定します。
  • InvertWheelRoll - ロールのための回転を反転させます。
  • InvertWheelSteering - 方向転換のための回転を反転させます。

UDKSkelControl_Damage / UTSkelControl_Damage


この SkelControl_Handlebars (ハンドル) コントローラは、「Unreal Engine 3」のビークル (乗り物) システムとともに使用するように設計されています。ビークル (乗り物) が破損した場合、それの骨格コントローラによって、ビークル破損のビジュアル的要素が作成されます。たとえば、ビークルの一部を壊し、静的メッシュを破損させて飛び散らせることができます。大概は、自動的な骨格コントローラを使用しますが、この骨格コントローラをサブクラス化することによって、BreakApart (破損分離)、BreakApartOnDeath (デス (death) 時に破損分離)、RestorePart (部品の修復) をオーバーライドすることもできます。

UDKSkelControl_Damage.jpg

以下は、「Unreal」エディタ内にエクスポーズされる変数です。
  • On Damage Active - OnDamage (ダメージ時) 機能がアクティブであるか否かを保持します。
  • Damage Bone Scale - ダメージ時にボーンをスケーリングする値です。
  • Damage Max - 骨格コントローラが、デスの前までに受けることができるダメージ量です。
  • Activation Threshold - ヘルスターゲットがこの閾値を超えると、コントロールが無効になります。
  • Control Str Follows Health - アクティベートされると、骨格コントローラは、残りヘルス値の結果としてコントロールの強度を生成します。それ以外は、常に最高の強度となります。
  • Break Mesh - 骨格コントローラが破損した場合にスポーンする静的メッシュです。
  • Break Threshold - スプリングが壊れそうに見え始めるときの閾値です。
  • Break Time - 破壊しつつある状態から破壊が完了した状態までに要する時間の長さです。
  • Default Break Dir - 破損分離する場合に、ベクターを作成するために使います。
  • Damage Scale - スポーンされた部品のために使用するスケールです。(すなわち、静的メッシュのアセットが 1 個できますが、それは、中心線を軸にして対称な、ビークル上の異なる位置からスポーンされたものです)。
  • PS_Damage On Break - この部分が破損した場合にスポーンするパーティクルシステムです。
  • PS_Damage Trail - この部分が飛び散ったときにアタッチするパーティクルシステムです。(例 : 刺激臭のある黒煙のトレイル (trail) !)
  • Break Speed - 部品が破損して飛び散り、ビークルをクリアする場合に、部品を押し上げる力です。
  • On Death Active - OnDeath 機能が有効であるか否かを保持します。
  • On Death Use For Secondary Explosion - 派生的爆発のための OnDeath 機能が有効であるか否かを保持します。
  • Death Percent To Actually Spawn - OnDeath が有効である場合に、部品が実際にスポーンされる率です。
  • Death Bone Scale - デス時にボーンをスケーリングする値です。
  • Death Static Mesh - デス時にスポーンする静的メッシュです。
  • Death Impulse Dir - スポーンされたビークルの部品が飛び散る方向です。
  • Death Scale - スポーンされた部品のために使用するスケールです。(すなわち、静的メッシュのアセットが 1 個できますが、それは、中心線を軸にして対称な、ビークル上の異なる位置からスポーンされたものです)。
  • PS_Death On Break - 当該の部品が壊れたときにスポーンするパーティクルシステムです。
  • PS_Death Trail - この部品が飛び散るときにアタッチするパーティクルシステムです。(例 : 刺激臭のある黒煙のトレイル (trail) !)

UnrealScript の関数
  • BreakApart(vector PartLocation, bool bIsVisible) - スプリングの破壊が決定されたときに、このイベントがトリガーされます。
    • PartLocation - 部品のワールド位置です。
    • bIsVisible - この部品が表示される状態を継続する場合は true です。
  • BreakApartOnDeath(vector PartLocation, bool bIsVisible) - デス時にスプリングが破壊されたときに、このイベントがトリガーされます。
    • PartLocation - 部品のワールド位置です。
    • bIsVisible - この部品が表示される状態を継続する場合は true です。
  • RestorePart() - 部品が回復 (heal) されたときに、このイベントがトリガーされます。

UDKSkelControl_DamageHinge / UTSkelControl_DamageHinge


このコントローラは、UDKSkelControl_DamageHinge / UTSkelControl_DamageHinge を拡張したものです。ヒンジでつながっているビークルの部品 (例 : ボンネット、ドア) の破損をシミュレートするために使用します。

UDKSkelControl_Damage.jpg

以下は、「Unreal」エディタ内にエクスポーズされる変数です。
  • Max Angle - ヒンジが開くことができる最大角度です。(単位 : 度)。
  • Pivot Axis - ヒンジが開くときの中心となる軸です。
  • AV Modifier (角速度のための乗数) - ヒンジの角度を計算するために使用される角速度が、この値と掛け合わされます。常に負の値にする必要があります。

UDKSkelControl_DamageSpring / UTSkelControl_DamageSpring


このコントローラは、UDKSkelControl_DamageHinge / UTSkelControl_DamageHinge を拡張したものです。ビークルのフェンダーやバンパーなどへの破損をシミュレートするために使用します。

UDKSkelControl_Damage.jpg

以下は、「Unreal」エディタ内にエクスポーズされる変数です。
  • Max Angle - スプリングが開くことができる最大角度です。(単位 : 度)。
  • Min Angle - スプリングが開くことができる最小角度です。(単位 : 度)。
  • Falloff - スプリングがノーマルの状態に復帰する速さです。
  • Spring Stiffness - スプリングの剛性です。
  • AV Modifier (角速度のための乗数) - ヒンジの角度を計算するために使用される角速度が、この値と掛け合わされます。常に負の値にする必要があります。

UDKSkelControl_HoverboardSuspension / UTSkelControl_HoverboardSuspension


このコントローラは、「Unreal Tournament 3」のホーバーボードによって使用されます。動きに合わせてホーバーボードの下側部分を動かすためのものです。

UDKSkelControl_Hoverboard.jpg

プロパティ
  • Trans Ignore - 無視する垂直方向の平行移動の大きさです。
  • Trans Scale - 垂直方向の平行移動をスケーリングします。
  • Trans Offset - 垂直方向の平行移動オフセットする量です。
  • Max Trans - 適用できる垂直方向の最大平行移動です。
  • Min Trans - 適用できる垂直方向の最小平行移動です。
  • Rot Scale - Y 軸上で適用される回転のスケールです。回転は、ホーバーボードの下側部分についているサスペンションをシミュレートするために使用されます。
  • Max Rot - Y 軸上で利用できる最大の回転です。
  • Max Rot Rate - 1 秒につき適用される回転の最大速度です。

UDKSkelControl_HoverboardSwing / UTSkelControl_HoverboardSwing


このコントローラは、「Unreal Tournament 3」のホーバーボードによって使用されます。動きに合わせてホーバーボードの下側部分を動かすためのものです。

UDKSkelControl_Hoverboard.jpg

プロパティ
  • Swing History Window - スイング履歴 (swing history) ウインドウのサイズをセットします。
  • Swing Scale - スイングのスケールです。
  • Max Swing - 両方向におけるスイングの最大サイズです。合成されたスイングを評価するために使用します。
  • Max Use Vel - 両方向におけるベロシティ (速度) の最大サイズです。合成されたスイングを評価するために使用します。

UDKSkelControl_HoverboardVibration / UTSkelControl_HoverboardVibration


このコントローラは、「Unreal Engine 3」のホーバーボードによって使用されます。振動 (vaibration) をシミュレートするために使用されます。

UDKSkelControl_Hoverboard.jpg

プロパティ
  • Vib Frequency - 振動をシミュレートするために使用される振動数です。
  • Vib Speed Amp Scale - リニアベロシティ (線速度) に基づいて振動を増幅するために使用されます。
  • Vib Turn Amp Scale - アンギュラーベロシティ (角速度) に基づいて振動を増幅するために使用されます。
  • Vib Max Amplitude - 振動を最大振幅に制限するために使用されます。

UDKSkelControl_HugGround / UTSkelControl_HugGround


このコントローラは、制約範囲において、グラウンドからの一定距離内にボーンを保とうとします。そのためには、ラインチェックを下方にキャストして、ワールドのヒット位置を求めます。さらに、ボーンを平行移動させることによって、常にグラウンドに物が接しているように見せることができます。

UDKSkelControl_HugGround.jpg

プロパティ
  • Desired Ground Dist - ボーンからグラウンドまでの望ましい距離を指定します。
  • Max Dist - ボーンがノーマルの位置から動くことができる最大距離です。
  • Parent Bone (親ボーン) - コントロールされるボーンが常に親のボーンに向かって回転する際の、その親ボーンの名前です。(オプション)。
  • Opposite From Parent - true の場合は、親ボーンと同じ方向ではなく、反対の方向にボーンを回転させます。
  • XY Dist From Parent Bone (親ボーンからの XY 距離) - ParentBone が指定されている場合で、なおかつ、この値がゼロよりも大きい場合、コントロールされるボーンを、正確にこの数のユニット分だけ、親ボーンから離しておきます。
  • Z Dist From Parent Bone (親ボーンからの Z 距離) - ParentBone が指定されている場合で、なおかつ、この値がゼロよりも大きい場合、コントロールされるボーンを、正確にこの数のユニット分だけ、親ボーンから離しておきます。
  • Max Translation Per Sec - BoneTranslation (ボーンの平行移動) が毎秒変化する最大量です。

UDKSkelControl_PropellerBlade


このコントローラは、「Unreal Engine 3」のビークル (乗り物) システムとともに使用されます。このコントローラを使用できるのは、UDKVehicle を拡張したビークルに限ります。ビークルが運転されている間、プロペラの羽根がスピンしている様子をシミュレートします。このエフェクトは、ボーンが有する回転のヨー値にのみ適用されます。

UDKSkelControl_PropellerBlade.jpg

プロパティ
  • Max Rotations Per Second - プロペラがスピンできる最大回転速度を定義します。
  • Spin Up Time - 最大速度までスピンするのに要する時間です。
  • Counter Clockwise - true の場合は、プロペラの羽根が反時計回りになります。

UDKSkelControl_Rotate / UTSkelControl_Rotate


このコントローラによって、望ましいボーンの回転 (rotation) を定義することができます。また、回転速度も定義することができます。この回転速度は、ボーンが望ましい回転を目指して回転する際に、ボーンの取るべき回転速度を制御するものです。これによって、望ましいボーンの回転を容易に定義することができるため、UnrealScript でボーンをアニメートすることが簡素化されます。

UDKSkelControl_Rotate.jpg

プロパティ
  • Desired Bone Rotation - ボーンが回転する際に向かうべき望ましいボーンの回転を指定します。
  • Desired Bone Rotation Rate - ボーンを回転させる際に適用すべき回転速度を指定します。

UDKSkelControl_SpinControl / UTSkelControl_SpinControl


このコントローラは、ボーン上で一定の回転を適用します。

UDKSkelControl_SpinControl.jpg

プロパティ
  • Degrees Per Second - 1 秒につき、ボーンを回転させる角度を定義します。
  • Axis - 軸の値すべてがゼロの場合、コントローラは何もしません。軸が正規化されるため、ボーンは、Degrees Per Second (1 秒当たりの角度) を超えた回転はしません。
    • X - X 軸上でボーンを回転させます。負の値を使用することによって、反時計回りに回転させることができます。
    • Y - Y 軸上でボーンを回転させます。負の値を使用することによって、反時計回りに回転させることができます。
    • Z - Z 軸上でボーンを回転させます。負の値を使用することによって、反時計回りに回転させることができます。

UDKSkelControl_TurretConstrained / UTSkelControl_TurretConstrained


このコントローラは、「Unreal Engine 3」のビークルシステムとともに使用され、接続されているボーンを、Desired Bone Rotation (望ましいボーンの回転) で指定された回転に向かわせます。砲塔 (turret) の動きを制約する多くのオプションが付け加えられて拡張されています。

UDKSkelControl_TurretConstrained.jpg

プロパティ
  • Constrain Pitch - true の場合は、ピッチがコンストレイン (制約) されます。
  • Constrain Yaw - true の場合は、ヨーがコンストレイン (制約) されます。
  • Constrain Roll - true の場合は、ロールがコンストレイン (制約) されます。
  • Invert Pitch - true の場合は、ピッチが反転されます。
  • Invert Yaw - true の場合は、ヨーが反転されます。
  • Invert Roll - true の場合は、ロールが反転されます。
  • Max Angle - 最大角度です。(単位 : 度)。
    • Pitch Constraint - ピッチの最大コンストレイント (制約) です。
    • Yaw Constraint - ヨーの最大コンストレイント (制約) です。
    • Roll Constraint - ロールの最大コンストレイント (制約) です。
  • Min Angle - 最小角度です。(単位 : 度)。
    • Pitch Constraint - ピッチの最小コンストレイント (制約) です。
    • Yaw Constraint - ヨーの最小コンストレイント (制約) です。
    • Roll Constraint - ロールの最小コンストレイント (制約) です。
  • Steps - データをコンストレインするさまざまな段階を各砲塔にもたせることができます。
    • StepStartAngle - 現在の角度 (単位 : 度) がこの値と等しいか、この値よりも大きい場合に、当該のステップが有効になります。
    • StepEndAngle - 現在の角度 (単位 : 度) がこの値と等しいか、この値よりも小さい場合に、当該のステップが有効になります。
    • MaxAngle - 最大角度を指定します。(単位 : 度)。
      • Pitch Constraint - ピッチの最大コンストレイント (制約) です。
      • Yaw Constraint - ヨーの最大コンストレイント (制約) です。
      • Roll Constraint - ロールの最大コンストレイント (制約) です。
    • MinAngle - 最小角度を指定します。(単位 : 度)。
      • Pitch Constraint - ピッチの最小コンストレイント (制約) です。
      • Yaw Constraint - ヨーの最小コンストレイントです。
      • Roll Constraint - ロールの最小コンストレイントです。
  • Lag Degrees Per Second - 回転を望ましい回転に更新する際に、砲塔がどのくらいの遅れをとるのかを指定します。(単位 : 秒)。
  • Pitch Speed Scale - ピッチの速度を変更します。
  • Desired Bone Rotation - ボーンが回転して向かうべき望ましい回転を指定します。
  • Fixed When Firing - true の場合は、関連する座席が現在発砲中であれば、砲塔が更新しません。
  • Associated Seat Index - このコントロールが関連する座席のインデックスです。
  • Reset When Unattended - true の場合は、プレイヤーによって砲塔がコントロールされていなければ、砲塔が 0、0、0 にリセットされます。

UnrealScript の関数
  • OnTurretStatusChange(bool bIsMoving) - 砲塔のステータスが変更する場合に呼び出されるデリゲートです。
    • bIsMoving - 砲塔が動いている場合は true です。
  • InitTurret(Rotator InitRot, SkeletalMeshComponent SkelComp) - 砲塔を初期化して、現在の方向を、砲塔が指し示すべき方向とします。
    • InitRot - 初期化して
    • SkelComp - コントローラがアタッチされる骨格メッシュコンポーネントです。
  • WouldConstrainPitch(int TestPitch, SkeletalMeshComponent SkelComp) - 指定されたピッチがコントローラによって制約されている場合は true を返します。
    • TestPitch - テストすべきピッチです。(単位 : Unreal ローテータ単位)。
    • SkelComp - コントローラがアタッチされる骨格メッシュコンポーネントです。

UDKSkelControl_VehicleFlap


このコントローラは、「Unreal Engine 3」のビークルシステムを使用して、フラップのためのアニメーションを実現します。フラップは、ビークルの垂直ベロシティ (速度) に基づいてアニメートされます。これは、「Unreal Tournament 3」の Manta ビークルに使用されています。Manta がジャンプする際に後部フラップがアニメートされます。

UDKSkelControl_VehicleFlaps.jpg

プロパティ
  • Max Pitch - ボーンに適用することができる、両方向におけるピッチの最大変化です。

UTSkelControl_CicadaEngine


このコントローラは、「Unreal Tournament 3」の Cicada ビークルによって使用されています。エンジンを動かして、ビークルの飛び方をシミュレートします。コントローラは、ビークルのベロシティ (速度) を使用して、ボーンの望ましいピッチを計算します。

UTSkelControl_CicadaEngine.jpg

プロパティ
  • Forward Pitch - エンジンがピッチできる最大量を保持します。
  • Back Pitch - エンジンがピッチできる最小量を保持します。
  • Pitch Rate - ボーンがピッチを変化させる速度を保持します。
  • Max Velocity - 最大ベロシティです。
  • Min Velocity - 最小ベロシティです。
  • Max Velocity Pitch Rate Multiplier (最大ベロシティ ピッチ速度乗数) - ピッチの移動速度を計算するために使用される、ピッチの速度のためのモディファイアです。

UTSkelControl_JetThruster


このコントローラは、ビークルのオーナーである場合に、推力に基づいてコントロールの強さを更新します。このコントローラを使用するには、アクタが UDKVehicle をサブクラス化する必要があります。これが役立つのは、たとえば、ビークルの推力に基づいて、ボーンを自動的にスケーリングする場合です。

UTSkelControl_JetThruster.jpg

プロパティ
  • Max Forward Velocity - 最大前進ベロシティ (速度) を保持します。
  • Blend Rate - 望ましいコントロールの強さをブレンドする速度です。

UTSkelControl_MantaBlade


このコントローラは、 UDKSkelControl_PropellerBlade を拡張したものであり、新しく加わったものはありません。

UTSkelControl_MantaFlaps


このコントローラは、 UDKSkelControl_VehicleFlap を拡張したものであり、新しく加わったものはありません。

UTSkelControl_Oscillate


このコントローラは、ボーンの平行移動を一定のペースで前後に動かします。平行移動のための最大量および最小量は、MaxDelta という名の単一の値として定義されます。最小量は、この値にマイナスをつけた値 (負の値) になります。

UTSkelOscillate.jpg

プロパティ
  • Max Delta (最大差分) - ボーンを動かす最大量です。
  • Period - 始点 (差分なし) から MaxDelta まで達するのに要する時間の長さです。
  • Current Time - オシレーション (振幅) の現在の時間です。ただし、通常、この値を「Unreal」エディタで調整する必要はありません。

未分類事項

SkelControl_CCDIK


CCD (Cyclic Coordinate Descent : 巡回座標降下) という別のタイプの IK (インバース キネマティクス) です。基本的には、力ずくの方法であり、ボーンの数がどれほどあっても扱うことができます。具体的には、ボーン 1 つ 1 つをゆっくりと目標に到達するまで調整していきます。アルゴリズムの性質上、ボーンのチェーンが長い場合は、かなり低速になる可能性があります。通常、ボーンのチェーンがタコ足のような形状をしている場合に適します。

SkelControlCCD.jpg

プロパティ
  • Num Bones - 対象となるボーンの数です。
  • Max Per Bone Iterations (ボーン 1 個当たりの最大イテレーション) - パフォーマンスを制御するためのものです。ボーン 1 個につき許容される反復計算の回数を指定します。
  • Precision - 目標に到達したとみなされる距離 (単位 : Unreal 単位) を指定します。当然のことながら、誤差をある程度許容できる場合は、このノードのパフォーマンスに対してプラスとなります。
  • Start From Tail - チェーンの前から開始するか、後から開始するかを指定します。ビジュアル的に異なる結果がもたらされます。
  • Angle Constraint (角度のコンストレイント) - ラジアン角の配列です。各ボーンに許容される最大角度を指定します。
  • Max Angle Steps - 各ステップに許容される最大回転角です。ボーンチェーンに沿って一様に小さな回転ステップを強制するため、ラッピング効果を防ぐことができます。

UnrealScript で使用する方法
次の例では、キャラクターの腕にアタッチされているチェーンが、プレイヤーのポーンによって表現されているあなたを指し示そうとします。

SkelControlCCDIKPawn.uc
class SkelControlCCDIKPawn extends Pawn
  Placeable;

var() Name LeftSkelControlCCDIKName;
var() Name RightSkelControlCCDIKName;
var SkelControl_CCD_IK LeftSkelControlCCDIK;
var SkelControl_CCD_IK RightSkelControlCCDIK;

simulated event PostInitAnimTree(SkeletalMeshComponent SkelComp)
{
  Super.PostInitAnimTree(SkelComp);

  if (SkelComp == Mesh)
  {
    LeftSkelControlCCDIK = SkelControl_CCD_IK(Mesh.FindSkelControl(LeftSkelControlCCDIKName));
    RightSkelControlCCDIK = SkelControl_CCD_IK(Mesh.FindSkelControl(RightSkelControlCCDIKName));
  }
}

simulated event Destroyed()
{
  Super.Destroyed();

  LeftSkelControlCCDIK = None;
  RightSkelControlCCDIK = None;
}

simulated event Tick(float DeltaTime)
{
  local PlayerController PlayerController;

  Super.Tick(DeltaTime);

  if (LeftSkelControlCCDIK != None && RightSkelControlCCDIK != None)
  {
    PlayerController = GetALocalPlayerController();
    if (PlayerController != None && PlayerController.Pawn != None)
    {
      LeftSkelControlCCDIK.EffectorLocation = PlayerController.Pawn.Location;
      RightSkelControlCCDIK.EffectorLocation = PlayerController.Pawn.Location;
    }
  }
}

defaultproperties
{
  Begin Object Class=SkeletalMeshComponent Name=PawnMesh
  End Object
  Mesh=PawnMesh
  Components.Add(PawnMesh)

  Physics=PHYS_Falling

  Begin Object Name=CollisionCylinder
    CollisionRadius=+0030.0000
    CollisionHeight=+0072.000000
  End Object
}

SkelControlLookAt


ボーンの回転を調整することによって、ボーンを特定のターゲットに向かせるようにするためのコントローラです。これを使用して、たとえば、キャラクターの頭部を特定のターゲットに向かせることができます。次のスクリーンショットでは、頭部が青色のダイアモンドの方を向いています。緑色のコーンによって、頭部が動くことができる最大範囲が示されています。

SkelControlLookAt.jpg

プロパティ
  • Target Location - ボーンが向くべき、空間内の位置です。
  • Target Location Space - Target Location が定義される空間を指定します。
  • Target Space Bone Name - Target Location Space が、BCS_OtherBoneSpace である場合、このプロパティの値が、ボーンの名前として使用されます。
  • Look At Axis - コントロールされるボーンがターゲットに向かなければならない場合に使用する軸です。
  • Invert Look At Axis - Look At Axis に対して、ターゲットに向くのではなく、ターゲットから向きをそらすように指示します。
  • Define Up Axis - false の場合は、 Look At Axis をターゲットに向かせるのに必要となる最小の回転をコントロールが見つけます。その軸を中心とする回転は、依然として、アニメーションに由来することになります。true の場合は、ボーンのための垂直軸も定義されます。そのため、ボーンの向きは、コントローラによって完全に定義されます。
  • Up Axis - Define Up Axis が true の場合は、このプロパティの値が、ワールド空間で上に向いていなければならないボーンの軸となります。
  • Invert Up Axis - Up Axis が上ではなく下を向かなければならない場合に使用します。
  • Enable Limit - ボーンがターゲットを追って回転することができる最大角度を制限する場合のときに使用します。
  • Show Limit - コントロールが選択された際に、3D ビューポート内で緑色の制限コーンを描画すべき場合に使用します。
  • Max Angle - ボーンが参照ポーズから離れて回転することが許される最大角度 (単位 : 度) を指定します。
  • Dead Zone Angle - ターゲットが現在の回転の死角に入っている場合に、更新が行われません。ボーンが回転するのは、ターゲットが死角から出ていった場合に限ります。

TargetLocationSpace を BCS_OtherBoneSpace にセットすることによって、キャラクターが常に (たとえば) 自分の手を見るように設定することができます。

UnrealScript で使用する方法
以下の例では、ポーンが、あなた (正確には、あなたがコントロールするポーン) を見ます。あなたがこのビュー範囲から出ると、このポーンは、元に戻ってブレンドされることによって、前方を向くようになります。

SkelControlLookAt.jpg

SkelControlLookAtPawn.uc
class SkelControlLookAtPawn extends Pawn;

var() Name SkelControlLookAtName;
var() float EyeOffset;
var SkelControlLookAt SkelControlLookAt;

simulated event PostInitAnimTree(SkeletalMeshComponent SkelComp)
{
  Super.PostInitAnimTree(SkelComp);

  if (SkelComp == Mesh)
  {
    SkelControlLookAt = SkelControlLookAt(Mesh.FindSkelControl(SkelControlLookAtName));
  }
}

simulated event Destroyed()
{
  Super.Destroyed();

  SkelControlLookAt = None;
}

simulated event Tick(float DeltaTime)
{
  local PlayerController PlayerController;

  Super.Tick(DeltaTime);

  if (SkelControlLookAt != None)
  {
    PlayerController = GetALocalPlayerController();

    if (PlayerController != None && PlayerController.Pawn != None)
    {
      SkelControlLookAt.TargetLocation = PlayerController.Pawn.Location + (Vect(0.f, 0.f, 1.f) * EyeOffset);
    }
  }
}

defaultproperties
{
  Begin Object Class=SkeletalMeshComponent Name=PawnMesh
  End Object
  Mesh=PawnMesh
  Components.Add(PawnMesh)

  Physics=PHYS_Falling

  Begin Object Name=CollisionCylinder
    CollisionRadius=+0030.0000
    CollisionHeight=+0072.000000
  End Object
}

SkelControlSpline


このスプライン コントローラは、ボーン自体を変更しませんが、ボーンより上に位置するボーンのチェーンをスプラインに当てはめます。次の例では、通常の SkelControlSingleBone を使用して、チェーンの終端を上に持ち上げています。その際、このボーンよりも上に位置する 4 つのボーンを変更するように SkelControlSpline がセットされ、チェーンの始点と終点の間にスプラインが形成されます。 なお、このコントロールによって、ボーンの長さは維持されません。

SkelControlSpline.jpg

プロパティ
  • Spline Length - 階層を上にあがり、スプラインにフィットさせるために変更するボーンの数です。
  • Spline Bone Axis - スプラインに沿った向きをとらせるボーンの軸です。
  • Invert Spline Bone Axis - Spline Bone Axis を反転しなければならない場合に使用します。
  • End Spline Tension - スプラインの端 (コントロールされているボーンに近い方の端) のカーブを制御します。
  • Start Spline Tension - スプラインの始点のカーブを制御します。
  • Bone Rot Mode - スプラインの全長に沿ってあるボーンをどのように回転させるかを制御します。以下は詳細な情報です。

BoneRotMode の設定を使用すると、このコントローラによって、スプラインに沿ったボーンをどのように回転させるかを制御することができます。

  • SCR_NoChange - ボーンの回転が変更されません。単にスプライン上に位置するように平行移動します。
  • SCR_AlongSpline - ボーンが回転して、SplineBoneAxis がスプラインに沿った方向に向きます。
  • SCR_Interpolate - 連続する各ボーンの回転が、チェーンの両端にあるボーンの回転におけるブレンドとなります。

SCR_Interpolate の設定を使用するこのコントロールは、背中の最上部に位置するボーンの回転を制御することによって、背骨のその他のボーンに沿った回転をスムーズなものにすることができるため便利です。

SkelControlTrail


トレイルコントローラは、ボーンのチェーンを変更することによって、それが先頭のボーンの後でたなびいて見えるようにします。(ボーンのチェーンは、制御されるボーンから Chain Length の値の分だけ離れているボーンとして指定されます)。このコントローラが役立つのは、アニメーションデータにしたがってアニメートするボーンにアタッチされたもの (例 : リボン、旗、チェーン) を扱う場合です。このエフェクトは、 物理アニメーション を使用して作成することも可能です。ただし、このコントローラを利用するほうが、より詳細な制御が可能となります。

SkelControlTrail.jpg

プロパティ
  • Chain Length - 階層内でコントロールされるボーンよりも上に位置する、変更すべきボーンの数を指定します。
  • Chain Bone Axis - トレイルの方向を決めるボーンの軸です。
  • Invert Chain Bone Axis - Chain Bone Axis で指定された方向を反転します。
  • Limit Stretch - 参照ポーズの長さ以上にボーンが伸びることができる量を制限します。
  • Actor Space Fake Vel - フェイクのベロシティ (速度) をアクタ内に適用するのか、ワールド空間に適用するのかを指定します。
  • Trail Relaxation - ボーンがどのくらい速くアニメートされた位置に落ち着くかを指定します。
  • Stretch Limit - Limit Stretch が有効な場合、参照ポーズにおいてボーンがその長さをどのくらいの間超えていられるかを指定します。
  • Fake Velocity - ボーンに適用するフェイクのベロシティ (速度) です。

次の例では、トレイルが有するフェイクの Z ベロシティ (速度) が、2 秒ごとに上下間でブレンドされます。

SkelControlTrailPawn.uc
class SkelControlTrailPawn extends Pawn
  Placeable;

var() Name SkelControlTrailLeftName;
var() Name SkelControlTrailRightName;
var() float SinkVelocityZ;
var() float FloatVelocityZ;

var SkelControlTrail SkelControlTrailLeft;
var SkelControlTrail SkelControlTrailRight;

simulated event PostInitAnimTree(SkeletalMeshComponent SkelComp)
{
  Super.PostInitAnimTree(SkelComp);

  if (SkelComp == Mesh)
  {
    SkelControlTrailLeft = SkelControlTrail(Mesh.FindSkelControl(SkelControlTrailLeftName));
    SkelControlTrailRight = SkelControlTrail(Mesh.FindSkelControl(SkelControlTrailRightName));
  }

  SetTimer(2.f, false, NameOf(SinkTrail));
}

simulated event Destroyed()
{
  Super.Destroyed();

  SkelControlTrailLeft = None;
  SkelControlTrailRight = None;
}

simulated event Tick(float DeltaTime)
{
  Super.Tick(DeltaTime);

  if (SkelControlTrailLeft != None && SkelControlTrailRight != None)
  {
    if (IsTimerActive(NameOf(FloatTrail)))
    {
      SkelControlTrailLeft.FakeVelocity.Z = Lerp(FloatVelocityZ, SinkVelocityZ, GetTimerCount(NameOf(FloatTrail)) / GetTimerRate(NameOf(FloatTrail)));
      SkelControlTrailRight.FakeVelocity.Z = Lerp(FloatVelocityZ, SinkVelocityZ, GetTimerCount(NameOf(FloatTrail)) / GetTimerRate(NameOf(FloatTrail)));
    }
    else if (IsTimerActive(NameOf(SinkTrail)))
    {
      SkelControlTrailLeft.FakeVelocity.Z = Lerp(SinkVelocityZ, FloatVelocityZ, GetTimerCount(NameOf(SinkTrail)) / GetTimerRate(NameOf(SinkTrail)));
      SkelControlTrailRight.FakeVelocity.Z = Lerp(SinkVelocityZ, FloatVelocityZ, GetTimerCount(NameOf(SinkTrail)) / GetTimerRate(NameOf(SinkTrail)));
    }
  }
}

simulated function FloatTrail()
{
  if (SkelControlTrailLeft != None && SkelControlTrailRight != None)
  {
    SkelControlTrailLeft.FakeVelocity.Z = FloatVelocityZ;
    SkelControlTrailRight.FakeVelocity.Z = FloatVelocityZ;
  }

  SetTimer(2.f, false, NameOf(SinkTrail));
}

simulated function SinkTrail()
{
  if (SkelControlTrailLeft != None && SkelControlTrailRight != None)
  {
    SkelControlTrailLeft.FakeVelocity.Z = SinkVelocityZ;
    SkelControlTrailRight.FakeVelocity.Z = SinkVelocityZ;
  }

  SetTimer(2.f, false, NameOf(FloatTrail));
}

defaultproperties
{
  Begin Object Class=SkeletalMeshComponent Name=PawnMesh
  End Object
  Mesh=PawnMesh
  Components.Add(PawnMesh)

  Physics=PHYS_Falling

  Begin Object Name=CollisionCylinder
    CollisionRadius=+0030.0000
    CollisionHeight=+0072.000000
  End Object
}

UDKSkelControl_CantileverBeam / UTSkelControl_CantileverBeam


このコントローラは、片持ち梁 (一端が固定され、他端が自由な構造物) をシミュレートするスプリングを作成します。「Unreal Tournament 3」では、Goliath タンクの上につける弾力のあるアンテナを作成するために使用されました。

UDKSkelControl_CantileverBeam.jpg

プロパティ
  • Initial World Space Goal Offset (初期ワールド空間目標のオフセット) - (ローカルのボーン空間における) World Space Goal (ワールド空間の目標) の開始位置を得るために、最初のボーンから進むべき地点です。
  • Spring Stiffness - スプリングシミュレーション上で適用する剛性を定義します。
  • Spring Damping - スプリングシミュレーション上で適用する減衰を定義します。
  • Percent Beam Velocity Transfer - 片持ち梁の先端が、ベースのベロシティ (速度) の何%で動くかを指定します。

UnrealScript の関数
  • EntireBeamVelocity() - 片持ち梁全体が移動する速度を返します。(タンクなどを扱うためのデリゲートです。そのような場合は、砲塔の動きよりもタンク全体の動きによる影響度を下げる必要があります)。

UDKSkelControl_LockRotation / UTSkelControl_LockRotation


このコントローラは、ボーンの回転に含まれる 1 個以上の成分を、指定された値に固定します。コントローラのエフェクトは、AnimTree エディタのプレビューウインドウで表示されません。

UDKSkelControl_LockRotation.jpg

プロパティ
  • Lock Pitch - ボーンの回転に影響を与えるために、ボーンの回転に含まれるピッチ成分を固定します。
  • Lock Yaw - ボーンの回転に影響を与えるために、ボーンの回転に含まれるヨー成分を固定します。
  • Lock Roll - ボーンの回転に影響を与えるために、ボーンの回転に含まれるロール成分を固定します。
  • Lock Rotation - このプロパティの値に回転を固定します。
  • Max Delta - Lock Rotation に達するために、元の回転を変更できる最大量です。
  • Lock Rotation Space - 回転が行われる空間です。
  • Rotation Space Bone Name - LockRotationSpace が BCS_OtherBoneSpace である場合に、使用されるボーン名です。

UDKSkelControl_LookAt / UTSkelControl_LookAt


このコントローラは、単一のボーンを回転させて、望ましいターゲットの位置に向かせます。SkelControlLookAt を拡張することによって、軸ごとに回転の制限を加えるとともに、望ましいターゲットの位置まで自動的に補間できるようになっています。

UDKSkelControl_LookAt.jpg

プロパティ
  • Limit Yaw - true の場合は、ヨーの軸に制限を加えます。それ以外の場合は、制限が無視されます。
  • Limit Pitch - true の場合は、ピッチの軸に制限を加えます。それ以外の場合は、制限が無視されます。
  • Limit Roll - true の場合は、ロールの軸に制限を加えます。それ以外の場合は、制限が無視されます。
  • Yaw Limit - ヨーの軸のために使用する角度の制限です。(単位 : 度)。
  • Pitch Limit - ピッチの軸のために使用する角度の制限です。(単位 : 度)。
  • Roll Limit - ロールの軸のために使用する角度の制限です。(単位 : 度)。
  • Show Per Axis Limits - true の場合は、軸ごとの制限を表すコーンを描画します。

UDKSkelControl_MassBoneScaling / UTSkelControl_MassBoneScaling


このコントローラを使用すると、骨格メッシュに含まれる多数のボーンのためにスケーリングを整然と効率的に実行することができます。

UDKSkelControl_MassBoneScaling.jpg

プロパティ
  • Bone Scales - 骨格メッシュに含まれるボーンのためのスケールです。この配列のインデックスは、骨格メッシュのインデックスと一致します。ボーンのインデックスを調べるには、当該の骨格メッシュのための AnimSet エディタを開いて探します。ボーンのインデックスは、ボーン名のとなりにある数字で示されています。
    UDKSkelControl_MassBoneScaling_BoneIndices.jpg

UnrealScript の関数
  • SetBoneScale(name BoneName, float Scale) - 名前を使用してボーンのスケールをセットします。このコントローラは、AnimTree 内で指定されたボーンと接続することによって、効力をもつようにする必要があります。
    • Bone Name - 影響を与えるボーンの名前です。
    • Scale - 影響を与えるボーンのスケールです。
  • GetBoneScale(name BoneName) - 指定されたボーンのために、コントローラがもっているスケールを返します。ボーンのスケールに影響を及ぼす他のコントローラについては、考慮しません。
    • Bone Name - ボーンにスケールを返すために使用するボーンの名前です。

ダウンロード


  • このドキュメントで使用されているコンテンツは、 ここから ダウンロードできます。