none
3Dオブジェクトの座標(X,Y,Z)を取得したい RRS feed

  • 質問

  • 3Dオブジェクト(MeshGeometry3D)の座標(X,Y,Z)の取得方法が分からず困っております。

    XAML側で以下のように定義してる3角形(MeshGeometry3D)があります。

    <GeometryModel3D x:Name="myGeometryModel3D">
     <GeometryModel3D.Geometry>
      <MeshGeometry3D >
              <!-- 三角形の形状を設定-->
              <MeshGeometry3D.Positions>
                      <Point3DCollection >
                               -2,1,0 -2,-1,0 2,-1,0
                               </Point3DCollection>
                    </MeshGeometry3D.Positions>


    このオブジェクトの座標位置をC#側で取得したいと思っております。

    以下のような感じで取得出来るのかなと思いましたが、ダメでした。
    定義されてないと怒られます。。。。
    自分は、すごい勘違いをしている気がします・・・。

    myGeometryModel3D.Geometry.MeshGeometry3D.Positions


    エラーメッセージ↓
    エラー 2 'System.Windows.Media.Media3D.Geometry3D' に 'MeshGeometry3D' の定義が含まれておらず、
    型 'System.Windows.Media.Media3D.Geometry3D' の最初の引数を受け付ける拡張メソッドが見つかりませんでした。
    using ディレクティブまたはアセンブリ参照が不足しています。 


    ヘルプで探しましたが、座標取得に関する情報を見つけることが出来ませんでした。

    アドバイスいただけたらと思います。
    宜しくお願いいたします。

    2010年1月27日 8:59

回答

すべての返信

  • オブジェクトの座標位置というか、要するに GeometryModel3D に含まれる MeshGeometry3D の Positions プロパティをコードで取得したいってことですか?
    それなら GeometryModel3D の Geometry プロパティを MeshaGeometry3D にキャストすればいいと思いますが。
    • 回答としてマーク sumi_sumi 2010年2月1日 13:40
    2010年1月27日 9:49
  • このページを見てください。
    http://msdn.microsoft.com/ja-jp/library/system.windows.media.media3d.geometrymodel3d.geometry.aspx

    myGeometryModel3D.Geometry は Geometry3D のクラスになります。

    次にこのページの継承階層を見てください。
    http://msdn.microsoft.com/ja-jp/library/system.windows.media.media3d.meshgeometry3d.aspx

    MeshGeometry3D は Geometry3D のクラスを継承しています。
    従ってキャストする必要があります。

    MeshGeometry3D には Positions がありますが、Geometry3D にはありません。
    http://msdn.microsoft.com/ja-jp/library/system.windows.media.media3d.meshgeometry3d.positions.aspx

    なのでキャストした MeshGeometry3D で Positions を取得する必要があります。

    ヘルプの参照の仕方はわかりますでしょうか?



    えムナウ@わんくま同盟 Microsoft MVP Visual Studio C# Since 2005/01-2010/12
    • 回答としてマーク sumi_sumi 2010年2月1日 13:40
    2010年1月27日 12:31
  • Hongliang 様

    お返事有難う御座います。

    >要するに GeometryModel3D に含まれる MeshGeometry3D の Positions プロパティをコードで取得したいってことですか?
    はい。正しくその通りです。

    以下のようにキャストしてみました。

    MeshGeometry3D myMeshGeometry3D = (MeshGeometry3D)myGeometryModel3D.Geometry;
    Point3DCollection myPoint3DCollection = myMeshGeometry3D.Positions;
    Point PointMy3D = myPoint3DCollection.Item(0);←ここでエラー。

    ですが最後の行でエラーになってしまいます。。。。

    エラー 1 'System.Windows.Media.Media3D.Point3DCollection' に 'Item' の定義が含まれておらず、
    型 'System.Windows.Media.Media3D.Point3DCollection' の最初の引数を受け付ける拡張メソッドが見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足しています。

    ヘルプには、Point3DCollection.Item プロパティ があるんですが
    コード上でそんな定義ないぞ
    と怒られてしまいました・・・。


    「明示的な実装」というのが必要なのでしょうか??
    2010年1月29日 1:40
  • えムナウ様

    お返事有難う御座います。

    参考ページ拝借させていただきました。

    継承階層を参考に、以下のようにキャストしました。
    MeshGeometry3D myMeshGeometry3D = (MeshGeometry3D)myGeometryModel3D.Geometry;
    Point3DCollection myPoint3DCollection = myMeshGeometry3D.Positions;
    Point PointMy3D = myPoint3DCollection.Item(0); ←エラー。

    ですが最後の行でエラーになってしまいました。

    エラー 1 'System.Windows.Media.Media3D.Point3DCollection' に 'Item' の定義が含まれておらず、
    型 'System.Windows.Media.Media3D.Point3DCollection' の最初の引数を受け付ける拡張メソッドが見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足しています。

    ヘルプには、Point3DCollection.Item プロパティ があるんですが
    コード上でそんな定義ないぞ
    と怒られてしまいました・・・。

    確かにIDE上で
    Point PointMy3D = myPoint3DCollection
    まで入力し、最後に.(ドット)を押しても入力補完の中にItem プロパティ が表示されていません。。。

    ヘルプにはあるのに・・・。

    何でなんでしょう????

    「明示的な実装」というものと関係があるのでしょうか?
    2010年1月29日 1:45
  • 引数を取るプロパティは、C# では"インデクサ"で表現します。
    インデクサに割り当てられているプロパティ名はインデクサや"既定のプロパティ"をサポートしていない言語用のものです。
    2010年1月29日 1:59
  • >Point PointMy3D = myPoint3DCollection.Item(0); ←エラー。
    単純ミスだと思いますが、メソッド呼び出しになっていますよw

    えムナウ@わんくま同盟 Microsoft MVP Visual Studio C# Since 2005/01-2010/12
    2010年1月29日 6:11
  • Hongliang 様

    アドバイスいただきました"インデクサ"、"既定のプロパティ"で
    色々調べてみました。
    おかげで実装出来ました。

    有難うございました!
    2010年2月1日 13:39
  • えムナウ様

    ご指摘有難うございます。

    ()ではなく、[]でしたね(^^;)

    おかげで実装できました。

    有難うございました!
    2010年2月1日 13:40