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が必要だと思いますか?