2016-08-16 33 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.