2009-08-01 8 views
2

私はXNAゲームを作っており、ベクトル計算のビットを計算する小さな問題に遭遇しました。XNAで回転変換された2D座標を見つけるにはどうすればよいですか?

私はXとYの整数座標と回転フロートを持つ2Dオブジェクトを表すクラスを持っています。私が必要とするのは、Rotation floatを使用して変換されたVector2としてXとYを取得して設定するPositionのVector2プロパティを持つことです。このように私はちょうどのようなことをすることができます。

Position += new Vector2((thumbstick.X * scrollSpeed), -(thumbstick.Y * scrollSpeed)); 

オブジェクトは、ビューの上方向ではなく、上方向に移動します。

これまでのところ、これは私が持っているものです...私はセットが正しいと思っていますが、+変更のためにもそれが必要です。答えはちょうど今私には来ません...>

public Vector2 Position 
{ 
    get 
    { 
     // What goes here? :S 
    } 
    set 
    { 
     X = value.X * (int)Math.Cos(this.Rotation); 
     Y = value.Y * (int)Math.Cos(this.Rotation); 
    } 
} 

答えて

7

いいえ、どちらも正しくありません。

A 2次元ベクトルは次のように変換:角度はラジアンで測定される

x' = x*cos(angle) - y*sin(angle) 
y' = x*sin(angle) + y*cos(angle) 

、ゼロ角度は、正のx軸に沿って反時計回り方向に増加あなたはz軸の周りを回転するように面外に回転の中心は変換されるベクトルの終わりにあるので、(0,0)、(0,0)を起点とするベクトルとなるまで、(0,0)、 )で終わり、(x '、y')で終わる。

+1

その意味ではので、限り、それは私が使用するラジアンの知っている三角関数のすべての実装 – greenoldman

+2

:-)両方の式で同じ単位で測定されたものを単位角度でそれを問題ではありません。それは確かに重要です。この問題を解決するためにコンピュータを使用している場合は、ラジアンを考えてください。 – duffymo

1

これは悪い考えです。オブジェクトのX座標とY座標をそれぞれ独自の軸を持つ代わりに、同じ平面にすべて保持します。是非、PositionHeadingのプロパティを持ち、Moveメソッドを使用することをお勧めします。このメソッドは入力ベクトルを受け取り、数式で位置と見出しを更新します。

+0

だから私はそれをプロパティにしたいです。 X座標とY座標を直接参照することも、回転した平面にあるかのようにプロパティを取得または設定することもできます。これは、オブジェクトが回転している場所に基づいて方向を変更するオブジェクトの移動コントロールを計算することをはるかに簡単にします。 –

+0

私は同意しない - これは混乱すると思います。 –

+0

私はなぜそれが混乱するか分かりません。それは完全にオプションです。これは、「前方」が常にビューポートの上部ではなく、スプライトの特定のエッジに対応する必要があるオブジェクトを移動するためのちょっとしたヘルパーです。 –

3

Matrixヘルパーメソッドを使用してZ回転行列を作成し、これをベクトルに掛けて回転させることもできます。このような何か:

Vector v1; 
Matrix rot = Matrix.CreateRotationZ(angle); 
Vector v2 = v1 * rot; 
関連する問題