HitTest和RayMeshGeometry3DHitTestResult以编程方式在无窗口控制台应用程序

时间:2018-01-19 16:51:48

标签: c# wpf 3d visualtreehelper system.windows.media

我需要执行直线和三角形网格的交集。

如果我可以使用VistualTreeHelper.HitTest方法返回RayMeshGeometry3DHitTestResult结构,那么该操作将非常方便地执行。

问题是:VisualTreeHelper.HitTest需要VisualPoint,而我只有Visual3D Geometry属性为MeshGeometry3D }和Ray自定义类,由Point3D(其来源)和Vector3D(其方向)组成。

所以我想要的是:

Point3D intersection = GetIntersection(MeshGeometry3D mesh, Point3D rayOrigin, Vector3D rayD

irection);

但框架为我提供了:

HitTestResult result = VisualTreeHelper.HitTest(model, point);
if (result is RayMeshGeometry3DHitTestResult hitTestResult)]
{
    Point3D intersection = result.PointHit;
}

根据我所阅读的内容,通常会将所需的Visual3D放入ViewPort3DVisual内,Point会通过视口转换以某种方式转换为光线,或类似的东西。

由于我没有任何Window,所以我可以将ViewPort3D放入其中,等等,我对如何使用这些助手来获取我需要的东西一无所知。

或者,如果有一个库可以做到这一点,我很乐意使用它而不是WPF的3D方法。

1 个答案:

答案 0 :(得分:1)

执行此操作的代码比回复中的内容要多

https://github.com/charlierix/AsteroidMiner/tree/master/Src/HelperClassesWPF

查看Math3D.cs

GetIntersection_Hull_Ray()
GetIntersection_Triangle_Ray()

请注意,在GetIntersection_Plane_Line()中,第三行是lineDir.Normalize()。这是我已注释掉的错误,但尚未推送到github

构建此功能的原始来源来自:

Author: DigiBen DigiBen@GameTutorials.com
Program: PolygonCollision
Date: 7/11/01