Implementation

From Valve Developer Community
< Ja
Jump to navigation Jump to search
English (en)日本語 (ja)Translate (Translate)

振り付けシーンの実装

Introduction

これは振り付けを行ったシーンをどのようにSource Engineに取り込むかという実際的なテクニックを紹介するためのページです。ここでの焦点はvcdファイルとその効果的な使用方法です。しかし、関連したテクニックがfaceposerにとどまらず、ハンマーやXSIといった外部にも広がることもしばしばあります。

振り付けシーンの基本要素になれるためにまずするべきことは、SDKに含まれているサンプルマップを実行してみることです:"...\SteamApps\<your username>\sourcesdk_content\hl2\mapsrc\sdk_faceposer.vmf" このマップはHL2の製作中にチュートリアルとして作られたものです。

ハンマー(en)からマップをコンパイルし、Hl2に読み込みます。このマップで使用されている全てのVCDは以下の場所にあります: "...\SteamApps\<your username>\half-life 2\hl2\scenes\ChoreoExamples" 可能であればマップを遊びながら、これらのVCDをFacePoserで見てみることをすすめます。もしHL2が起動している間にVCDを編集するなら、コンソールでscene_flushを入力し、それからマップを再スタートすると変更したVCDを見ることができます。

(以下はアウトラインの提案です。肉付けしているうちに変更していきます。)

なぜVCDを使うのか?

  • 強力。VCDは広い範囲の要素を一緒に、そして精密に振付けることができます -- 音、特殊効果、アクターへの指示(ブロッキング)、アニメーション、そしてシーン・マップのロジックなど
  • 早い繰り返しテスト。 VCDの変更を見るのにマップを再コンパイルする必要はありません。Scene_Flushを使います。特にイベントのタイミングを調整するのに適切です。

Source EngineでのVCDの再生方法

シーンへのアプローチと計画

  • どの要素が関わっているのか?
  • どのアクターが関わっているのか?
  • プレイヤーはどのように関わるか?
  • どのようにシーンがマップロジックに組み込まれるか?
    • シーンが始まる条件
    • シーンの一時停止・再開、インタラプトを行う条件
    • できるだけ多くをVCDから駆動することの効用
      • 極めて重要なFire Trigger(トリガー発射)イベント

Blocking out a scene

  • Info_targetエンティティ
  • DebugTextの使用
  • 新しいダイアログエントリーの追加
  • シーンロジック機能の導入

!Target#の使用

"#"の部分に1-8までの数字が入った"!Target#"という名前("!Target1", "!Target2",..."!Target8")はFaceposer内での特別な一時的な名前になっています。VCD内で"!Target#"の名前を使っていると、エンティティLogic_choreographed_scene(en)のプロパティからその名前が実際に指すエンティティを指定できます。この柔軟な名前を使った方法は、様々な場所で使われるが、アクターとイベントターゲットの名前は毎回違うようなVCDにおいて役立ちます。

"!Target#"の名前はアクターにもイベントターゲットにも使うことができます。(Figs 2a , 2b)

Fig. 2a - Faceposerで"!Target1"と名前がついたアクター(クリックして拡大)
Fig. 2b - FaceposerでMove Toの対象を"!Target2"として指定(クリックして拡大)

"!Target#"名前がどのエンティティを指すかはマップ内のLogic_choreographed_sceneエンティティのプロパティで指定します。(Fig 2c)

注意 Logic_Choreographed_SceneのプロパティにはTargetキーバリューが8つあり、それぞれが"!Target#"("!Target1"..."!Target8")の名前に対応しています。

Fig. 2c - ハンマーで"!Target1"がどのエンティティを指すかを指定。この場合では"!Target1"をNPC_CITIZENエンティティの名前である"Claude"を指す設定にしている(クリックして拡大)


シーンの一時停止/再開

  • Global Pauseイベントの使用
  • 自身を一時停止させるFire Triggerイベントの使用
  • 一時停止したVCDの振る舞い
    • イベントはアクティブなまま(lookAt-対象を見る、faceTo-対象に向く、moveTo-対象に移動するなど)
    • ジェスチャイベントの"ループ"部分を繰り返し
  • Nagの設定

アクターのコントロール

  • NPCエンティティのインプット、Start Scripting(スクリプト開始)
  • NPCエンティティのフラグ、 Use Alternate Collisions
  • 従来にないアクターの使用
    • Generic_actorエンティティ
    • ラジオの例
    • ラマー

シーンでのプレイヤーの関与

  • トリガーの使用、Lookトリガー、AI_Script_Condition
    • Eliの研究所の例

プレイヤーからコントロールを奪う

スクリプトシークエンスを映画的に見せるmachinimaを作成するには、プレイヤーのカメラのコントロールを奪うことが必要になってきます。マップでのカットシーンのためにプレイヤーのカメラのコントロールを奪うにはpoint_viewcontrolエンティティを使い、 path_cornerとpath_trackノードの設定をおこないます。以下がシーンを設定する基本的なステップです(今回、アクタースクリプトとマップが同じ場所にあると家庭しています)

  • シーン内でのカメラ位置と移動の計画
  • point_viewcontrollerをシーンに配置
  • ステップ1での計画に基づき、path_cornersとpath_tracksのネットワークを配置
  • このカメラによるシークエンスがマップ開始とともに始まる場合logic_autoエンティティを配置してその"OnMapSpawn"アウトプットをpoint_viewcontrollerの"Enable"インプットに接続します。そうでない場合は何か別のインプットでpoint_viewcontrollerを"Enable"します。
  • Point_viewcontroller

point_viewcontrollerは使用可能("enable")になるとプレイヤーのカメラコントロールを奪い、マップ内のエンティティの場所にカメラを設定します。

プロパティ

Name: point_viewcontrollerエンティティの名前

EntitytoLookAt: 使用可能な時にカメラを向けるエンティティの名前

TargetAttachment: もし設定すると、カメラは'EntitytoLookAt'で指定したエンティティにある特定のAttachmentに注目します。

Hold: 'Hold'で指定した時間がすぎるとカメラはコントロールを開放します。カメラが無限にコントロールする必要がある(machinima映画など)場合は、Flagタブで'Infinite Hold Time'をチェックしてください。

PathCorner: トラックシークエンスで最初に移動するpath_cornerの名前

フラグ

StartAtPlayer: これがオンだとカメラはプレイヤーの視点から開始し、そうでない場合はpoint_viewcontrollerの視点から開始します。

FollowPlayer:

FreezePlayer:

Infinite Hold Time:

Snap to goal angles:

Make player non-solid:

Interruptable by player:

    • Alyxイントロのサンプル
  • 乗り物
    • Breenシーンサンプル

シーンでのアニメーションの再生

ジェスチャーイベント

ジェスチャーイベントはSource Engineのキャラクタを生き生きとしたものにできるとても強力かつ柔軟な方法です。ジェスチャーイベントは特別の合成ルールをもった特殊なアニメーション種類を使います。これらは一般的にすでにあるシークエンスの上にかぶせるアニメーションです。例えば、鼻をひっかくジェスチャーアニメーションを作成したなら、キャラクタが座っていても、立っていても、歩いていても、走っていても同時にこのジェスチャを再生できます。さらにジェスチャーの強さ、タイミングをFaceposer内で調整することができます。たとえジェスチャーのライブラリが小さくても、それらを常に効果的に使うことができることに気がつくでしょう。

ジェスチャーイベントとして使うことができるアニメーションはPostureMacros.qciとGestureMacros.qciの2つのマクロを使ってモデルに埋め込まれています。現在のところこれらのqciは"...\Steam\SteamApps\<your username>\sourcesdk_content\hl2mp\modelsrc\humans_sdk"にあります。詳細情報のリンクを追加する予定です。

ポーズ(Postures)、ジェスチャー(Gestures)、ボディジェスチャー(BodyGestures)

今まで使ってきた"ジェスチャー"という言葉は広範にわたるものでした。これは特別な合成ルールをもったアニメーション全てを指していました。実際のところ多くの種類が存在し、それらを3つのメインの種類にまとめています: ポーズ(Postures)、ジェスチャー(Gestures)、ボディジェスチャー(BodyGestures)です。

これら3種類は全てFaceposerのジェスチャーイベントで配置されますが、それぞれ以下のような特徴があります。

ポーズ(Postures)

名前が示すように、ポーズはキャラクタの全身をコントロールするのに使われます。キャラクタの全身の体勢をコントロールするのに使用してください。(重心の移動、よりかかる、前かがみ、スクワットなど) ポーズはキャラクタがidle(待機状態)の場合のみ再生されます。キャラクタが移動する(歩く、走るなど)場合は再生されません。

  • ポーズの詳細はここに追加予定です
  • 他の種類のポーズについての情報はここに追加予定です
  • ポーズアニメーションの作成とモデルへのコンパイル方法はhere(en)参照
  • HLMVでポーズを見るには(リンク追加予定)
ジェスチャー(Gestures)

ジェスチャーアニメーションは大部分が腕と上半身に関わるアニメーションです。話しながら手でジェスチャーを行っているキャラクタを想像してみてください。こういう用途のためにジェスチャーがあるのです。ジェスチャーアニメーションはキャラクタの腕、手、指については完全にコントロールしますが、腰、背骨、首、頭のアニメーションは元のものに加算します。そのため、既に再生しているアニメーションの上に追加するものになります。ジェスチャーはキャラクタが何をしているかに関わらずいつでも再生するこができます。

  • ジェスチャーの詳細はここに追加予定です
  • 他の種類のジェスチャーについての情報はここに追加予定です
  • ジェスチャーアニメーションの作成とモデルへのコンパイル方法はここに追加予定です
  • HLMVでジェスチャーを見るには(リンク追加予定)
ボディジェスチャー(BodyGestures)

ボディジェスチャーは一番目立たないもので、アクセントに使われます。これらは全体的に加算させるもので、すでに再生されているアニメーションの腰、背骨、頭、腕、手の動きの上に追加されます。ボディジェスチャーのよくある使用方法は会話にアクセントをつけることです。ボディジェスチャーはキャラクタが何をしているかに関わらずいつでも再生するこができます。

  • ボディジェスチャーの詳細はここに追加予定です
  • ボディジェスチャーアニメーションの作成とモデルへのコンパイル方法はここに追加予定です
  • HLMVでボディジェスチャーを見るには(リンク追加予定)
  • faceposerでの編成
  • XSIでの新しいジェスチャ/ポーズの作成とモデルへの追加
  • Scripted SequenceやActBusyでのジェスチャイベントの再生
  • ジェスチャでのIKルールの使用
    • Barneyの手を腰にポーズ
    • Alyxのボタン押しジェスチャ

図解

Faceposerを起動し、Barney.mdlを読み込みます。それから "...\Steam\SteamApps\<your username>\half-life 2\hl2\scenes\ChoreoExamples\sdk_barney1.vcd"を読み込みます。

クリックして拡大

このVCDはポーズ、ジェスチャ、ボディジェスチャがHL2においてどのように使われているかを示す良い例になっています。チャンネルをダブルクリックすると無効にすることができます、そうするとそれぞれのチャンネルが結果にどう影響しているかをみることができます。

注意: NULLジェスチャイベントを使うことで同じチャンネルのジェスチャイベントの間をあけることができます。

シークエンスイベント (慎重に使用すること)

Flex animationフレックスアニメーション

シーンでのScripted Sequenceの使用

  • アクターの定位置への移動
  • Fire_triggerイベントでScripted Sequenceを開始
  • NULLシークエンスイベントを使ってアニメーションに他のイベント(会話など)の時間あわせ
  • Look At !Selfを使ってAIの頭の動きを抑制
  • Scripted SequencesのOnFrameEventアウトプットを使って他のシーンイベントをトリガー

さらに内容を追加する予定です。