在WPF中获取Point3D相对于Mesh

时间:2009-12-13 02:05:04

标签: wpf 3d

我有一个非常简单的3D场景,大致是这样构建的:

<Viewport3D>
  <ModelVisual3D>
    <ModelVisual3D.Content>
        <Model3DGroup x:Name="Group1">
          <GeometryModel3D x:Name="m1">...</GeometryModel3D>
        </Model3DGroup>
        <Model3DGroup x:Name="Group2">
          <GeometryModel3D x:Name="m2">...</GeometryModel3D>
        </Model3DGroup>
        <Model3DGroup x:Name="Group3">
          <GeometryModel3D x:Name="m3">...</GeometryModel3D>
        </Model3DGroup>
    </ModelVisual3D.Content>
  </ModelVisual3D>
</Viewport3D>

基本上每个GeometryModel3D都有自己的Mesh,Transforms等......

当我在Viewport3D上进行测试时,我所得到的只是我点击时点击的3D空间点。我真正追求的是我在3D空间中击中的网格上的点(不是网格上的单个点,而是Point3D)。

我的目标是在用户点击的确切位置为点击的网格添加新素材。如果我只能访问相对于Viewport3D的Point3D(因为网格上的所有变换等等),我不能这样做。

一个例子可能是m1 Geometry是一个像形状一样的矩形,有一些轻微的旋转并向上变换Y轴,所以它在屏幕的顶部。

当我点击网格的非常底部时,我想获得相对于该网格的局部坐标空间的X-Y(此处不需要Z)点...

我希望一切都有道理,感谢您提供任何帮助

标记

1 个答案:

答案 0 :(得分:0)

我认为你所描述的实际上是两件事:

  1. 射线投影:在2D表示(即屏幕)上给出一个生命点,将射线从该点投射到场景中。这也称为“Unproject”,因为它依赖于反转原始屏幕变换矩阵并选择一些最小和最大“深度”值。

  2. Ray / Mesh hit intersection:给定Ray和Mesh,找到他们相遇的地方。略微概括的变体是Ray / Sphere交点Ray-Sphere Intersection

  3. 看看这家伙的博客,他有我认为你需要的所有信息: Daniel Lehenbauer's Blog