차단의 벡터를 계산하는 방법은 무엇입니까?


11

2 차원 공간과 1 개의 친숙한 우주선이 여전히 존재한다면, 한 명의 적이 실제 위치, 속도 및 방향으로 알려진 친선으로 직접 이동하지 않습니다.

친선은 적과 싸우기 위해 사격장으로 들어가기를 원합니다.

실제로 저는 실제 위치 이동 선박에 직접 벡터를 설정하고 매 프레임마다 다시 계산하여 일종의 "둥근"비행 경로를 만듭니다.

내가 원하는 것은 발사 거리에 도달했을 때 적의 위치에 대한 직접적이고 직선적 인 경로를 설정하는 것입니다.

첫 번째 "간단한"구현으로서 친구가 빠른 속도로 0에서 최대 속도를 낼 수 있다고 가정하면 충분합니다.

바람직한 구현은 친구의 가속 기능을 고려하고 속도로 인해 차단이 불가능한시기를 아는 것입니다. 정지 상태뿐만 아니라 모든 시작 속도에서 작동해야합니다. 제동을 고려하더라도 더할 나위가 있습니다 (주어진 우주에서 광속으로 전투하는 것은 에너지 비효율적입니다)

답변:


5

내가 당신의 질문을 이해한다면, 당신은 배가 목표물을 조종하는 것이 아니라 목표물을 가로채는 직선으로 비행하기를 원합니다. 나는 기본적으로 타워의 총알이 동일한 타워 방어 게임을 만들고 있는데, 타워는 총알이 속도 / 방향을 변경하지 않는 한 움직이는 대상을 가로 챌 수 있도록 총을 발사하려고합니다. 내가 풀었던 방법은 2 차 방정식을 사용하는 것이 었습니다. 의사 코드는 다음과 같습니다.

Vector totarget =  target.position - tower.position;

float a = Vector.Dot(target.velocity, target.velocity) - (bullet.velocity * bullet.velocity);
float b = 2 * Vector.Dot(target.velocity, totarget);
float c = Vector.Dot(totarget, totarget);

float p = -b / (2 * a);
float q = (float)Math.Sqrt((b * b) - 4 * a * c) / (2 * a);

float t1 = p - q;
float t2 = p + q;
float t;

if (t1 > t2 && t2 > 0)
{
    t = t2;
}
else
{
    t = t1;
}

Vector aimSpot = target.position + target.velocity * t;
Vector bulletPath = aimSpot - tower.position;
float timeToImpact = bulletPath.Length() / bullet.speed;//speed must be in units per second

나는 이것이 잘 작동한다는 것을 알았습니다. 나는 샷에 대한 충돌 감지가 필요하지 않습니다 ... 나는 그 요인들이 꾸준히 유지되는 한 목표의 거리 / 방향 / 속도에 관계없이 황소 눈을 때리는 모든 샷을 셀 수있었습니다.


귀하의 설명에서 이것은 내가 찾고있는 것 같습니다. 최소 속도로 최대 가속을 가정하는 가장 쉬운 방법입니다. 나는 저녁에 이것을 자세히 살펴볼 것이다. Vector.Dot가 벡터의 내적을 벡터로 반환한다고 가정합니까?
NobbZ

흠 ... 나는 지금 루비로 이것을했지만 뭔가 잘못된 것 같습니다. 내가 시도 할 때마다 sqrt의 표현식이 부정적 것으로 평가되어 범위를 벗어나기 때문에 예외가 발생합니다. 어떻게 처리 할 수 ​​있습니까? 질문에 미안하지만, 나는 이것을 사용할 수 있지만 누군가 나에게 조언을 줄 때까지 여기에서 conepts를 이해하지 못합니다.
NobbZ

예를 들면 다음과 같습니다. amazon.com/…
Steve H

1
이것이 도움이되는지 모르겠지만 여기에 동일한 것을 달성하는 파이썬 코드가 있습니다. moddb.com/mods/wicmw/tutorials/…
Steve H

좋아, 나는 여전히 구멍 수학을 이해하지 못하지만 파이썬 코드의 thx는 문서가 나에게 sqrt 안에 부정적 가치가 있다면 내 친구가 천천히 따라 잡을 것이라고 말했다. 테스트 값을 조정 한 후 결과가 나타납니다. 도와 주셔서 감사합니다.
NobbZ

6

스티어링 행동을 살펴 보는 것이 좋습니다. 특히 추구 . 소스 코드는 OpenSteer 구현 에서 찾을 수 있거나 " 예를 들어 프로그래밍 게임 AI "와 같은 책을 찾을 수 있습니다 (ISBN 13 : 978-1556220784)


추구는 목표에 대한 지식이 필요한 것으로 보이며 목표를 향해 나아가고 있습니다. 나는 지금 적의 위치를 ​​알고 속도와 방향을 알고 있습니다. 이제 적에게 가능한 빨리 목표를 향한 길을 가로 막아야 할 방향을 알고 싶습니다. 처음에 가속을 무시하기 전에 언급했듯이, 이것은 실제 버전에 비해 처리 시간을 많이 절약 할 수 있습니다 ... 새 모델을 사용하면 적들이 "코스 변경"이벤트를 발생시킬 때만 재 계산해야합니다. 내가 지금하는 것처럼 이벤트를 이동했습니다.
NobbZ

그렇습니다, 당신이 묘사하는 것은 추구입니다. 그것은 목표를 모른다 .. 그것은 "적"현재 위치, 속도 및 방향에 기초하여 예측을한다
bummzack

그런 다음 설명을 이해하지 못했습니다. 내일 자세히 살펴 보겠습니다.
NobbZ

방금 몇 분 전에 문서를 읽었으므로 추구하는 것이 내가 찾는 것이 아닙니다. 그것은 다음 프레임의 위치를 ​​목표로한다는 점을 제외하고는 실제로 구현과 같습니다. 프레임마다 새 코스를 다시 계산해야하며 코스는 약간의 곡선을 초래합니다. 그러나 내가 원하는 것은 적을 만나기 전까지는 속도 나 코스를 바꾸지 않는다고 가정하는 직접 선입니다. 이것이 여전히 명확하지 않은 경우 나는 퇴근 후 내가 원하는 것을 그립니다. 그러나 어쨌든 링크 주셔서 감사합니다. 프로젝트의 다른 곳에서 이것을 사용할 수 있다고 생각합니다.
NobbZ

@NobbZ 답변이 도움이되지 않아 죄송합니다. "속도 나 적의 변화가있는 경우 모든 계산을 반복해야한다"는 말이 잘못 될 수 있기 때문에 그에 따라 질문을 편집해야 할 수도 있습니다. "추적"스티어링 행동.
bummzack
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.