2009-10-25 10 views
7

私はインディーズビデオゲームを開発しています。私のコントローラーのつまみが円形の動き範囲を持っているため、「円」座標を返すという前提の下で動作しています。すなわち、(半径1の)円形領域に拘束されたデカルト座標です。実際、座標は「正方形」です。例えば、右上の親指の位置は、x = 1、y = 1として登録される。座標をデカルトから極座標に変換すると、その大きさは1を超えることがあります。これは、プレイヤーが垂直または水平よりも高速に対角線上を移動できるという効果があります。正方形の座標を円の座標に変換するにはどうすればよいですか?

したがって、アナログサムブロックの位置は、大きさが0〜1の方向と大きさで記録する必要があります。サムスティックは、正方形平面上の座標を返します。デカルトから極座標までは十分ではありません。私は座標のスペースをに変換する必要があると思うが、それは私の猿の脳の限界を押している。

+0

「全体」の四角形を取りますか、すでに円のように見えるものの中にある座標を返しますか?例えば。sqrt-magnitudeを取ることができる(またはできない)ことを確認してください。 –

+0

スティックで何(x、y)をまっすぐに持ってきますか?また、あなたのスティックアナログまたはスイッチですか? (0.5,0.5)のような値を取得できますか? – Nosredna

+0

はい、コーナーを含めて、座標はすべて正方形に分布しています。 – Metaphile

答えて

15

Mapping a Square to a Circleを参照してください。マッピングのための素晴らしい視覚化もあります。あなたは:

xCircle = xSquare * sqrt(1 - 0.5*ySquare^2) 
yCircle = ySquare * sqrt(1 - 0.5*xSquare^2) 
+0

視覚化に基づいて、私はこれが正しいと思っています。ありがとうございました! – Metaphile

0

各値を大きさで除算して、すべての値を単位ベクトルに正規化します。

magn = sqrt(x * x + y * y); 
newx = magn > 1.0 ? x/magn : x; 
newy = magn > 1.0 ? y/magn : y; 

しかし、これは大きさをクリッピングの代わりに、内部値...つまりために正常化する効果を有することができ、あなたはコントローラに同じ値が左上に「完全に」プッシュ買ってあげると、コントローラーほぼが完全に同じ方向に押し込まれています。

+1

私は絶対に大きさをクリップしたくありません。私はすでにデッドゾーンを持っています。 2つは一緒にスティックの有効範囲を大幅に減少させます。私はエメリが正しいアイデアを持っていると思う。 – Metaphile

8

マッピングは一意ではありません。この質問には他にも多くの解決策があります。 /√(X 2 +y²)

V = Yの√(X 2 +y² - x²y² -

例えば、このマッピングはまた

U = X√(x²y²X 2 +y²)が動作します)/√(X 2 +y²)

(U、V)は円形ディスク座標と (X、Yである

は方形座標です。

画像には1000語の価値がありますので、マッピングの非一意性とその逆を示すいくつかの画像を示します。この他のマッピングの

circular Brady bunch


squared Boston Celtics

For a C++ implementation
http://squircular.blogspot.com/2015/09/fg-squircle-mapping.html
に行くマッピング結果のより多くのイメージのためhttp://squircular.blogspot.comを参照してください。

"Analytical Methods for Squaring the Disc"も参照してください。異なるマッピング方程式とプルーフと派生を論じる論文があります。

+0

ニース。どのように数字(言語/ライブラリ)を生成しましたか? – Praxeolitic

+1

私は、ピクセルごとに異なるマッピング方程式を使用するC++で簡単な画像処理プログラムを書いています。サンプルコードリンクへのリンクを参照してください。 LibpngはPNGファイルの読み書きに便利です –

関連する問題