表情モーフィングの計算
1.モーフィング計算
まずモーフィングの計算を行う関数を定義します。
Vlerp[v1_, v2_, t_] := Module[
{vr, ret},
vr = (1 - t) v1 + t v2;
Return[vr];
];
SkinMorph[Vertex_, Skin_, Motion_] :=
Module[{i, j, d, e, f, base, ret, Name, t, emotion},
ret = Vertex;
If[Length[Motion] == 0, Return[Vertex]];
base = Skin[[1]];
For[i = 1, i <= Length[Motion], i++,
Name = Motion[[i, 1, 2]];
t = Motion[[i, 3, 2]];
j = Flatten[Position[Skin[[All, 1]], Name]];
If[Length[j] == 0, Continue[]];
j = j[[1]];
d = Skin[[j]];
For[j = 1, j <= d[[2]], j++,
e = Vlerp[
base[[4, d[[4, j, 1]] + 1, 2]],
base[[4, d[[4, j, 1]] + 1, 2]] + d[[4, j, 2]],
t];
base = ReplacePart[base, {4, d[[4, j, 1]] + 1, 2} -> e];
ret = ReplacePart[ret, {base[[4, d[[4, j, 1]] + 1, 1]] + 1} -> e];
];(* For j *)
];
Return[ret];
];
2. 表情の指定
あにまさ式ミクさんのPMDファイルの表情の種類を確認するには下記コマンドを入力します。
In[246]:= f["Skin_data"][[All, 1]]
Out[246]= {"base", "真面目", "困る", "にこり", "怒り", "上", "下", \
"まばたき", "笑い", "ウィンク", "ウィンク2", "ウィンク右", "ウィンク2右", "はぅ", \
"なごみ", "びっくり", "じと目", "なぬ!", "瞳小", "あ", "い", "う", "お", \
"\[FilledUpTriangle]", "\[And]", "\[Omega]", \
"\[Omega]\[EmptySquare]", "はんっ!", "ぺろっ", "えー", "にやり"}
例えばミクさんに、にこりとウィンクしてぺろっとして頂くには下記の様なリストを作成します。
g1 = {
{{"SkinName", "ウィンク"}, {"FlameNo", 1}, {"Weight", 1.`}},
{{"SkinName", "にこり"}, {"FlameNo", 1}, {"Weight", 1.`}},
{{"SkinName", "ぺろっ"}, {"FlameNo", 1}, {"Weight", 1.`}}
};
ShiftJISの漢字コードが上手くノートブックに入力できない場合は下記入力をしてみてください。
In[23]:= g1 = {
{{"SkinName", f["Skin_data"][[All, 1]][[10]]}, {"FlameNo", 1},
{"Weight", 1.`}},
{{"SkinName", f["Skin_data"][[All, 1]][[4]]}, {"FlameNo", 1},
{"Weight", 1.`}},
{{"SkinName", f["Skin_data"][[All, 1]][[29]]}, {"FlameNo", 1},
{"Weight", 1.`}}
}
Out[23]= {
{{"SkinName", "ウィンク"}, {"FlameNo", 1}, {"Weight", 1.}},
{{"SkinName", "にこり"}, {"FlameNo", 1}, {"Weight", 1.}},
{{"SkinName", "ぺろっ"}, {"FlameNo", 1}, {"Weight", 1.}}
}
3. 表情モーフィングの実行
表情モーフィングをした頂点座標を計算します。
vertex = SkinMorph[f["VertexVectors"], f["Skin_data"], g1];
4. 結果の表示
表示してみます。
Graphics3D[
Prepend[Flatten[#, 1] & /@
Partition[
Riffle[f["TextureList"][[# + 1]] & /@ f["MaterialIndices"],
Polygon[#[[1]], #[[2]], #[[
3]]] & /@ ({vertex[[# + 1]],
VertexNormals -> f["NormalVectors"][[# + 1]],
VertexTextureCoordinates -> f["UVVectors"][[# + 1]]} & /@
f["FaceIndices"])], 2], EdgeForm[]],
ViewPoint -> {0.295918150638636`, 0.295873255916524`, 3.357810516475874`},
ViewCenter -> {{0.5`, 0.5`, 0.5`},
{0.47532409931375563`,-1.0411988335153852`}},
ViewAngle -> 0.07048280598964335`,
ViewVertical ->
{0.05306019054920806`, 0.8551795243995924`, 1.5428727481287545`}
]
つづく
5 関連リンク
MathematicaでMikuMikuDance 3 ステージの読み込み