답변:
자, 객체 A에 대한 월드 변환 행렬이 무엇인지 알고 있다고 가정하면, 그 행렬의 역을 구성하기 만하면됩니다.
Global Space로 가져 오는 데 사용되는 객체 A의 회전, 스케일링 및 변환 행렬이 각각 R , S 및 T 라고 가정합니다 . 당신은 이것들을 같이 곱할 것입니다
S * R * T = W
이제 W 를 가지고 역 W ^ -1을 어떻게 든 찾으십시오 . 행렬의 반대는 그 반대의 행렬입니다. 역행렬을 가진 행렬의 곱은 항상 항등 행렬입니다.
W * W ^ -1 = 나는
따라서 W ^ -1 = I / W ;
이제이 역행렬을 월드에 월드 변환으로 적용하면 각 오브젝트가 원하는 좌표에있게됩니다
행렬 곱셈에 대해서는 이 페이지를 참조 하십시오. 항등 행렬에 대해서는 이 항목을 참조 하십시오.
다음 은 W 를 만드는 데 필요한 행렬을 제공하는 다른 페이지입니다 .
위의 질문에서 x 축의 변환은 50으로, y 축의 변환은 50으로, 두 축의 배율은 없으며, 지정하지 않은 회전을 수행해야합니다.
과거에는 행렬 대신 삼각법 으로이 작업을 수행했습니다 (매트릭스 멍청한 놈입니다). Ashes999의 대답은 중간에 있고 상대 벡터를 얻은 다음 EntityA의 각도의 역으로 회전합니다.
relativeX = B.x - A.x
relativeY = B.y - A.y
rotatedX = Cos(-Angle) * relativeX - Sin(-Angle) * relativeY
rotatedY = Cos(-Angle) * relativeY + Sin(-Angle) * relativeX
The Light Spark의 답변과 Elliot의 답변 사이에 뭔가를 주려고합니다. 왜냐하면 내가 읽은 것에서 수학은 단지 당신에게 던져지는 것이 아니라 따라야 할 알고리즘을 찾고 있기 때문입니다.
문제 진술 : 위치 A (50, 50)
와 제목 이 있다면 (제공하지 않았으므로이라고 가정 y = 2 * x + 25
) 제목과 B (80, 90)
관련이 있는 곳을 찾으십시오 A
.
당신이하고 싶은 것은 실제로 매우 간단합니다. 1) A
시스템의 원점으로 이동하십시오. 이는 단순히 로컬- A
값이 전역 위치 값에서 전역 위치 값을 뺀 값이 됨을 의미합니다 A
. A
하게 (0, 0)
및 B
된다 (30, 40)
.
1.1) 제목도 이동해야합니다. local-to- A
term 의 y 절편 이 항상 0이고 기울기가 변하지 않기 때문에 실제로 수행하기가 매우 쉽습니다 y = 2 * x
.
2) 이제 이전 제목을 X 축에 정렬해야합니다. 그래서 어떻게해야합니까? 개념적으로 가장 쉬운 방법은 x, y 좌표에서 극좌표 시스템으로 변환하는 것입니다. 극 좌표계는 R
, 위치까지의 거리 및 phi
x 축으로부터의 회전 각도를 포함합니다. R
로 정의 sqrt(x^2 + y^2)
되고 phi
로 정의됩니다 atan(y / x)
. 요즘 대부분의 컴퓨터 언어 atan2(y, x)
는 계속해서 동일한 기능을 수행 atan(y/x)
하지만 출력이 0도에서 360 도가 아닌 -180도에서 180 도인 경향이 있지만 어느 쪽이든 작동하는 방식으로 기능을 정의합니다.
B
따라서하게 R = sqrt(30^2 + 40^2) = sqrt(2500) = 50
한 phi = atan2(40, 30) = 53.13
도이다.
마찬가지로 제목이 변경됩니다. 이것은 설명하기가 약간 까다 롭지 만 정의에 따라 제목이 항상 원점을 통과 A
하기 때문에 R
구성 요소 에 대해 걱정할 필요가 없습니다 . 제목은 항상 상수 의 형식으로 phi = C
되어 C
있습니다. 이 경우에는 phi = atan(2 * x / x) = atan(2) = 63.435
도입니다.
이제 시스템을 회전하여 제목을 로컬 A
시스템 의 X 축으로 옮길 수 있습니다 . A
시스템의 원점으로 옮길 때와 마찬가지로 시스템의 phi
모든 phi
값에서 제목을 빼면 됩니다. 그래서 phi
의가 B
될 53.13 - 63.435 = -10.305
정도.
마지막으로 극좌표에서 x, y 좌표로 다시 변환해야합니다. 이 변환을 수행하는 공식은 X = R * cos(phi)
및 Y = R * sin(phi)
입니다. 들어 B
그러므로, 우리는 도착 X = 50 * cos(-10.305) = 49.2
하고 Y = 50 * sin(-10.305) = 8.9
그래서, B
지역 대에 A
에 가까운 좌표 (49,9)
.
잘하면 그것은 도움이되고, 당신이 따라야 할 수학에 충분히 가볍습니다.
전역 공간 (x1, y1, θ)에서 엔티티 A의 자세를 알아야합니다. 여기서 θ는 x 축을 기준으로 한 방향입니다.
EntityB 위치를 글로벌 좌표 (x2, y2)에서 로컬 좌표 (x2 ', y2')로 변환하려면 다음을 수행하십시오.
글로벌에서 로컬로
x2' = (x2-x1)cosθ + (y2-y1)sinθ
y2' = -(x2-x1)sinθ + (y2-y1)cosθ
로컬에서 글로벌로
x2 = x2'cosθ - y2'sinθ + x1
y2 = x2'sinθ + y2'cosθ + y1
행렬 사용하기 :
R = [cosθ -sinθ
sinθ cosθ]
A = [x1
y1]
B_global = [x2
y2]
B_local = [x2'
y2']
글로벌에서 로컬로
B_local = inv(R) x (B_global - A)
로컬에서 글로벌로
B_global = R x B_local + A