<< TOP



キャ ラクター・メイキング
>> リップシンクの設定

    キャラクター・メイキング編について
       ここで紹介するキャラク ター・メイキング編は、様々な機能を分け隔てせず、
      ”キャラクターの作成に必要だったもの” としてまとめて紹介するかたちに します。
      ですので、シェーディングからリグ、フェイシャルなど、様々な機能の話しが 登場すると思います。
       また、キャラクター自身も進歩していきますので、当初と異なってどんどん と変化していくことも予想されます。

       そんな ←このキャラクターを中心とした、”とりとめもない”事例です が、どうぞ参考にして頂ければと思います。
       このキャラクターのファンになってくれたら もっとうれしい ^_^ ; です。  


 プロローグ
      ここでは前述 フェイシャル・アニメーション(Shape)の設定 を 踏まえた上で
    基本となる 母音+ん 簡単にアニメーションを設定できる カスタムなプロパティー ページを作成してみましょう。



 カスタム プロパティセット ウィザード
     では、独自(カスタム)のプロパティーのウィ ンドーを作成するのですが、便利なウィザードという機能を使いします。
    かなりの部分まではプログラマーさんに頼まなくても自分でページを作成できる、というもので す。

    最初に キャラクターが全て入っているMODELノードを選択した状態から始めます。


     ファイル>プラグインマネージャーか ら、
    ユーザールートのプラグンフォルダー右マウスボタンクリック>新 規作成>プロパティー を選択します。



     すると、こんな作成用のPPGが表示されます。
    ここから色々と作り込んでみましょう。


 カスタム・プロパティーの作成
     パラメータの追加 タブに移り、パラ メータータイプの右下▼から ボタンを選択し、名前/ラベル に 
    Futu、A、I、U、E、O、N を作成します。(残念ながら日本語は記入 しない方が良いです。)



     次に、レイアウト(オプション) タブに移ります。
    右欄(パラメータ) A・ I・ U・ E・ O・ N を各個別に選択して、[追加]ボタンを押すと、
    左欄(レイアウト)に各パラメータが追記されます。

     グループ名 を作成します。下のグループ化 ; 名前欄 に グループ名  を記入し、その右にある [グループの追加] ボタンを押します。 
    Futu ・A・ I・ U・ E・ O・ N が Group  と Row の中括弧内に入るように、
    下部にある [上][下]ボタン を活用して、パラメータの記述位置を修正し ます。



     [プロパティー生成] ボタン にを押すと下図のようなPPGが作成されます。
    この時点では何も起こりませんが、
    ボタンを押せるページ と それのソースであるVBSファイルがスクリプトエディター上に表 示されます。



    ここまでのVBSファイルです。 サンプル >> Emi_AIUEON-VBS.zip

このカスタムなPPGについての考察 =自動認識型プラグイン
     この時点で、新しく作成したPPGは選択した MODELノード以下に オレンジ色の [C] ノードで存在します。
    ダブルクリックすればPPGが開きます。



     作成されたプラグインは、自分のユーザーディレクトリ-下の バージョン名 /Application/Plugin内にVBSファイルとして保存された
    自動インストール型のプラグインになります。
    このPPGを他のユーザーにも使用させたい場合は、このプラグインも配布する必要がある事、 注意してください。



      また、この時点でウィザードのページを閉じていまったとしても(シーンの保存した状態から、読み込みしてみると)
    SDK_Wizardsというモデルノード以下に保存されており、その中の CPSetWizardノードを開くと
    閉じる前の状態の作成途中の設定ページが復帰されます。





     消してしまったり、別のモデルの作成したカス タムPPGを設定したい場合。
    自動認識型プラグインなので、作成したVBSファイルが ユーザーディレクトリ-下の バー ジョン名/Application/Plugin内にあれば
    プラグインマネージャーに自動的に認識されています。
     そうしたら、設定したいModelなどを選択した状態で、
    プラグインマネーシャーを開き、設定したいカスタムプラグインを右マウ ス選択>プロパティーの作成 でオレンジ色のPPGがあわられます。
    ダブルクリックすれば、PPGが開きます。



    ここまでのことを知っていれば、何も恐れるものはあり ませんよ。

 よりグラフィカルなカスタムPPG =シノプティックビューの活用
     今回、リップシンクには上記ボタンのPPGで事足り ます。
    この部分はより複雑になりますので少し高度ですが、カスタムのPPGにグラフィカルなUIを 作成出来ないかのサンプルになります。

      この原型になっ たサンプルは、SDKワークグループ(C:\Softimage\XSI_7.***\XSISDK\examples\workgroup) 内の 
      Addons\PPGDemos\Application \Plugins 内 embeddedsynoptic.vbs から応用したものです。



       上図のような絵とマウスポインターで色が変わるボタン領域の設定は、シノプティック ビューなのです。
      つまり、カスタムPPGの中に HTML形式のシノプティックビューを入れて表示・操作 しています。



 シノプティックビュー = シノプティック・エディターでHTMLを作成
     シノプティックエディターを開きます。 表 示>一般>SynopticEditor です。



     ファイル>ファイルからイメージを読み込む で 画 像を読み込み、絵の領域設定と リンク先、詳細 に記述をします。
    既にシノプティックのHTMLがある場合は、ファイル>開く で既存のものを表示出来ます。



    上図 [スクリプト]と書いてあるボタンを押すと、スクリプトのページになり、Subコマン ドの間に ログメッセージを表示するという仮の記述をしておきます。
    これで、普通 と書かれている領域をマウスでクリックすると、スクリプトエディター上に ' INFO : Tsujyo と表示されます。



     で、出来上がると、こ んなHTML文になりました。  ここまでのサンプル >> Emi_AIUEON-HTML.zip
    <html>
    <body version="2">
    <script language="VBScript">

    sub emi_def(in_obj,in_mousebutton,in_keymodifier)
    logmessage "Tsujyo"
    end sub
    sub emi_a(in_obj,in_mousebutton,in_keymodifier)
    logmessage "Voice A"
    end sub
    sub emi_i(in_obj,in_mousebutton,in_keymodifier)
    logmessage "Voice I"
    end sub
    sub emi_u(in_obj,in_mousebutton,in_keymodifier)
    logmessage "Voice U"
    end sub
    sub emi_e(in_obj,in_mousebutton,in_keymodifier)
    logmessage "Voice E"
    end sub
    sub emi_o(in_obj,in_mousebutton,in_keymodifier)
    logmessage "Voice O"
    end sub
    sub emi_n(in_obj,in_mousebutton,in_keymodifier)
    logmessage "Voice N"
    end sub

    </SCRIPT>

    <map name="SynopticMap">
    <area shape="rect" coords="62,13,134,50" title="def" NOHREF onClick="emi_def">
    <area shape="rect" coords="14,53,45,115" title="A" NOHREF onClick="emi_a">
    <area shape="rect" coords="46,53,73,114" title="I" NOHREF onClick="emi_i">
    <area shape="rect" coords="74,54,103,115" title="U" NOHREF onClick="emi_u">
    <area shape="rect" coords="104,54,134,116" title="E" NOHREF onClick="emi_e">
    <area shape="rect" coords="135,55,161,116" title="O" NOHREF onClick="emi_o">
    <area shape="rect" coords="162,56,191,115" title="N" NOHREF onClick="emi_n">
    </map>

    <img src="Emi_face1.jpg" usemap="#SynopticMap">

    </body>
    </html>

    マウスのカーソルが ボタン領域に来ると色が変わるの は、
    設定画像に _h が付いた画像を用意すると、その絵になる仕組みです。例; Emi_face1.jpg なら Emi_face1_h.jpg という画像を用意します。

 カスタムPPGのVBSに追記しシノプティックを表示させる = Emi_AIUEON Synoptic Plugin
     既に上記ウィザードで作成してある  Emi_AIUEON.vbs に追記し、
    作成したシノプティックビューの画像部分をカスタムPPG内に表示するようにします。

     上記までに作成してあったプラグイン=VBS である Emi_AIUEON.vbs を  Emi_AIUEON_synoptic.vbs としてコピーして使います。
    保存先も同じ所です。

     変わったところは、名前である ”Emi_AIUEON Synoptic Plugin” と 
    シノプティック用のHTMLがある場所(Path) と PPG内で表示される場所のグルー プの中括弧内の記述です。
     シノプティック用のHTMLは、このプラグインと同列の synoptic というディレクトリー内の Emi_AIUEON.htm であると記述しています。

        function ApplyEmi_AIUEON_Synoptic_Execute( target )  内の処理はプロパティをオブジェクトに適用して、ビュー内に表示するための処理です。



    ( Emi_AIUEON.vbs と同じ所はグレー色で す ↓)
    'Example of a custom property containing a synoptic widget
    'This plug-in depends on additional files in the "synoptic" directory

    function XSILoadPlugin( in_reg )
    in_reg.Author = "ritaro"
    in_reg.Name = "Emi_AIUEON Synoptic Plugin"
    in_reg.Major = 1
    in_reg.Minor = 0

    in_reg.RegisterProperty "Emi_AIUEON_Synoptic"

    'RegistrationInsertionPoint - do not remove this line

    XSILoadPlugin = true
    end function

    function XSIUnloadPlugin( in_reg )
    dim strPluginName
    strPluginName = in_reg.Name
    Application.LogMessage strPluginName & " has been unloaded.",siVerbose
    XSIUnloadPlugin = true
    end function

    function Emi_AIUEON_Synoptic_Define( ctxt )
    dim oCustomProperty
    set oCustomProperty = ctxt.Source

    oCustomProperty.AddParameter2 "path",siString,"",,,,,0,siPersistable

    'The "path" parameter associated with the synoptic control
    'specifies the full path of the synoptic html file.
    'To avoid hard-coding an absolute path, we determine the path relative to this script file.

    set oThisPlugin = Application.Plugins( "Emi_AIUEON Synoptic Plugin" )
    oCustomProperty.path.Value = oThisPlugin.OriginPath & ".." & XSIUtils.Slash & _
    "synoptic" & XSIUtils.Slash & "Emi_AIUEON.htm"

    Emi_AIUEON_Synoptic_Define = true
    end function

    function Emi_AIUEON_Synoptic_DefineLayout( ctxt )
    dim oLayout,oItem
    set oLayout = ctxt.Source
    oLayout.Clear

    oLayout.AddGroup " ----- EMI A . I . U . E . O . N ----- "
    oLayout.AddRow
    oLayout.AddButton "Futu"
    oLayout.AddButton "A"
    oLayout.AddButton "I"
    oLayout.AddButton "U"
    oLayout.AddButton "E"
    oLayout.AddButton "O"
    oLayout.AddButton "N"
    oLayout.EndRow

    'Create the synoptic widget, which loads the synoptic view specified by the path parameter

    set oItem = oLayout.AddItem("path", "", siControlSynoptic)
    oItem.setattribute siUINoLabel,true

    oLayout.EndGroup

    Emi_AIUEON_Synoptic_DefineLayout = true
    end function

    function ApplyEmi_AIUEON_Synoptic_Execute( target )

    'Error handling of the input argument
    if target = "" then
    Logmessage "Invalid argument to ApplyEmi_AIUEON_Synoptic", siError
    exit function
    elseif target.Type = "XSICollection" then
    'target may be a collection of items, such as the current selection
    dim oItem
    for each oItem in target
    if NOT oItem.IsClassOf( siX3DObjectID ) then
    Logmessage "Invalid argument " & oItem.FullName & " to ApplyEmi_AIUEON_Synoptic", siError
    exit function
    end if
    next
    elseif NOT target.IsClassOf( siX3DObjectID ) then
    Logmessage "Invalid argument " & oItem.FullName & " to ApplyEmi_AIUEON_Synoptic", siError
    end if

    'Create the custom property
    dim properties
    SIAddProp "Emi_AIUEON_Synoptic",target,,,properties

    'Show the custom property in the property panel
    if Application.Interactive then
    set view = desktop.activelayout.createview("property panel","Synoptic")
    view.setattributevalue "targetcontent",properties(0).fullname

    'We use a Property Panel view instead of InspectObj because
    'we can resize the view to better fit the synoptic view
    view.resize 500,420
    end if

    ApplyEmi_AIUEON_Synoptic_Execute = true
    end function

    function Emi_AIUEON_Synoptic_OnInit( )
    Application.LogMessage "Emi_AIUEON_Synoptic_OnInit called",siVerbose
    end function

    function Emi_AIUEON_Synoptic_OnClosed( )
    Application.LogMessage "Emi_AIUEON_Synoptic_OnClosed called",siVerbose
    end function

    function Emi_AIUEON_Synoptic_Futu_OnClicked( )
    Application.LogMessage "Emi_AIUEON_Synoptic_Futu_OnClicked called",siVerbose
    end function

    function Emi_AIUEON_Synoptic_A_OnClicked( )
    Application.LogMessage "Emi_AIUEON_Synoptic_A_OnClicked called",siVerbose
    end function

    function Emi_AIUEON_Synoptic_I_OnClicked( )
    Application.LogMessage "Emi_AIUEON_Synoptic_I_OnClicked called",siVerbose
    end function

    function Emi_AIUEON_Synoptic_U_OnClicked( )
    Application.LogMessage "Emi_AIUEON_Synoptic_U_OnClicked called",siVerbose
    end function

    function Emi_AIUEON_Synoptic_E_OnClicked( )
    Application.LogMessage "Emi_AIUEON_Synoptic_E_OnClicked called",siVerbose
    end function

    function Emi_AIUEON_Synoptic_O_OnClicked( )
    Application.LogMessage "Emi_AIUEON_Synoptic_O_OnClicked called",siVerbose
    end function

    function Emi_AIUEON_Synoptic_N_OnClicked( )
    Application.LogMessage "Emi_AIUEON_Synoptic_N_OnClicked called",siVerbose
    end function

     で、ここまでのVBSです。 サンプ ル >> 0_Emi_AIUEON_synoptic.zip

 [A] のボタンを押すと ”あ” のシェイプにする =シェイプのWeightとの関連付け
     ここで再度、ShapeManagerとMixer の関係を確認しましょう。
    アニメートタブ内の ”あ” のスライダーを 1 にすると、AnimatiomMixer 上にある ”あ”のShape用のClipが1になるのが確認できます。
    つまり 1 とは このShapeClipのWeight値が 1 になる事 を意味し、 SctiptEditor で Log を見ると以下記述になっています。
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track55._01-aa_Clip.actionclip.weight", 1
     ということで、カスタムPPG上の ”A” のボタンを押した時、上記記述 が実行されて  になると ”あ” になります。他は  にします。

        余談; ”い” が2つあるのは、”い”の時  歯が見えないのを別途用意したからです。



      つまり スクリプトでは、


           [Futu] ボタンを押したら 上記設定したいクリップのウェイト値が 
           [A] ボタンを押したら aa_ のクリップのウェイト値だけが 
                ・・・・・ となるように作成すれば良いく訳です。

      既存のプラグインを編集する時は、プラグインマ ネージャー内で 編集したいプラグインを選択した状態で>編集 を選ぶと
      スクリプトを編集するテキストエディター(か、スクリプトエディター)上に内容が表示さ れます。

                                    
      <上部略>

      function Emi_AIUEON_Synoptic_OnInit( )
      Application.LogMessage "Emi_AIUEON_Synoptic_OnInit called",siVerbose
      end function

      function Emi_AIUEON_Synoptic_OnClosed( )
      Application.LogMessage "Emi_AIUEON_Synoptic_OnClosed called",siVerbose
      end function

      function Emi_AIUEON_Synoptic_Futu_OnClicked( )
      Application.LogMessage "Emi_AIUEON_Synoptic_Futu_OnClicked called",siVerbose
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track55._01-aa_Clip.actionclip.weight", 0
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track57._03_uu_Clip.actionclip.weight", 0
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track58._04_ee_Clip.actionclip.weight", 0
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track59._05_oo_Clip.actionclip.weight", 0
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track60._06_nn_Clip.actionclip.weight", 0
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track101._08-ii2__Clip.actionclip.weight", 0
      end function

      function Emi_AIUEON_Synoptic_A_OnClicked( )
      Application.LogMessage "Emi_AIUEON_Synoptic_A_OnClicked called",siVerbose
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track55._01-aa_Clip.actionclip.weight", 1
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track57._03_uu_Clip.actionclip.weight", 0
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track58._04_ee_Clip.actionclip.weight", 0
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track59._05_oo_Clip.actionclip.weight", 0
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track60._06_nn_Clip.actionclip.weight", 0
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track101._08-ii2__Clip.actionclip.weight", 0
      end function

      function Emi_AIUEON_Synoptic_I_OnClicked( )
      Application.LogMessage "Emi_AIUEON_Synoptic_I_OnClicked called",siVerbose
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track55._01-aa_Clip.actionclip.weight", 0
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track57._03_uu_Clip.actionclip.weight", 0
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track58._04_ee_Clip.actionclip.weight", 0
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track59._05_oo_Clip.actionclip.weight", 0
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track60._06_nn_Clip.actionclip.weight", 0
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track101._08-ii2__Clip.actionclip.weight", 1
      end function

      function Emi_AIUEON_Synoptic_U_OnClicked( )
      Application.LogMessage "Emi_AIUEON_Synoptic_U_OnClicked called",siVerbose
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track55._01-aa_Clip.actionclip.weight", 0
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track57._03_uu_Clip.actionclip.weight", 1
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track58._04_ee_Clip.actionclip.weight", 0
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track59._05_oo_Clip.actionclip.weight", 0
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track60._06_nn_Clip.actionclip.weight", 0
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track101._08-ii2__Clip.actionclip.weight", 0
      end function

      function Emi_AIUEON_Synoptic_E_OnClicked( )
      Application.LogMessage "Emi_AIUEON_Synoptic_E_OnClicked called",siVerbose
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track55._01-aa_Clip.actionclip.weight", 0
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track57._03_uu_Clip.actionclip.weight", 0
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track58._04_ee_Clip.actionclip.weight", 1
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track59._05_oo_Clip.actionclip.weight", 0
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track60._06_nn_Clip.actionclip.weight", 0
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track101._08-ii2__Clip.actionclip.weight", 0
      end function

      function Emi_AIUEON_Synoptic_O_OnClicked( )
      Application.LogMessage "Emi_AIUEON_Synoptic_O_OnClicked called",siVerbose
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track55._01-aa_Clip.actionclip.weight", 0
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track57._03_uu_Clip.actionclip.weight", 0
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track58._04_ee_Clip.actionclip.weight", 0
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track59._05_oo_Clip.actionclip.weight", 1
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track60._06_nn_Clip.actionclip.weight", 0
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track101._08-ii2__Clip.actionclip.weight", 0
      end function

      function Emi_AIUEON_Synoptic_N_OnClicked( )
      Application.LogMessage "Emi_AIUEON_Synoptic_N_OnClicked called",siVerbose
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track55._01-aa_Clip.actionclip.weight", 0
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track57._03_uu_Clip.actionclip.weight", 0
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track58._04_ee_Clip.actionclip.weight", 0
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track59._05_oo_Clip.actionclip.weight", 0
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track60._06_nn_Clip.actionclip.weight", 1
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track101._08-ii2__Clip.actionclip.weight", 0
      end function

        となりますね。
      書き換えた スクリプトは 、 ファイル> 保存 をし、
      PluginManagerで 再ロード、 CPPG上で  右マウスクリック>更新 をしてください。(念の為両方とも)

                       


      では、うまくいきますかね。
      [E] のボタンを押すと ee_ のクリップのウェイト値が   になり、で、 ”え” の口になりました。



 シノプティックビュー部分の ”あ” 領域を押すと ”あ” のシェイプにする  =上記と同じ記述のコピー
     ここは 上記記述とまったく同じです~。
    Notepadなどお持ちのテキストエディターでHTMLを開き、sub の間にクリップのウェイト値をセットするようにします。
      <html>
      <body version="2">
      <script language="VBScript">

      sub emi_def(in_obj,in_mousebutton,in_keymodifier)
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track55._01-aa_Clip.actionclip.weight", 0
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track57._03_uu_Clip.actionclip.weight", 0
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track58._04_ee_Clip.actionclip.weight", 0
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track59._05_oo_Clip.actionclip.weight", 0
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track60._06_nn_Clip.actionclip.weight", 0
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track101._08-ii2__Clip.actionclip.weight", 0
      end sub
      sub emi_a(in_obj,in_mousebutton,in_keymodifier)
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track55._01-aa_Clip.actionclip.weight", 1
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track57._03_uu_Clip.actionclip.weight", 0
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track58._04_ee_Clip.actionclip.weight", 0
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track59._05_oo_Clip.actionclip.weight", 0
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track60._06_nn_Clip.actionclip.weight", 0
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track101._08-ii2__Clip.actionclip.weight", 0
      end sub
      sub emi_i(in_obj,in_mousebutton,in_keymodifier)
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track55._01-aa_Clip.actionclip.weight", 0
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track57._03_uu_Clip.actionclip.weight", 0
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track58._04_ee_Clip.actionclip.weight", 0
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track59._05_oo_Clip.actionclip.weight", 0
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track60._06_nn_Clip.actionclip.weight", 0
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track101._08-ii2__Clip.actionclip.weight", 1
      end sub
      sub emi_u(in_obj,in_mousebutton,in_keymodifier)
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track55._01-aa_Clip.actionclip.weight", 0
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track57._03_uu_Clip.actionclip.weight", 1
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track58._04_ee_Clip.actionclip.weight", 0
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track59._05_oo_Clip.actionclip.weight", 0
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track60._06_nn_Clip.actionclip.weight", 0
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track101._08-ii2__Clip.actionclip.weight", 0
      end sub
      sub emi_e(in_obj,in_mousebutton,in_keymodifier)
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track55._01-aa_Clip.actionclip.weight", 0
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track57._03_uu_Clip.actionclip.weight", 0
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track58._04_ee_Clip.actionclip.weight", 1
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track59._05_oo_Clip.actionclip.weight", 0
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track60._06_nn_Clip.actionclip.weight", 0
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track101._08-ii2__Clip.actionclip.weight", 0
      end sub
      sub emi_o(in_obj,in_mousebutton,in_keymodifier)
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track55._01-aa_Clip.actionclip.weight", 0
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track57._03_uu_Clip.actionclip.weight", 0
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track58._04_ee_Clip.actionclip.weight", 0
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track59._05_oo_Clip.actionclip.weight", 1
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track60._06_nn_Clip.actionclip.weight", 0
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track101._08-ii2__Clip.actionclip.weight", 0
      end sub
      sub emi_n(in_obj,in_mousebutton,in_keymodifier)
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track55._01-aa_Clip.actionclip.weight", 0
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track57._03_uu_Clip.actionclip.weight", 0
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track58._04_ee_Clip.actionclip.weight", 0
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track59._05_oo_Clip.actionclip.weight", 0
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track60._06_nn_Clip.actionclip.weight", 1
      SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track101._08-ii2__Clip.actionclip.weight", 0
      end sub

      </SCRIPT>

      <map name="SynopticMap">
      <area shape="rect" coords="62,13,134,50" title="def" NOHREF onClick="emi_def">
      <area shape="rect" coords="14,53,45,115" title="A" NOHREF onClick="emi_a">
      <area shape="rect" coords="46,53,73,114" title="I" NOHREF onClick="emi_i">
      <area shape="rect" coords="74,54,103,115" title="U" NOHREF onClick="emi_u">
      <area shape="rect" coords="104,54,134,116" title="E" NOHREF onClick="emi_e">
      <area shape="rect" coords="135,55,161,116" title="O" NOHREF onClick="emi_o">
      <area shape="rect" coords="162,56,191,115" title="N" NOHREF onClick="emi_n">
      </map>

      <img src="Emi_face1.jpg" usemap="#SynopticMap">

      </body>
      </html>

      では、うまくいきますかね。
      "あ" の領域を押すと aa_ のクリップのウェイト値が   になり、で、 ”あ” の口になりました。



 キーフレーム値として保存
     ここまで来て、気が付きましたか?で、このウェイト 値のキーフレーム保存は??と・・・・
    そうですよね。アニメーションなんだからキーフレームで値を保存せねば。
    ではボタンを追加しましょう。
     [SaveKey] [ClearKey] というボタンを用意して 
    今いるキーフレームでその時設定されているウェイト値を 保存/やっぱやめた(= Removeね) を実現しましょう。
     またウィザードから作成するのではなく、もうスクリプティング 追記してしまいましょう。

     まずは ”あ” の口用の aa_ シェイプクリップのウェイトが1 の時 キープレームを登録してみます。(カーブアイコンをクリックして赤色になる)
    すると、スクリプトエディター上の Log は
      SaveKey "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track55._01-aa_Clip.actionclip.weight", 1
    もう一度、カーブアイコンをクリックしてキー登録を解除すると (カーブアイコンをクリック して緑色に戻る)
      RemoveKey "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track55._01-aa_Clip.actionclip.weight", 1
        (最後の値は キーフレーム数です)



    となります。なーんだ、でしょ。 最初の単語が、SaveKeyRemoveKey かだけしか違いがありません。
     ボタンを追加する記述は、function Emi_AIUEON_Synoptic_DefineLayout( ctxt )  内 に
    ボタン追加の記述  oLayout.AddButton "SaveKey" oLayout.AddButton "ClearKey" を入れます。
     そして、 [SaveKey] [ClearKey] ボタンを押した 時の動作としては 上記スクリプトエディターのLog通りなんですが、
    1つ厄介なのは その時のキーフレーム数をという意味で 行の最後の所は CurrentFrame と書きます。
     つまり、
      SaveKey "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track55._01-aa_Clip.actionclip.weight", CurrentFrame
      RemoveKey "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track55._01-aa_Clip.actionclip.weight", CurrentFrame
     を、あ、い、う、え、お、ん 分記述します。
    <上部略>

    function Emi_AIUEON_Synoptic_DefineLayout( ctxt )
    dim oLayout,oItem
    set oLayout = ctxt.Source
    oLayout.Clear

    oLayout.AddGroup " ----- EMI A . I . U . E . O . N ----- "
    oLayout.AddRow
    oLayout.AddButton "Futu"
    oLayout.AddButton "A"
    oLayout.AddButton "I"
    oLayout.AddButton "U"
    oLayout.AddButton "E"
    oLayout.AddButton "O"
    oLayout.AddButton "N"
    oLayout.EndRow
    oLayout.AddRow
    oLayout.AddButton "SaveKey"
    oLayout.AddButton "ClearKey"
    oLayout.EndRow

    'Create the synoptic widget, which loads the synoptic view specified by the path parameter

    set oItem = oLayout.AddItem("path", "", siControlSynoptic)
    oItem.setattribute siUINoLabel,true

    oLayout.EndGroup

    Emi_AIUEON_Synoptic_DefineLayout = true
    end function

    <中略>

    function Emi_AIUEON_Synoptic_N_OnClicked( )
    Application.LogMessage "Emi_AIUEON_Synoptic_N_OnClicked called",siVerbose
    SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track55._01-aa_Clip.actionclip.weight", 0
    SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track57._03_uu_Clip.actionclip.weight", 0
    SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track58._04_ee_Clip.actionclip.weight", 0
    SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track59._05_oo_Clip.actionclip.weight", 0
    SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track60._06_nn_Clip.actionclip.weight", 1
    SetValue "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track101._08-ii2__Clip.actionclip.weight", 0
    end function

    function Emi_AIUEON_Synoptic_SaveKey_OnClicked( )
    Application.LogMessage "Emi_AIUEON_Synoptic_SaveKey_OnClicked called",siVerbose
    SaveKey "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track55._01-aa_Clip.actionclip.weight", CurrentFrame
    SaveKey "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track57._03_uu_Clip.actionclip.weight", CurrentFrame
    SaveKey "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track58._04_ee_Clip.actionclip.weight", CurrentFrame
    SaveKey "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track59._05_oo_Clip.actionclip.weight", CurrentFrame
    SaveKey "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track60._06_nn_Clip.actionclip.weight", CurrentFrame
    SaveKey "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track101._08-ii2__Clip.actionclip.weight", CurrentFrame
    end function

    function Emi_AIUEON_Synoptic_ClearKey_OnClicked( )
    Application.LogMessage "Emi_AIUEON_Synoptic_ClearKey_OnClicked called",siVerbose
    RemoveKey "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track55._01-aa_Clip.actionclip.weight", CurrentFrame
    RemoveKey "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track57._03_uu_Clip.actionclip.weight", CurrentFrame
    RemoveKey "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track58._04_ee_Clip.actionclip.weight", CurrentFrame
    RemoveKey "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track59._05_oo_Clip.actionclip.weight", CurrentFrame
    RemoveKey "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track60._06_nn_Clip.actionclip.weight", CurrentFrame
    RemoveKey "Model_Emi.Mixer.Mixer_Shape_Track.shape_ClusterClip.Mixer_Shape_Track101._08-ii2__Clip.actionclip.weight", CurrentFrame
    end function

      では、うまくいきますかね。
       5フレーム目に移り
      [U] のボタンを押しと uu_ のクリップのウェイト値が   になり、で、 ”う” の口になりました。
      [SaveKey] のボタンを押して その状態のキーを登録できまし た。


 シェープクリップ内のウェイト値Fカーブ
     さー試しにキーでも打って、動かそうとしてふと  ウェイト値のカーブを見ると気が付くはずです。
    キー登録したフレーム数間に隔たりがある場合、例えば6フレと10フレ、その間をウェイト値 がブレンドしてしまいます。
    この場合は ”あ” から ”う” まで徐々に変化してしまいます。



     ファンクションカーブを見ると ウェイト値のカーブ は スプライン補完であるからだ と理解出来ます。
    これをコンスタント内挿補完 にしたいと思います。



     1フレーム目に 普通 の口の形で キーを登録しま す。


     アニメーションエディターを開いて、1フレーム目の キー を 0フレーム目のキー として移動しておいて
    カーブ>コンスタント内挿補完 にします。これを あ~ん まで行います。



     次からは カーブがコンスタント内挿補完  でキー登録されていきます。


     という訳で、ここまででも長くなってしまったので、実例は次回 へ
    次回は リップシンク アニメーション  を予定しております。
      乞う、ご期待!!