WPFでスキニング
前回WPFでのモーフィングについて書きましたが、同じテクニックを使えばWPFでのスキニングも可能です。「スキニング」とは人間の腕やひざなどのような滑らかな屈曲を表現するための手法で、頂点ブレンディングを使います。「頂点ブレンディング」とは1つの頂点の座標変換に複数の行列を用いて、その結果を重みづけして加えるテクニックです。
次のコードは円柱の頂点を生成するとき、2つの行列を引数として取り、頂点ブレンディングでスキニングを実装しています。
internal Point3D GetPosition(double t, double y, Matrix3D m1, Matrix3D m2)
{
double x = Math.Cos(t);
double z = Math.Sin(t);
double w = y * 0.5 + 0.5;
Point3D p = new Point3D(x, y, z);
Point3D p1 = Point3D.Multiply(p,m1);
p1.X *= w; p1.Y *= w; p1.Z *= w;
Point3D p2 = p * m2;
w = 1.0 - w;
p2.X *= w; p2.Y *= w; p2.Z *= w;
p.X = p1.X + p2.X; p.Y = p1.Y + p2.Y; p.Z = p1.Z + p2.Z;
return p;
}
もちろん、円柱を作成したら、コードでルートのModelVisual3D(ここではmyScene)に追加しなければいけません。
private void SliderMoved(object sender, RoutedEventArgs e)
{
myScene.Children.Clear();
ModelVisual3D myMV3D = new ModelVisual3D();
myMV3D.Content = (Model3D)CreateModel3D(mySlider.Value, 0.0);
myScene.Children.Add(myMV3D);
}
Comments
Anonymous
December 20, 2007
UIElement3D にはもうひとつ大きな利点があります。UIElement3DにはOnModelUpdateとInvalidateModelメソッドがあり、これによりデータバインディングを使ったモデルの修正が可能になりました。Anonymous
December 20, 2007
UIElement3D にはもうひとつ大きな利点があります。UIElement3DにはOnModelUpdateとInvalidateModelメソッドがあり、これによりデータバインディングを使ったモデルの修正が可能になりました