我想点击Viewport3D中的模型并找到模型的三维坐标。我要转换坐标。
假设在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位置。然而,我只能得到原来的点3D:-1,0,等等。我如何得到转换点3D的?
根据埃里克森氏自动变焦的意见,我应该:
从每个MeshGeometry3D走上可视化树,停下来应用它沿途找到的每个Transform >对象
但我没有成功。有人有办法到达ModelVisual3D of a MeshGeometry3D吗?
或者用更快的方式到达那些改造过的点3D?
添加最成功的代码:
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的扩展Rectangle3D:"http://blogs.msdn.com/danlehen/archive/2005/10/16/481597.aspx“的导出的Visual3d代码中。
像这样的东西不能给我正确的转换:
<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?
发布于 2009-09-07 20:50:16
这可能会帮助你得到你想要的-- Transform3DGroup.Transform
它将允许您使用TransformGroups转换转换一个或多个点,在您的示例中,要使用的Transform3DGroup包含在GeometryModel3D.Transform属性中。
发布于 2009-09-08 22:30:05
执行hitTesting时,可以在
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>https://stackoverflow.com/questions/1390861
复制相似问题