2016-08-16 14 views
0

enter image description here주어진 각도로 레이캐스팅하는 방법은 무엇입니까?

녹색 점은 벡터 p1이고 빨간색 점은 벡터 p2입니다. p2.sub(p1).angle() 메서드를 사용하여 광선 각도에 액세스 할 수 있습니다.

을 감안할 때 :

RayCastCallback callback = new RayCastCallback() { 

    @Override 
    public float reportRayFixture(Fixture fixture, Vector2 point, Vector2 normal, float fraction) { 
    }   

} 

world.rayCast(callback, p1, p2);

나는이 작업을 수행 할 때 이제 FOV를 잘 작성하지

float oberserverAngle = p2.cpy().sub(p1).angle();

, 내가 무엇을 놓치고? 이에서 오른쪽에 oberserverAngle에서 왼쪽에 필드 를 얻을 원하기 때문에

shape.line(p1, p2) 
Vector p3 = p2.cpy().setAngle(oberserverAngle * 0.5f); 
Vector p4 = p2.cpy().setAngle(-oberserverAngle * 0.5f); 
shape.line(p1, p3); 
shape.line(p1, p4); 

답변

1

잘못된 벡터를 회전하고 있습니다. 이것은을 수행해야합니다

Vector2 angleVec = p2.cpy().sub(p1); 

shape.line(p1, p2) 
Vector p3 = p1.add(angleVec.cpy().setAngle(oberserverAngle * 0.5f)); 
Vector p4 = p1.add(angleVec.setAngle(-oberserverAngle * 0.5f)); 
shape.line(p1, p3); 
shape.line(p1, p4); 

은 결과를 달성하기 위해 귀하의 이미지에서와 같이 회전 angleVec의

1

당신은 오히려 oberserverAngle 벡터를 회전한다. p2은 여기서는 의미가없는 것으로 보입니다.

Vector p3 = oberserverAngle.rotate(0.5f); 
    Vector p4 = oberserverAngle.rotate(-0.5f); 
1
p2.cpy().sub(p1).angle(); 

방법은 긍정적 인 y 축 방향으로 각도를 반환하고 0과 사이에 스트레치해야 할 것 360

내가 당신이 t 사이의 각도를 반환합니다

float oberserverAngle = p2.angle(p1); 

이 방법을 사용하는 것이 좋습니다 o -180과 +180 사이의 양의 y 축 방향 벡터.

그리고 p3 및 p4 각도를 찾으려면 0.5f를 곱하면 안됩니다. fov/2f 각도를 추가하기 만하면됩니다.

float oberserverAngle = p2.angle(p1); 
float fov=120f; 

shape.line(p1, p2) 
p2.sub(p1);//p2 became ray vector now you can set angle correctly. 
Vector p3 = p2.cpy().setAngle(oberserverAngle + fov/2f).add(p1); // added p1 now for corrected position 
Vector p4 = p2.cpy().setAngle(oberserverAngle - fov/2f).add(p1); 
shape.line(p1, p3); 
shape.line(p1, p4); 
p2.add(p1);// turning back to p2 for later usages.