2017-06-29 12 views
0

友人と私が作成しているゲームでは、レーダーを作っています。私たちはすでに基本レーダーを作っていますが、すべてが適切な位置に表示されているという意味で、レーダーにローテーションを追加しようとしています。この回転は、0度から始まる北向きのローカルプレーヤーの角度に基づいており、360度時計回りに北に戻っています。キャンバスに原点を中心に回転する

私はキャンバス上のすべてのポイント(これらは他のプレーヤー、アイテムなど)をローカルプレーヤーの角度からどのように回転させるのだろうかと思っていました。私たちは、プレーヤーが前進するたびに、レーダーで直接上に移動するようにしています。回転の度合いが何であっても、プレーヤーは常に前方に歩いている間に常にレーダーを「上らせる」べきです。

このように各プレーヤーに基本的なローテーションを試しました。 var baseX = x - localX、baseY =(canvas.height-y) - localY; var localAngle = toRadians(プレイヤー[0]。回転);

var newX = baseX * Math.cos(localAngle) - baseY * Math.sin(localAngle); 
    var newY = baseX * Math.sin(localAngle) + baseY * Math.cos(localAngle); 

    newX += localX; 
    newY += localY; 

私が常にレーダーを「上って」いないということは、私が探していた場所に依存しているということです。ありがとうございました。

+0

ようこそStackOverflow!私たちがコーディングの問題を解決するためには、実際に**あなたのコードを表示する必要があります。 ** **関連性の低いすべてのコード**を[**最小限で完全で検証可能な例**](http://stackoverflow.com/help/mcve)に表示するように質問を更新してください。詳細については、[**よくある質問をどうやるか**](http://stackoverflow.com/help/how-to-ask)に関するヘルプ記事を参照して、サイトの[**ツアー**](http://stackoverflow.com/tour):) –

+0

私が試したことを追加しましたが、私は何を求めているのか正確には分からないので、コードを提供するのは少し難しいです。 –

答えて

1

物を効率的に回転させるためには、線形代数から基礎の概念を理解する必要があります。要するに、すべてのベクトル(オブジェクト)の場所を定義する2つの別々のベクトル(基底ベクトル)が空間(あなたの場合は2D)であることを意味します。したがって、シーン内のオブジェクトを回転させたい場合は、それらのすべてに回転変換を適用する必要があります。これは、次のようになります。 (右に回転)

Math.cos -Math.sin 0 
Math.sin Math.cos 0 
0   0  1 

(左に回転)

Math.cos Math.sin 0 
-Math.sin Math.cos 0 
0   0  1 

だから、このように書きます:あなたがしたい場合 :

let multiplyMatrixVector = (A, v) => { 
    let C=[]; 
    C[0] = (A[0]*v.x)+(A[1]*v.y)+(A[2]*v.z); 
    C[1] = (A[3]*v.x)+(A[4]*v.y)+(A[5]*v.z); 
    C[2] = (A[6]*v.x)+(A[7]*v.y)+(A[8]*v.z); 
    return {x:C[0], y:C[1], z:C[2]}; 
}; 


let locations = [{x:34,y:7,z:0}]; 
let newLocations = map(
        (location) => { 
         return multiplyMatrixVector(matrix,location) 
        }, 
        locations 
        ) 

はEDITレーダー上の点を回転させるだけでなく、それを動かす必要があります。

translation to your point object in matrix form: 
x+a  1 0 a  x 
y+b <- 0 1 b <- y 
1  0 0 1  z 

1つの行列に回転して合成することができます。 あなたはベクトルを翻訳行列に入れて回転に移りますが、原点ベクトルについても忘れないでください。あなたはそれを変換の中で説明する必要があります。

+0

私は変換を使用しなければならないと確信しています、少なくとも私は記述した問題を達成するためにその方法を考えていますか?私はちょうど小さいものを見逃していると確信しています。元の問題のコードは、私が見ているどのような角度であっても、私の周りのアイテム/プレイヤーはその方向に相対的に配置されます。唯一の問題は、私が前方に歩いていくと、私はレーダー上で「上がっていない」ということです。説明をありがとうございますが、これはあまり必要ないと思います。 –

+0

あなたはシーンとオブジェクトを適切なコンポジションのコンポジションでマップすることができるので、複雑さを大幅に軽減できます。私はあなたが求めているものを持っている、あなたはプレイヤーモデルと一緒にプレイヤーとレーダー上のポイントを移動したいですか?もし私が2番目を待っているなら私は私の答えを増やすでしょう... –

+0

私は同じページにいると信じています。私は前進するときにそれを作って、レーダーで上に上がり、すべてのアイテム/選手は適切に回転します。つまり、第1象限の瞬間を見れば、私のゲームでは、彼らは私の右にすべきです。 –

関連する問題