我有一个非常简单的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)点...
我希望一切都有道理,感谢您提供任何帮助
标记
答案 0 :(得分:0)
我认为你所描述的实际上是两件事:
射线投影:在2D表示(即屏幕)上给出一个生命点,将射线从该点投射到场景中。这也称为“Unproject”,因为它依赖于反转原始屏幕变换矩阵并选择一些最小和最大“深度”值。
Ray / Mesh hit intersection:给定Ray和Mesh,找到他们相遇的地方。略微概括的变体是Ray / Sphere交点Ray-Sphere Intersection
看看这家伙的博客,他有我认为你需要的所有信息: Daniel Lehenbauer's Blog