我需要执行直线和三角形网格的交集。
如果我可以使用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