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



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

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

问题是:VisualTreeHelper.HitTest需要一个Visual和一个Point,而我只有一个Visual3D,其Geometry属性是一个MeshGeometry3D和一个由Point3D(它的起源)和一个Vector3D(它的方向)组成的Ray自定义类。

所以我想要的是:

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

勃起);

但是框架为我提供了:

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

从我所读到的内容来看,通常所需的Visual3D会放在ViewPort3DVisual内,并且Point会以某种方式通过视口变换转换为光线,或类似的东西。

由于我没有任何窗口,因此我可以在其中放置一个 ViewPort3D 等,因此我不知道如何使用这些帮助程序来获取我需要的东西。

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

执行此操作的代码比回复中的代码要多一点

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

最新更新