CG・コンテンツ制作
  1. CG・コンテンツ制作トップ
  2. DAIKIN CG Channel
  3. UsersNotes
  4. キャラクター
  5. キャラクターメイキング|リップシンクの設定
SUITE USERS NOTES
キャラクター・メイキング
>> リップシンクの設定

キャラクター・メイキング編について

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

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

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

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

最初に キャラクターが全て入っているMODELノードを選択した状態から始めます。
toon11-10
ファイル > プラグインマネージャーから、
ユーザールートのプラグンフォルダー右マウスボタンクリック > 新規作成 > プロパティー を選択します。
toon11-01
すると、こんな作成用のPPGが表示されます。
ここから色々と作り込んでみましょう。
toon11-02

カスタム・プロパティーの作成
パラメータの追加タブに移り、パラメータータイプの右下▼から ボタンを選択し、名前/ラベルに
Futu、A、I、U、E、O、N を作成します。(残念ながら日本語は記入しない方が良いです。)
toon11-03
次に、レイアウト(オプション)タブに移ります。
右欄(パラメータ)A・ I・ U・ E・ O・ Nを各個別に選択して、[追加] ボタンを押すと、
左欄(レイアウト)に各パラメータが追記されます。

グループ名を作成します。下のグループ化 ; 名前欄 にグループ名を記入し、その右にある[グループの追加] ボタンを押します。
Futu ・A・ I・ U・ E・ O・ N Group Row の中括弧内に入るように、
下部にある[上] [下] ボタンを活用して、パラメータの記述位置を修正します。
toon11-04
[プロパティー生成] ボタンにを押すと下図のようなPPGが作成されます。
この時点では何も起こりませんが、
ボタンを押せるページとそれのソースであるVBSファイルがスクリプトエディター上に表示されます。
toon11-05
ここまでのVBSファイルです。サンプル >> Emi_AIUEON-VBS.zip

このカスタムなPPGについての考察=自動認識型プラグイン
この時点で、新しく作成したPPGは選択したMODELノード以下にオレンジ色の[C] ノードで存在します。
ダブルクリックすればPPGが開きます。
toon11-06
作成されたプラグインは、自分のユーザーディレクトリ-下のバージョン名 /Application/Plugin内にVBSファイルとして保存された
自動インストール型のプラグインになります。
このPPGを他のユーザーにも使用させたい場合は、このプラグインも配布する必要がある事、注意してください。
toon11-11
また、この時点でウィザードのページを閉じていまったとしても(シーンの保存した状態から、読み込みしてみると)
SDK_Wizardsというモデルノード以下に保存されており、その中の CPSetWizardノードを開くと
閉じる前の状態の作成途中の設定ページが復帰されます。
toon11-12

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

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

この原型になったサンプルは、SDKワークグループ(C:\Softimage\XSI_7.***\XSISDK\examples\workgroup)内の
Addons\PPGDemos\Application\Plugins 内 embeddedsynoptic.vbs から応用したものです。
toon11-20
上図のような絵とマウスポインターで色が変わるボタン領域の設定は、シノプティックビューなのです。
つまり、カスタムPPGの中に HTML形式のシノプティックビューを入れて表示・操作しています。


シノプティックビュー=シノプティック・エディターで HTMLを作成
シノプティックエディターを開きます。 表示 > 一般 > SynopticEditor です。
toon11-21
ファイル > ファイルからイメージを読み込むで画像を読み込み、絵の領域設定とリンク先、詳細に記述をします。
既にシノプティックのHTMLがある場合は、ファイル > 開で既存のものを表示出来ます。
toon11-22
上図 [スクリプト] と書いてあるボタンを押すと、スクリプトのページになり、Subコマンドの間にログメッセージを表示するという仮の記述をしておきます。
これで、普通と書かれている領域をマウスでクリックすると、スクリプトエディター上に' INFO : Tsujyo と表示されます。
toon11-23
で、出来上がると、こんな 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 mi_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) 内の処理はプロパティをオブジェクトに適用して、ビュー内に表示するための処理です。
toon11-24
(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つあるのは、 ”い” の時、歯が見えないのを別途用意したからです。
toon11-30
つまりスクリプトでは、
toon11-31
[Futu] ボタンを押したら上記設定したいクリップのウェイト値が
[A] ボタンを押したら aa_ のクリップのウェイト値だけが
・・・・・となるように作成すれば良いく訳です。

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

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上で右マウスクリック > 更新をしてください。(念の為両方とも)
toon11-33
toon11-32
ではうまくいきますかね。
[E] のボタンを押すと ee_ のクリップのウェイト値がになり、で、 ”え” の口になりました。
toon11-34

シノプティックビュー部分の ”あ” 領域を押すと ”あ” のシェイプにする=上記と同じ記述のコピー
ここは上記記述とまったく同じです~。
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_ のクリップのウェイト値がになり、で、”あ”の口になりました。
toon11-40

キーフレーム値として保存
ここまで来て、気が付きましたか?で、このウェイト値のキーフレーム保存は??と・・・・
そうですよね。アニメーションなんだからキーフレームで値を保存せねば。
ではボタンを追加しましょう。
[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
(最後の値はキーフレーム数です)
toon11-41
となります。なーんだ、でしょ。最初の単語が、 SaveKey RemoveKey かだけしか違いがありません。
ボタンを追加する記述は、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] のボタンを押してその状態のキーを登録できました。
toon11-42

シェープクリップ内のウェイト値 Fカーブ
さー試しにキーでも打って、動かそうとしてふとウェイト値のカーブを見ると気が付くはずです。
キー登録したフレーム数間に隔たりがある場合、例えば 6フレと 10フレ、その間をウェイト値がブレンドしてしまいます。
この場合は ”あ” から ”う” まで徐々に変化してしまいます。
toon11-51
ファンクションカーブを見るとウェイト値のカーブはスプライン補完であるからだと理解出来ます。
これをコンスタント内挿補完にしたいと思います。
toon11-50
1フレーム目に普通の口の形で キーを登録します。
toon11-60
アニメーションエディターを開いて、1フレーム目のキーを 0フレーム目のキーとして移動しておいて
カーブ > コンスタント内挿補完にします。これを あ~ん まで行います。
toon11-61
次からはカーブがコンスタント内挿補完でキー登録されていきます。
toon11-62

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

お気軽にお問い合わせください

Daikin CG News お申し込み

CGクリエイター向けのセミナー・イベントやキャンペーン、製品情報をメールマガジンでお届けします。(登録無料)

Twitter

ページの先頭へ