2016-08-16 2 views
0

enter image description hereКак raycast с заданным углом?

Зеленая точка - это вектор 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); 

Для достижения результата, как показано в изображении вы должны Stretch Метод повернутого angleVec в

1

Вы должны достаточно повернуть oberserverAngle вектор, так как вы хотите, чтобы получить поле на левом от oberserverAngle и на праве от этого. Здесь p2 здесь не имеет смысла.

Vector p3 = oberserverAngle.rotate(0.5f); 
    Vector p4 = oberserverAngle.rotate(-0.5f); 
1
p2.cpy().sub(p1).angle(); 

возвращает угол к положительной оси у и между 0 и 360.

я предлагаю вам использовать

float oberserverAngle = p2.angle(p1); 

Этот метод будет возвращать угол между т o вектор к положительной оси 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. 
Смежные вопросы