我正在使用光线投射来确定绳索的锚位置。通过使用一些简单的绘制调用,我可以看到在光线投射返回的点上可靠地创建了ropejoint。我的问题在于回归点。它偶尔穿过一个身体,在相对的边界上返回一个点,有时在身体内部。它似乎始终失败,也就是说,如果我投射一条反复通过的光线,它会继续通过并返回相同的错误点。这让我相信我的身体有问题。我正在使用TextureToBody转换器来处理相关的物体。
另一个较小的问题是,我必须从关节位置向每个方向减去10/64以使其准确附着。我不知道为什么会这样。 (64pixels = 1米是我正在使用的转换率)
Raycast方法:
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
答案 0 :(得分:0)
根据我对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
因此,利用这些知识,您应该能够沿着光线制作一个点列表,找到最近的点,然后制作绳索。
作为旁注,我不确定你为什么要反转direction.Y
,但你应该确保这是你打算做的。