1

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

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

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

所以我想要的是:

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会放在 aViewPort3DVisual中,并且Point会通过视口变换或类似的东西以某种方式转换为射线。

由于我没有任何 Window 以便我可以将 ViewPort3D 放入其中等,所以我不知道如何使用这些帮助程序来获得我需要的东西。

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

4

1 回答 1

1

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

https://github.com/charlierix/Ast​​eroidMiner/tree/master/Src/HelperClassesWPF

查看 Math3D.cs

GetIntersection_Hull_Ray()
GetIntersection_Triangle_Ray()

请注意,在 GetIntersection_Plane_Line() 中,第三行是 lineDir.Normalize()。这是我注释掉的一个bug,但还没有推送到github

构建此函数的原始来源来自:

Author: DigiBen DigiBen@GameTutorials.com
Program: PolygonCollision
Date: 7/11/01
于 2018-10-30T03:27:36.277 回答