Raycast отсутствующих обнаружений с использованием Farseer Physics в VB.NET.XNA - PullRequest
1 голос
/ 17 декабря 2011

Я использую raycast для определения местоположения якоря канатной дороги.Используя несколько простых вызовов отрисовки, я вижу, что канатный переход надежно создается в точке, где возвращается Raycast.Моя проблема заключается в точке возврата.Он иногда проходит через тело, возвращая точку на противоположной границе, а иногда и внутри тела.Кажется, что он постоянно терпит неудачу, то есть, если я бросаю луч, который проходит несколько раз, он продолжает проходить и возвращает ту же самую неправильную точку.Это приводит меня к мысли, что есть проблема с моими телами.Я использую конвертер TextureToBody для рассматриваемых тел.

Другая, менее важная проблема заключается в том, что мне нужно вычитать 10/64 в каждом направлении из положения моих суставов, чтобы оно точно прикреплялось.Я понятия не имею, почему это происходит.(64пикселя = 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

1 Ответ

0 голосов
/ 16 ноября 2012

Исходя из моего использования 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, но вы должны убедиться, что именно это вы и собирались сделать.

...