回答:
さて、そのオブジェクトAのワールド変換マトリックスが何であるかを知っていると仮定すると、そのマトリックスの逆行列を作成するだけで、必要なものが得られます。
グローバルスペースに到達するために使用されるオブジェクトAの回転、スケーリング、および変換行列がそれぞれR、S、およびTであるとします。これらを一緒に掛けます
S * R * T = W
次に、Wを取得し、その逆W ^ -1をなんとか見つけます。マトリックスの逆は、ちょうど反対のことを行うマトリックスです。行列とその逆行列の積は、常に単位行列です。
W * W ^ -1 = I
したがって、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
ライトスパークの答えとエリオットの答えの間のどこかにあなたに何かを与えてみましょう。
問題の記述:場所A (50, 50)
と見出しがある場合(場所を指定しなかったため、「」と断言しますy = 2 * x + 25
)、見出しB (80, 90)
と相対的な場所を見つけますA
。
あなたがしたいことは実際にはかなり簡単です。1)A
システムの元に移動します。これは単に、local-to- A
valuesがグローバル位置値からグローバル位置値を引いたものになることを意味します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)
ます。最近のほとんどのコンピューター言語は、出力が0度から360度ではなく-180度から180度になる傾向があるようにatan2(y, x)
、まったく同じことを行う関数を定義しますatan(y/x)
が、どちらも機能します。
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