내적을 사용하여 두 벡터 사이의 각도를 얻으려면 어떻게해야합니까?


16

게임에서 정규화 된 벡터를 사용하는 법을 배우고 있습니다.

두 벡터 사이의 각도를 알기 위해 내적을 사용할 수 있다는 것을 배웠습니다. 이것은 나에게 -1과 1 사이의 값을줍니다.

  • 1은 벡터가 평행하고 같은 방향을 향함을 의미합니다 (각도는 180 도입니다).
  • -1은 평행하고 반대 방향으로 향함을 의미합니다 (여전히 180도).
  • 0 그들 사이의 각도가 90 도임을 의미합니다.

두 벡터의 내적을 실제 각도로 변환하는 방법을 알고 싶습니다. 예를 들어, 두 벡터의 내적이 0.280이면 해당 각도는 0도에서 360도 사이입니까?


1
내적의 의도 된 사용은 초기 벡터가 단위 벡터 인 경우에만 작동합니다.
sam hocevar

@ SamHocevar 그렇습니다.
user3150201


1
@ user3150201 Alex의 대답은 정확하지만 실제 각도를 각도로 가져와야하는지 여부도 고려해야합니다. 이것이 실제로 필요한 곳을 생각할 수있는 유일한 경우는 UI에 무언가를 표시하는 것입니다. 그렇지 않으면 사인 및 코사인으로 직접 작업 할 수없는 응용 프로그램이 거의 없을 것입니다.
TravisG

답변:


22

dot(A,B) = |A| * |B| * cos(angle)
다시 정렬 할 수 있습니다
angle = arccos(dot(A,B) / (|A|* |B|)).

이 공식을 사용하면 두 벡터 사이의 가장 작은 각도를 찾을 수 있습니다.이 각도는 0에서 180도 사이입니다. 0 도와 360도 사이에서 필요한 경우이 질문이 도움이 될 수 있습니다.


그런데 같은 방향을 가리키는 두 평행 벡터 사이의 각도는 180 도가 아닌 0도 여야합니다.


"동일한 방향을 가리키는 두 평행 벡터 사이의 각도는 180 도가 아니라 0도 여야합니다."
Tara

8

귀하의 질문에 "2D"태그가 있다는 사실을 이용하여 TravisG의 의견을 조금 더 넓히고 다른 답변을 드리겠습니다.

내적을 사용하여 두 벡터 사이의 각도를 얻을 수 있지만 두 벡터 사이 의 부호가있는 각도를 얻을 수는 없습니다 . 달리 말하면, 시간이 지남에 따라 캐릭터를 특정 지점으로 돌리려면 내적은 어느 방향으로 돌리지 않아도됩니다. 그러나 또 다른 간단한 공식이 있는데 이는 내적과 결합 될 때 매우 유용합니다. 당신은뿐만 아니라

dot(A,B) = |A| * |B| * cos(angle)

또 다른 공식 (정치적 정확성을 위해 만든 이름)을 가질 수도 있습니다.

pseudoCross(A,B) = |A| * |B| * sin(angle)

여기서 A = (a, b), B = (x, y)이면 pseudoCross (A, B)는 교차 곱 (a, b, 0) x (x, y, 0의 세 번째 구성 요소로 정의됩니다. ). 다시 말해:

a*x+b*y = |A| * |B| * cos(angle)

-b*x+a*y = |A| * |B| * sin(angle)

그러면 부호있는 전체 각도가됩니다 angle=atanfull(-b*x+a*y,a*x+b*y)(정규화되지 않은 값을 전달하면 atanfull 또는 atan2 함수가 사용자를 용서합니다). A와 B가 정규화되면 |A|=|B|=1, 즉는 다음과 같습니다.

a*x+b*y = cos(angle)

-b*x+a*y = sin(angle)


자세한 설명은 위의 방정식을 행렬 방정식으로 표현할 수 있습니다.

[ a,b]   [x]   [cos(angle)]
[-b,a] * [y] = [sin(angle)]

그러나, A 및 B는 다음과 같이 표현 될 수있는 a=cos(ang1), b=sin(ang1)어떤 값 ang1(하지 angle). 따라서 왼쪽의 행렬은 벡터 (x, y)를 -ang1만큼 회전시키는 회전 행렬입니다. 이것은 단위 벡터 "A"가 벡터 / 축 (1,0)으로 취급되는 기준 프레임으로 전환하는 것과 같습니다! 따라서이 프레임에서 단위 원 / 오른쪽 삼각형을 그리면 해당 제품의 결과 벡터가 (cos (angle), sin (angle)) 인 이유를 알 수 있습니다.

사용자가 (a, b)과 극성기 형태 (X, Y)를 작성하고, 각도 차 수식을 적용하는 경우 cos(l)*cos(m)+sin(l)*sin(m)=cos(l-m)sin(l)*cos(m)-cos(l)*sin(m)=sin(l-m), 사용자는 사인은 / 코사인은 (LM) = 각도 때문에,이 제품에 의해 주어진 것을 다시 표현한다. 대안 적으로, 이러한 아이덴티티는 위에서 주어진 선형 곱이 벡터를 회전시키는 이유를보기 위해 사용될 수 있습니다.

이 모든 정체성은 각도가 거의 필요하지 않음을 의미합니다. 라디안 /도, 역 사인 / 코사인에 대한 규칙, 각도가 이상 할 수 있기 때문에 2 * pi마다 반복한다는 사실은 실제로 더 유용 할 수 있으며 "if (ang <180)"등의 논리를 절약 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.