如何以给定角度进行光线投射?

How to raycast with a given angle?

绿点是Vector p1,红点是Vector 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);

现在当我这样做的时候,视野不对,我错过了什么?

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);

您应该旋转 oberserverAngle 向量,因为您希望从 oberserverAngle 获得左侧 的字段 由此而来。 p2 在这里似乎没有意义。

    Vector p3 = oberserverAngle.rotate(0.5f);
    Vector p4 = oberserverAngle.rotate(-0.5f);

你旋转了一个错误的向量。应该这样做:

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's

p2.cpy().sub(p1).angle();

方法 returns 朝向正 y 轴的角度,介于 0 和 360 之间。

我建议你使用

float oberserverAngle = p2.angle(p1);

此方法将 return 向量与正 y 轴之间的角度介于 -180 和 +180 之间。

如果你想找到 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.