제 질문은 2D에서 두 벡터 사이의 최소 각도 방향을 만드는 것입니다. 나는 C++로 게임을 만들고 있는데, 장애물 중 하나가 열 찾기 미사일 발사기입니다. 나는 목표와 총알 사이의 벡터를 계산하고 벡터를 정규화 한 다음 속도로 곱하는 식으로 작업했습니다. 그러나, 나는 더 나은 그것을 만들기 위해이 수업으로 돌아오고 있습니다. 플레이어에 순간적으로 고정하는 대신, 총알 벡터가 특정 각도 (총알 벡터와 벡터 bulletloc-> 목표 사이의 각도) 내에있을 때만 플레이어가 원하는대로합니다. 그렇지 않으면 나는 천천히 목표물을 향해도 (degree)만큼 패닝하여 플레이어에게 그것을 피할 수있는 충분한 공간을 제공하기를 원합니다. 나는이 모든 것을했다 (vb.net 프로젝트에서 문제를 단순화하고, C++로 다시 작성한다). 그러나 가장 빠른 경로가 시계 반대 방향 일지라도 총알은 항상 목표를 향해 시계 방향으로 회전합니다. 그래서 문제는 회전을 적용 할 방향을 설정하여 가장 작은 각도를 커버합니다. 내가 가진두 벡터 사이의 최단 회전 방향
Function Rotate(ByVal a As Double, ByVal tp As Point, ByVal cp As Point, ByVal cv As Point)
'params a = angle, tp = target point, cp = current point, cv = current vector of bullet'
Dim dir As RotDir 'direction to turn in'
Dim tv As Point 'target vector cp->tp'
Dim d As Point 'destination point (d) = cp + vector'
Dim normal As Point
Dim x1 As Double
Dim y1 As Double
Dim VeritcleResolution As Integer = 600
tp.Y = VeritcleResolution - tp.Y 'modify y parts to exist in plane with origin (0,0) in bottom left'
cp.Y = VeritcleResolution - cp.Y
cv.Y = cv.Y * -1
tv.X = tp.X - cp.X 'work out cp -> tp'
tv.Y = tp.Y - cp.Y
'calculate angle between vertor to target and vecrot currntly engaed on'
Dim tempx As Double
Dim tempy As Double
tempx = cv.X * tv.X
tempy = cv.Y * tv.Y
Dim DotProduct As Double
DotProduct = tempx + tempy 'dot product of cp-> d and cp -> tp'
Dim magCV As Double 'magnitude of current vector'
Dim magTV As Double 'magnitude of target vector'
magCV = Math.Sqrt(Math.Pow(cv.X, 2) + Math.Pow(cv.Y, 2))
magTV = Math.Sqrt(Math.Pow(tv.X, 2) + Math.Pow(tv.Y, 2))
Dim VectorAngle As Double
VectorAngle = Acos(DotProduct/(magCV * magTV))
VectorAngle = VectorAngle * 180/PI 'angle between cp->d and cp->tp'
If VectorAngle < a Then 'if the angle is small enough translate directly towards target'
cv = New Point(tp.X - cp.X, tp.Y - cp.Y)
magCV = Math.Sqrt((cv.X^2) + (cv.Y^2))
If magCV = 0 Then
x1 = 0
y1 = 0
Else
x1 = cv.X/magCV
y1 = cv.Y/magCV
End If
normal = New Point(x1 * 35, y1 * 35)
normal.Y = normal.Y * -1
cv = normal
ElseIf VectorAngle > a Then 'otherwise smootly translate towards the target'
Dim x As Single
d = New Point(cp.X + cv.X, cp.Y + cv.Y)
a = (a * -1) * PI/180 'THIS LINE CONTROL DIRECTION a = (a*-1) * PI/180 would make the rotation counter clockwise'
'rotate the point'
d.X -= cp.X
d.Y -= cp.Y
d.X = (d.X * Cos(a)) - (d.Y * Sin(a))
d.Y = (d.X * Sin(a)) + (d.Y * Cos(a))
d.X += cp.X
d.Y += cp.Y
cv.X = d.X - cp.X
cv.Y = d.Y - cp.Y
cv.Y = cv.Y * -1
End If
Return cv
End Function
하나의 아이디어는 두 벡터의 베어링을 해결하는 것이었다과 차이가 큰 180도 이상이면 시계 방향으로 달리 회전 회전 : 당신이 시도하고 내가 설명하고 무엇을 볼 수 있도록 여기 내 코드입니다 시계 반대 방향으로 가면 어떤 아이디어라도 도움이 될 것입니다. 감사.
편집 :이 사이트는 매우 유용하다고 덧붙이고 싶습니다. 자주 다른 사람들이 제기 한 질문을 사용하여 자신의 문제를 해결하고 감사의 말을 전하고 싶습니다.
사이드 노트 :이 물건을 조금 캡슐화하기 위해 (또는 다른 사람의 것) 벡터 구조를 작성하면 코드를 읽고 수정하고 유지하는 것이 훨씬 쉬울 것입니다. – Cameron
예 벡터를 나타 내기 위해 점을 사용했습니다. 나는 그것을 VB에서 작업에 문제를 해결하기 위해 작성했습니다.내 주요 프로젝트에는 벡터 클래스가 있습니다. –