2016-08-16 233 views
0

enter image description here如何以给定角度进行光线投射?

绿色点是矢量p1,红色点是矢量p2。我可以使用p2.sub(p1).angle()方法访问光线角度。

考虑:

float oberserverAngle = p2.cpy().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是不对的,我缺少什么?

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拿到野外左边从这个右侧你还是旋转oberserverAngle载体。这里p2似乎没有意义。

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

方法返回的角度在正Y轴和0之间360.

我建议你使用

float oberserverAngle = p2.angle(p1); 

此方法将t的回复角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.