none
PropertyPathの指定(3-D変換)が分かりません RRS feed

  • 質問

  • お世話になっております。

    3-D変換でのPropertyPathの指定方法が分からず困っています。

    こちらで以前アドバイスいただき、2-Dの変換は動作しました。
    それを参考に3-Dでの変換を作ってるところです。

    TranslateTransform3Dと、ScaleTransform3DをTransform3DGroupにAddし、
    Storyboardでアニメーションしようと考えております。

    PropertyPathの指定を色々試しましたがいずれも
    StoryBoad.Begin()で実行時エラーになりました。

    TranslateTransform3D myTranslate = new TranslateTransform3D();
    
    ScaleTransform3D myScaleTrans = new ScaleTransform3D();
    
    Transform3DGroup myTrans3DGroup = new Transform3DGroup();
    
    
    
    myTrans3DGroup.Children.Add(myTranslate);
    
    myTrans3DGroup.Children.Add(myScaleTrans);
    
    
    
    this.myGeometryModel3D.Transform = myTrans3DGroup;
    
    
    
    var animation1 = new DoubleAnimation();
    
    animation1.From = 1;
    
    animation1.To = pTarget.X;
    
    animation1.Duration = TimeSpan.FromMilliseconds(500);
    
    Storyboard.SetTargetProperty(animation1,
    
        new PropertyPath("(Viewport3D.Transform).(Transform3DGroup.Children)[0].(TranslateTransform3D.OffsetX)"));
    
        //new PropertyPath("(Model3D.Transform).(Transform3DGroup.Children)[0].(TranslateTransform3D.OffsetX)"));
    
        //new PropertyPath("(Visual3D.Transform).(Transform3DGroup.Children)[0].(TranslateTransform3D.OffsetX)"));
    
        //new PropertyPath("(UIElement3D.Transform).(Transform3DGroup.Children)[0].(TranslateTransform3D.OffsetX)"));
    
        //new PropertyPath("(GeometryModel3D.Transform).(Transform3DGroup.Children)[0].(TranslateTransform3D.OffsetX)"));
    
        //new PropertyPath("(ModelVisual3D.Transform).(Transform3DGroup.Children)[0].(TranslateTransform3D.OffsetX)"));
    
    
    
                        
    
    myStoryBoad.Begin();
    
    
    
    

    PropertyPathの指定方法が間違っていると思い、いろいろ試してみました。
    ですが、他の箇所が悪いのでしょうか???

    宜しくお願いいたします。


    2010年1月25日 23:35

回答

  • animation1 のターゲットが書かれていませんが、多分 GeometryModel3D なんでしょうね。
    PropertyPath("(ModelVisual3D.Transform).(Transform3DGroup.Children)[0].(TranslateTransform3D.OffsetX)"));
    PropertyPath("(UIElement3D.Transform).(Transform3DGroup.Children)[0].(TranslateTransform3D.OffsetX)"));
    PropertyPath("(Visual3D.Transform).(Transform3DGroup.Children)[0].(TranslateTransform3D.OffsetX)"));
    PropertyPath はターゲットになるオブジェクトから見たプロパティのパスです。
    ターゲットが GeometryModel3D として、このクラスは Object -> DispatcherObject -> DependencyObject -> Freezable -> Animatable -> Model3D -> GeometryModel3D という継承関係を持っています。
    つまり、ModelVisual3D やら UIElement3D やら Visual3D やらとは関係ありません。それらの Transform プロパティと GeometryModel3D.Transform とは、名前が同じだけで別のプロパティです。逆に、Model3D には Transform が定義されており、GeometryModel3D はこれを継承していますから、Model3D.Transform と書くことは可能です。
    // (ClassA.PropertyB).(ClassC.PropertyD) という構文よりも PropertyB.PropertyD という構文の方がプログラミング的で直感的だと思います。
    PropertyPath("(Viewport3D.Transform).(Transform3DGroup.Children)[0].(TranslateTransform3D.OffsetX)"));
    GeometryModel3D は Viewport3D ではないですが、それ以前に Viewport3D クラスにはそもそも Transform プロパティが存在していません(RenerTransform ならありますけど)。これが「不変インスタンスをポイント」例外を出すというのは勘違いだと思います。
    PropertyPath("(GeometryModel3D.Transform).(Transform3DGroup.Children)[0].(TranslateTransform3D.OffsetX)"));
    PropertyPath("(Model3D.Transform).(Transform3DGroup.Children)[0].(TranslateTransform3D.OffsetX)"));
    原因は追い切れていませんが、Storyboard.SetTargetName ではなく Storyboard.SetTarget を使って 3D アニメーションのターゲットを設定した場合にこの例外が発生するようです。
    適切なネームスコープ(Window など)に RegisterName で GeometryModel3D を登録し、その名前を Storyboard.SetTargetName でターゲットとして設定した場合は問題なく動きました。
    • 回答としてマーク sumi_sumi 2010年1月26日 17:32
    2010年1月26日 6:10

すべての返信

  • で、どんなエラーですか?
    2010年1月26日 0:15
  • Hongliang 様

    失礼しました。
    エラーメッセージとしては
    PropertyPathに設定する内容によって2種類されております。

    1つは、
    「~に解決できないプロパティ参照があります。該当するオブジェクトでそれらのプロパティがサポートされていることを確認してください。」

    あるいは、
    「~の '[Unknown]' プロパティ値は 'System.Windows.Media.Media3D.TranslateTransform3D' の不変インスタンスをポイントします。」

    が表示されます。

    PropertyPathを以下にした場合
    PropertyPath("(ModelVisual3D.Transform).(Transform3DGroup.Children)[0].(TranslateTransform3D.OffsetX)"));
    エラーメッセージ
    プロパティ パス '(ModelVisual3D.Transform).(Transform3DGroup.Children)[0].(TranslateTransform3D.OffsetX)' に解決できないプロパティ参照があります。該当するオブジェクトでそれらのプロパティがサポートされていることを確認してください。


    PropertyPathを以下にした場合
    PropertyPath("(GeometryModel3D.Transform).(Transform3DGroup.Children)[0].(TranslateTransform3D.OffsetX)"));
    エラーメッセージ
    パス '(GeometryModel3D.Transform).(Transform3DGroup.Children)[0].(TranslateTransform3D.OffsetX)' の '[Unknown]' プロパティ値は 'System.Windows.Media.Media3D.TranslateTransform3D' の不変インスタンスをポイントします。


    PropertyPathを以下にした場合
    PropertyPath("(UIElement3D.Transform).(Transform3DGroup.Children)[0].(TranslateTransform3D.OffsetX)"));
    エラーメッセージ
    プロパティ パス '(UIElement3D.Transform).(Transform3DGroup.Children)[0].(TranslateTransform3D.OffsetX)' に解決できないプロパティ参照があります。該当するオブジェクトでそれらのプロパティがサポートされていることを確認してください。


    PropertyPathを以下にした場合
    PropertyPath("(Visual3D.Transform).(Transform3DGroup.Children)[0].(TranslateTransform3D.OffsetX)"));
    エラーメッセージ
    プロパティ パス '(Visual3D.Transform).(Transform3DGroup.Children)[0].(TranslateTransform3D.OffsetX)' に解決できないプロパティ参照があります。該当するオブジェクトでそれらのプロパティがサポートされていることを確認してください。


    PropertyPathを以下にした場合
    PropertyPath("(Model3D.Transform).(Transform3DGroup.Children)[0].(TranslateTransform3D.OffsetX)"));
    エラーメッセージ
    パス '(Model3D.Transform).(Transform3DGroup.Children)[0].(TranslateTransform3D.OffsetX)' の '[Unknown]' プロパティ値は 'System.Windows.Media.Media3D.TranslateTransform3D' の不変インスタンスをポイントします。


    PropertyPathを以下にした場合
    PropertyPath("(Viewport3D.Transform).(Transform3DGroup.Children)[0].(TranslateTransform3D.OffsetX)"));
    エラーメッセージ
    パス '(Viewport3D.Transform).(Transform3DGroup.Children)[0].(TranslateTransform3D.OffsetX)' の '[Unknown]' プロパティ値は 'System.Windows.Media.Media3D.TranslateTransform3D' の不変インスタンスをポイントします。

     

     

    2010年1月26日 0:48
  • animation1 のターゲットが書かれていませんが、多分 GeometryModel3D なんでしょうね。
    PropertyPath("(ModelVisual3D.Transform).(Transform3DGroup.Children)[0].(TranslateTransform3D.OffsetX)"));
    PropertyPath("(UIElement3D.Transform).(Transform3DGroup.Children)[0].(TranslateTransform3D.OffsetX)"));
    PropertyPath("(Visual3D.Transform).(Transform3DGroup.Children)[0].(TranslateTransform3D.OffsetX)"));
    PropertyPath はターゲットになるオブジェクトから見たプロパティのパスです。
    ターゲットが GeometryModel3D として、このクラスは Object -> DispatcherObject -> DependencyObject -> Freezable -> Animatable -> Model3D -> GeometryModel3D という継承関係を持っています。
    つまり、ModelVisual3D やら UIElement3D やら Visual3D やらとは関係ありません。それらの Transform プロパティと GeometryModel3D.Transform とは、名前が同じだけで別のプロパティです。逆に、Model3D には Transform が定義されており、GeometryModel3D はこれを継承していますから、Model3D.Transform と書くことは可能です。
    // (ClassA.PropertyB).(ClassC.PropertyD) という構文よりも PropertyB.PropertyD という構文の方がプログラミング的で直感的だと思います。
    PropertyPath("(Viewport3D.Transform).(Transform3DGroup.Children)[0].(TranslateTransform3D.OffsetX)"));
    GeometryModel3D は Viewport3D ではないですが、それ以前に Viewport3D クラスにはそもそも Transform プロパティが存在していません(RenerTransform ならありますけど)。これが「不変インスタンスをポイント」例外を出すというのは勘違いだと思います。
    PropertyPath("(GeometryModel3D.Transform).(Transform3DGroup.Children)[0].(TranslateTransform3D.OffsetX)"));
    PropertyPath("(Model3D.Transform).(Transform3DGroup.Children)[0].(TranslateTransform3D.OffsetX)"));
    原因は追い切れていませんが、Storyboard.SetTargetName ではなく Storyboard.SetTarget を使って 3D アニメーションのターゲットを設定した場合にこの例外が発生するようです。
    適切なネームスコープ(Window など)に RegisterName で GeometryModel3D を登録し、その名前を Storyboard.SetTargetName でターゲットとして設定した場合は問題なく動きました。
    • 回答としてマーク sumi_sumi 2010年1月26日 17:32
    2010年1月26日 6:10
  • Hongliang 様

    ご親切なアドバイス有難うございます。

    クラスの継承関係のお話、勉強になります。有難うございます。

    アドバイスいただいた通り、Storyboard.SetTargetName ではなく Storyboard.SetTarget を使うことにより解決出来ました。

    本当に有難う御座いました。
    2010年1月26日 17:35