1

Viewport3Dでモデルをクリックして、モデルの3D座標を見つけたいと思います。変換された座標が必要です。

Viewport3Dにこれがあるとします。

<ModelVisual3D x:Name="yellowTriangle">
 <ModelVisual3D.Content>
  <GeometryModel3D>
   <GeometryModel3D.Geometry>
    <MeshGeometry3D Positions="-1,0,0 0,1,0 1,0,0" TriangleIndices="0,2,1"/>
   </GeometryModel3D.Geometry>
   <GeometryModel3D.Transform>
    <Transform3DGroup>
     <TranslateTransform3D OffsetX="10" OffsetY="20" OffsetZ="-10"/>
     <ScaleTransform3D ScaleX="1" ScaleY="1.5" ScaleZ="1"/>
     <RotateTransform3D>
      <RotateTransform3D.Rotation>
       <AxisAngleRotation3D Angle="20" Axis="1 0 0"/>
      </RotateTransform3D.Rotation>
     </RotateTransform3D>
     <TranslateTransform3D OffsetX="0" OffsetY="0" OffsetZ="0"/>
    </Transform3DGroup>
   </GeometryModel3D.Transform>
   <GeometryModel3D.Material>
    <DiffuseMaterial Brush="Yellow"/>
   </GeometryModel3D.Material>
  </GeometryModel3D>
 </ModelVisual3D.Content>

VisualTreehelper.HitTestを使用して、MeshGeometry3DとPoint3Dの位置を取得できます。ただし、元のPoint3D(-1,0,0など)しか取得できません。変換されたPoint3Dを取得するにはどうすればよいですか?

Ericsinkの自動ズームの発言によると、次のようにする必要があります。

すべてのMeshGeometry3Dからビジュアルツリーを上に移動し、途中で見つかったすべてのTransform>オブジェクトの適用を停止します。

しかし、私は成功しません。MeshGeometry3DのModelVisual3Dにアクセスする方法はありますか?

または、これらの変換されたPoint3Dに到達するためのより高速な方法ですか?


最もヒットしたコードの追加:

    private void Viewport3D_MouseDown(object sender, MouseButtonEventArgs e)
    {
        RayMeshGeometry3DHitTestResult rayMeshResult = (RayMeshGeometry3DHitTestResult)
            VisualTreeHelper.HitTest(mainViewport, e.GetPosition(mainViewport));

        if (rayMeshResult.MeshHit is MeshGeometry3D)
        {
            MeshGeometry3D mesh = (MeshGeometry3D)rayMeshResult.MeshHit;
            foreach (Point3D point3d in mesh.Positions)
            {
                MessageBox.Show("original point: " + point3d.ToString());
                Point3D p = new Point3D();
                // Using the Modelhit now because the meshhit doesn't contain a transform
                Transform3D trans = rayMeshResult.ModelHit.Transform;
                p = trans.Transform(point3d);
                MessageBox.Show("transformed point: " + p.ToString());
            }
        }

    }

最もヒットしたコードをクリーンアップしたところ、上記の「yellowTriangle」で動作します。この問題は、Daniel Lehenbauerの拡張Visual3dに基づく派生Rectangle3Dコードでのみ発生します: " http://blogs.msdn.com/danlehen/archive/2005/10/16/481597.aspx "

このようなものは私に正しい変換を与えません:

        <primitive3D:Rectangle3D>
            <primitive3D:Rectangle3D.Material>
                <DiffuseMaterial Brush="Green"/>
            </primitive3D:Rectangle3D.Material>
            <primitive3D:Rectangle3D.Transform>
                <Transform3DGroup>
                    <TranslateTransform3D OffsetX="0" OffsetY="0" OffsetZ="0"/>
                    <ScaleTransform3D ScaleX="1" ScaleY="1" ScaleZ="10"/>
                    <RotateTransform3D>
                        <RotateTransform3D.Rotation>
                            <AxisAngleRotation3D Angle="30" Axis="0 1 0"/>
                        </RotateTransform3D.Rotation>
                    </RotateTransform3D>
                    <TranslateTransform3D OffsetX="0" OffsetY="0" OffsetZ="0"/>
                </Transform3DGroup>
            </primitive3D:Rectangle3D.Transform>

        </primitive3D:Rectangle3D>

派生したrectangle3Dには、変換用のDependencyPropertyが必要だと思いますか?

4

2 に答える 2

0

これは、あなたが望むものを得るのに役立つかもしれません - Transform3DGroup.Transform

TransformGroups 変換を使用してポイントまたはポイントのセットを変換できます。この場合、使用する Transform3DGroup は GeometryModel3D.Transform プロパティに含まれています。

于 2009-09-07T20:50:16.020 に答える
0

hitTesting を実行すると、ModelVisual3D の変換マトリックスが

Transform3D transformOnModelVisual3D = rayMeshResult.VisualHit.Transform;

これは、オンに設定された変換に対応します。

<ModelVisual3D x:Name="yellowTriangle">
 <ModelVisual3D.Transform>
  <RotateTransform3D>
    <RotateTransform3D.Rotation>
     <AxisAngleRotation3D Angle="60" Axis="0 1 0"/>
    </RotateTransform3D.Rotation>
  </RotateTransform3D>
 </ModelVisual3D.Transform>
....
</ModelVisual3D>

そして、別の変換は次の場所にあります

Transform3D transformOnGeometryModel3D = rayMeshResult.ModelHit.Transform;

対応: ...

<ModelVisual3D.Content>
 <GeometryModel3D>
  <GeometryModel3D.Geometry>
   <MeshGeometry3D Positions="-1,0,0 0,1,0 1,0,0" TriangleIndices="0,2,1"/>
  </GeometryModel3D.Geometry>
  <GeometryModel3D.Transform>
   <Transform3DGroup>
    <TranslateTransform3D OffsetX="-2" OffsetY="1" OffsetZ="-1"/>
   </Transform3DGroup>
  </GeometryModel3D.Transform>
 </GeometryModel3D>
</ModelVisual3D.Content>
于 2009-09-08T22:30:05.490 に答える