在VB.NET.XNA中使用Farseer Physics进行光线投射缺失检测

在VB.NET.XNA中使用Farseer Physics进行光线投射缺失检测,vb.net,xna,physics,farseer,Vb.net,Xna,Physics,Farseer,我正在使用光线投射来确定绳索接头的锚定位置。通过使用一些简单的绘制调用,我可以看到在光线投射返回点处可靠地创建了ropejoint。我的问题在于返回点。它偶尔会穿过身体,返回相对边界上的一个点,有时在身体内部。当它这样做时,它似乎总是失败,也就是说,如果我投射一条反复通过的光线,它会继续通过并返回相同的错误点。这让我相信我的身体有问题。我正在使用TextureToBody转换器处理相关的实体 另一个较小的问题是,我必须从我的关节位置的每个方向减去10/64,以使其准确连接。我不知道为什么会这样。

我正在使用光线投射来确定绳索接头的锚定位置。通过使用一些简单的绘制调用,我可以看到在光线投射返回点处可靠地创建了ropejoint。我的问题在于返回点。它偶尔会穿过身体,返回相对边界上的一个点,有时在身体内部。当它这样做时,它似乎总是失败,也就是说,如果我投射一条反复通过的光线,它会继续通过并返回相同的错误点。这让我相信我的身体有问题。我正在使用TextureToBody转换器处理相关的实体

另一个较小的问题是,我必须从我的关节位置的每个方向减去10/64,以使其准确连接。我不知道为什么会这样。(64像素=1米是我使用的转换率)

光线投射法:

    Private Sub castRay(startPoint As Vector2, direction As Vector2)
        direction *= 25
        direction.Y = (-direction.Y)
        world.RayCast(Function(fixture As Fixture, point As Vector2, normal As Vector2, fraction As Single)
                          Dim body As Body = fixture.Body

                          ropeContactFixture = fixture
                          ropeContactPoint = point
                          ropeJoint = New RopeJoint(Me.body, fixture.Body, New Vector2(0, 0), point - ropeContactFixture.Body.Position - (New Vector2(10, 10) / 64))
                          Return 0
                      End Function, startPoint, startPoint + direction)
    End Sub

基于我对Farseer的使用,您应该列出RayCast返回的所有点,然后按距离对它们进行排序

摘自Farseers代码-

     Ray-cast the world for all fixtures in the path of the ray. Your callback
     controls whether you get the closest point, any point, or n-points.
     The ray-cast ignores shapes that contain the starting point.

     Inside the callback:
     return -1: ignore this fixture and continue
     return 0: terminate the ray cast
     return fraction: clip the ray to this point
     return 1: don't clip the ray and continue
因此,利用这些知识,您应该能够沿着光线绘制点列表,找到最近的点,然后制作绳索

作为旁注,我不确定为什么要反转
方向.Y
,但您应该确保这是您打算做的