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

问题描述 投票:0回答:3

enter image description here

绿点是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);

现在,当我这样做时,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);
libgdx box2d raycasting
3个回答
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);

该方法将向矢量朝向正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.
© www.soinside.com 2019 - 2024. All rights reserved.