WPF Morphing してみる

眼を開いた状態と目を閉じた状態の 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;            }
        }
    }
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です