眼を開いた状態と目を閉じた状態の MeshGeometry3Dを、スライダーで線形合成してみた
左から右へ、眼を開いた状態、目を閉じた状態、合成したもの
眼をあいている状態では、目の周りにアイシャドウを引いていたりして、合成した時に汚くなることがある。結構細かいところに気をつける必要あり。
それから、六角大王で dxf ファイルにエクスポートした際に、頂点数が変わってしまう。このため、単純にマッピングできず、TriangleIndices でマッピングを取っている。このため、処理的にはかなり重い。動かない場所は処理しないなどの高速化が必要かもしれない。
それから、六角大王から通常状態と目を閉じた状態でエクスポートした場合、わずかに座標がずれている。このため、単純に動かない場所は処理しないという処理ができない。結構厄介だ・・・・・
namespace Morphing_V1
{
public partial class Window1 : System.Windows.Window
{
・・・
GeometryModel3D gm1 = null;
MeshGeometry3D mg10 = null;
Point3DCollection p3dcol10 = null;
・・・
private void slider1_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
double v = this.slider1.Value / 10d;
for (int c = 0; c < this.NormalOR32.Children.Count; c++)
{
gm1 = (GeometryModel3D)(this.NormalOR32.Children[c]);
mg10 = (MeshGeometry3D)(gm1.Geometry);
p3dcol10 = mg10.Positions;
gm2 = (GeometryModel3D)(this.CloseEyesOR40.Children[c]);
mg20 = (MeshGeometry3D)(gm2.Geometry);
p3dcol20 = mg20.Positions; gmRes = (GeometryModel3D)(this.ResOR50.Children[c]);
mRes = (MeshGeometry3D)(gmRes.Geometry);
poRes = mRes.Positions; Point3DCollection resPoCol = poRes; for (int j = 0; j < mg10.TriangleIndices.Count; j++)
{
int inorm = mg10.TriangleIndices[j];
int ia = mg20.TriangleIndices[j];
resPoCol[ia] = new Point3D(
p3dcol10[inorm].X * v + p3dcol20[ia].X * (1.0 – v),
p3dcol10[inorm].Y * v + p3dcol20[ia].Y * (1.0 – v),
p3dcol10[inorm].Z * v + p3dcol20[ia].Z * (1.0 – v));
}
mRes.Positions = resPoCol; }
}
}
}