绿点是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);
你正在旋转错误的向量。这应该这样做:
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
您应该旋转oberserverAngle
向量,因为您想要从oberserverAngle
左侧获取字段,并从右侧获取该字段。 p2
在这里似乎毫无意义。
Vector p3 = oberserverAngle.rotate(0.5f);
Vector p4 = oberserverAngle.rotate(-0.5f);
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.