2012-09-10 4 views
2

Descent Freespace를 기억하는 사람들에게는 비 원산 미사일이나 레이저를 쏠 때 적을 겨냥 할 수있는 좋은 기능이 있습니다. 움직이는 표적을 치기 위해 어디에서 쏠 것인가를 말하던 쫓아 오는 배.3d 게임에서 목표물을 "촬영"하는 알고리즘

답변을 사용하여 AI algorithm to "shoot" at a target in a 2d game에서 시도했지만 2D 용이므로 적응하려고했습니다.

먼저 계산을 분해하여 XoZ 평면의 교차점을 풀고 x와 z 좌표를 저장 한 다음 XoY 평면의 교차점을 해결하고 마지막 xyz에 y 좌표를 추가 한 다음 클립 공간으로 변환하고 놓습니다. 그 좌표의 텍스처. 물론 그것이해야 할 것처럼 작동하지 않습니다. 그렇지 않으면 질문을 게시하지 않았을 것입니다.

XoZ 평면에서 x를 찾은 후 XoY에서 x가 동일하지 않으므로 뭔가 잘못되었습니다.

float a = ENG_Math.sqr(targetVelocity.x) + ENG_Math.sqr(targetVelocity.y) - 
      ENG_Math.sqr(projectileSpeed); 
    float b = 2.0f * (targetVelocity.x * targetPos.x + 
      targetVelocity.y * targetPos.y); 
    float c = ENG_Math.sqr(targetPos.x) + ENG_Math.sqr(targetPos.y); 
    ENG_Math.solveQuadraticEquation(a, b, c, collisionTime); 

첫 targetVelocity.y 실제로 targetVelocity.z (targetPos 대해 동일)과 실제로 targetVelocity.y 년대 초 시간이다.

XoZ 후 최종 위치

crossPosition.set(minTime * finalEntityVelocity.x + finalTargetPos4D.x, 0.0f, 
       minTime * finalEntityVelocity.z + finalTargetPos4D.z); 

crossPosition.y = minTime * finalEntityVelocity.y + finalTargetPos4D.y; 

2 개 평면으로 분리하여 좋은 산출 내 접근법 XOY 후

입니까? 3D의 경우 완전히 다른 접근 방식이 있습니까?

  • sqr()은 정사각형이 아니며 sqrt입니다. 혼동을 피할 수 있습니다. 그

    Abs(tp+t*tv) == t*pv 
    

    해결을 의미

+0

여기에 중력이 없기를 바랍니다 ... – Eric

답변

1

당신은 시간 t_0 = 0(0,0,0)에있어, 속도 pv으로 발사체를 촬영하고 초기 위치 tp=(tpx,tpy,tpz) 시간 t에서 일정한 속도 tv=(tvx,tvy,tvz)이있는 대상을 공격하는 경우,

t = - (tp*tv ± sqrt((tp*tv)^2+(tp * tp)*(pv^2-tv*tv)))/(tv*tv-pv*pv) 

그래서 당신이에서 촬영해야합니다 t이 식 (TP의 * 텔레비젼은 TP와 TV의 스칼라 제품 등입니다) 위치 tp+t*tv. 그냥 뷰포트에 투영하고 거기에 십자선을 그립니다.

희망이 도움이됩니다.

+0

왜 'Abs'입니까? 'tp + t * tv == t * pv'가 일반적으로 사실이 아닌가? – Eric

+0

우리는 절대 값을 사용합니다. 왜냐하면 우리는 목표와 총격 자 간의 거리 * t * (총알이 그 시간에 명중하기 위해 총알이 이동 한 거리와 같아야 함) 사이의 거리 *를 계산하기 때문입니다. . –

+0

@Gareth Rees : 아, 문제가 있습니다.''pv'를 벡터로 읽습니다. – Eric

0

3D 케이스의 방정식은 I gave in the 2D case과 같습니다. 유일한 차이점은 사격 솔루션이 각도의 형태가 아니라는 것입니다. 3D 회전이 필요합니다. 그러나이 애플리케이션에서는 발사 솔루션이 필요하지 않으며 레티큘러를 어디에서 그려야하는지 알 필요가 있습니다.

타겟 위치 (A)에서하자 및 속도 VA로 이동하고, 사수가 위치 B에 고정 될 수 있고 : 간단한 경우 (즉시 회전 수 고정 사수)을 가지고 예를 들어

, 속도가 인 화재 총알은입니다. 시간 0에 총격을하게하십시오.총알은 시간이 t이되도록 | A - B + t VA | = ts. 이것은 t의 2 차 방정식으로 해결할 수 있어야합니다 (또는 해결 방법이 없다는 것을 결정해야합니다). 으로 결정 했으므로 이제 총알이 발사되는 세계 위치 (A + t VA)에 해당하는 화면 위치에 레티큘을 그릴 수 있습니다.

다른 경우는 2D와 유사합니다.

관련 문제