【问题标题】:How to raycast with a given angle?如何以给定的角度进行光线投射?
【发布时间】:2016-08-16 00:09:56
【问题描述】:

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

【问题讨论】:

    标签: libgdx box2d raycasting


    【解决方案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

    【讨论】:

      【解决方案2】:

      您应该旋转oberserverAngle 向量,因为您想从oberserverAngle 获取左侧 字段,并从中获取右侧 字段。 p2 在这里似乎毫无意义。

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

      【讨论】:

        【解决方案3】:
        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.
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-01-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多