2017-05-21 1 views
0

저는 방금 pyBox2D로 게임을 시작했으며, 위로 내려가는 게임에서 주위를 둘러보기 위해 raycasting을했습니다. 이는 http://ncase.me/sight-and-light/과 유사합니다. 그러나 일부 광선은 물체에 던져지고이 물체를 계속 따라 다니며 그 뒤에있는 다른 물체를이 GIF에 표시합니다. http://imgur.com/C3Wyg4T
일부 광선은 물체를 통해 전달되지만 그 주위에서 동적 상자를 움직이면 볼 수 있습니다. 여기 pyBox2D raycasting이 제대로 작동하지 않습니다.

때로는

약 일 (틱)하지만 고장 내 raycasting 콜백

class lightRayCasting(b2RayCastCallback): 
    def __init__(self, point, ignoreBody): 
     b2RayCastCallback.__init__(self) 
     self.hit = False 
     self.point = point 
     self.ignoreBody = ignoreBody 

    def ReportFixture(self, fixture, point, normal, fraction): 
     if fixture.body != self.ignoreBody and fixture.filterData.groupIndex != -1 and not self.hit: 
      self.hit = True 
      self.point = point 
      return 0 
     return 1 

입니다 그리고 나는 raycasting

def lightRayCasting(self, position, **kwargs): 
    points = [] 
    for ray in range(kwargs.get("n", 100)): 
     angle = (ray/kwargs.get("n", 100) * 360 * (b2_pi/180)) 
     rayDirection = b2Vec2(math.sin(angle), math.cos(angle)) * kwargs.get("length", 10) 
     callback = lightRayCasting(rayDirection, ignoreBody = kwargs.get("ignoreBody", None)) 
     self.world.RayCast(callback, self.convertPosition(position), rayDirection) 
     points.append(self.convertPosition(callback.point, 1)) 
     if kwargs.get("debugDraw", False): 
      if callback.point != rayDirection: pygame.draw.aaline(self.surface, (255, 0, 0), position, self.convertPosition(callback.point, 1)) 
      else: pygame.draw.aaline(self.surface, (0, 255, 0), position, self.convertPosition(callback.point, 1)) 
    if not kwargs.get("debugDraw", False): 
     pygame.gfxdraw.filled_polygon(self.surface, points, (255, 255, 255)) 
     pygame.gfxdraw.aapolygon(self.surface, points, (255, 255, 255)) 
01,235을 부르고 곳이다

self.convertPosition은 Box2D가 작업 할 픽셀을 미터로 변환하는 중입니다. 나는 때때로 그것이 작동하지만 다른 때에는 작동하지 않는 이유를 알 수 없다. 레이캐스팅이 작동하려면 시체가 깨어 있어야합니까?

답변

0

콜백에서 분수를 받고 각 콜백 검사가 현재보다 작 으면 알기를 원하는 사람은 콜백의 지점과 교점을 맞춰야합니다.

def ReportFixture(self, fixture, point, normal, fraction): 
     if fraction < self.fraction: 
      if not fixture in self.ignoreFixtures: 
       if not fixture.filterData.groupIndex in self.ignoreIndexes: 
        self.hit = True 
        self.point = point 
        self.fraction = fraction 
     return 1 
관련 문제