2016-07-23 6 views
0

나는 새로운 시각을 필요로하는 2D 측면 뷰어를 가지고있다. 저는 현재 목표에 대해 연구 중이며 부분적으로 작동합니다 : 총구 속도가 알려져 있고, 중력이 알려져 있고 목표물까지의 거리가 알려져 있습니다. 여기 SE와 위키 피 디아에 다양한 소스를 모두 사용하여, 나는 발사체 속도 시작 벡터를 계산하기 위해 다음과 같은 방법을 마련했습니다방향에 상관없이 Math.atan()이 다시 작동하도록 다시 작성하기

public Vector2 calculateAim(Vector2 pos, Unit target) { 
    // Check if previous calculation can be recycled 
    if (target.equals(lastTarget)) 
     return lastAim.cpy(); 
    lastTarget = target; 

    double v = RifleBullet.projectileSpeed; // Muzzle velocity 
    double g = Settings.gravity.y;   // Gravity, positive value 
    double x = offset.x;     // x distance to target. Negative if towards left 
    double y = offset.y;     // y distance to target. Negative if lower 

    double theta = Math.atan(((v * v) - Math.sqrt((v*v*v*v) - (g*(g*(x*x) + 2*y*(v*v)))))/(g * x)); 

    Vector2 aim = new Vector2(-(float)Math.cos(theta), (float)Math.sin(theta)); 
    aim.nor(); 
    aim.scl((float)RifleBullet.projectileSpeed); 
    lastAim = aim.cpy(); 
    return aim; 
} 

위가 부분적으로 작동합니다 맨 오른쪽 사람이 제대로 목표로합니다. 그러나 왼쪽에 서있는 사람은 계속 잘못된 방향으로 발사합니다. Y 구성 요소가 올바르지 만 X 구성 요소가 아주 간단하게 반전 된 것처럼 보입니다. 나는 세타 계산 한 후이를 추가하는 경우 :

if (side.contains("left")) 
    angleInRadians += Math.PI; 

... 제대로 둘 불을하지만, 전장에 대한 자세한 단위가있을 것 같은 장기적으로 실행 가능하지, 그리고 내가 할 때 문제를 일으킬 될거에요 그 시점까지.

저는 삼각법 계산의 가상 삼각형이 어떻게 움직이는지를 확인할 필요가 없으므로 문제의 원인은 Math.atan() 일 수 있다고 생각합니다.

왼쪽/오른쪽/위/아래에 관계없이 제대로 작동하도록 메소드를 조정해야합니까?

+4

atan2에 읽기. – Tenfour04

답변

3

Tenfour04는 매우 도움이된다고 말했습니다. 아마도 Math.atan2(y,x) 대신 Math.atan(y/x) 대신

을 사용하는 대신 y와 x를 별도의 인수로 사용하십시오. 이것은 atan2가 5/2와 -5/-2 같은 것의 차이를 안다는 것입니다. 정상 atan하려면 그들은 둘 다 2.5

+0

매력처럼 작동하고 이유를 설명해 주셔서 감사합니다! – Jarmund

+0

도움이 된 것을 기쁘게 생각합니다! – Davis