4

現在、拡張現実アプリを作成していますが、画面にオブジェクトを表示するのに問題があります。AndroidデバイスでGPSポイントを対応するスクリーンポイントに変換できないことは、私にとって非常にイライラします。私は、stackoverflow に関する多くの記事や他の多くの投稿を読みました (既に同様の質問をしました) が、それでもあなたの助けが必要です。

ウィキペディアで説明されている透視投影を行いました。

結果のスクリーンポイントを取得するには、透視投影の結果をどうする必要がありますか?

4

1 に答える 1

15

ウィキペディアの記事も、少し前に読んだときに混乱しました。これを別の方法で説明する私の試みは次のとおりです。


状況

状況を単純化しましょう。我々は持っています:

  • 投影された点 D(x,y,z) - relativePositionX|Y|Zと呼ばれるもの
  • サイズw * hのイメージ プレーン
  • 画角 α

...そして、私たちが望むもの:

  • 画像平面内の B の座標 (それらをXおよびYと呼びましょう)

X-screen-coordinates のスキーマ:

E は、この構成での「目」の位置であり、簡単にするために原点として選択しました。

焦点距離fは、次のことを知って推定できます。

  • tan(α) = (w/2) / f (1)

ジオメトリのビット

三角形ECDEBM類似していることを図で確認できます。そのため、サイド スプリッター定理を使用すると、次のようになります。

  • MB / CD = EM / EC<=> X / x = f / z (2)

(1)(2)の両方を使用すると、次のようになります。

  • X = (x / z) * ( (w / 2) / tan(α) )

ウィキペディアの記事で使用されている表記法に戻ると、方程式は次のようになります。

  • b_x = (d_x / d_z) * r_z

による乗算が抜けていることがわかりますs_x / r_x。これは、弊社の場合、「表示サイズ」と「記録面」が同じだからs_x / r_x = 1です。

注: Yについても同じ理由です。


実用

いくつかのコメント:

  • 通常、α = 45degが使用されます。これは、 を意味しtan(α) = 1ます。そのため、この用語は多くの実装では表示されません。
  • 表示する要素の比率を維持したい場合は、 XYの両方でfを一定に保ちます。つまり、次の計算を行う代わりに:

    • X = (x / z) * ( (w / 2) / tan(α) )Y = (y / z) * ( (h / 2) / tan(α) )

    ... 行う:

    • X = (x / z) * ( (min(w,h) / 2) / tan(α) )Y = (y / z) * ( (min(w,h) / 2) / tan(α) )

    注: 「「表示サイズ」と「記録面」は同じ」と言ったとき、それはまったく正しくありませんでした。min 操作は、この近似を補正するためにここにあり、正方形の面rを潜在的に-長方形の表面s .

    注 2: min(w,h) / 2を使用する代わりに、Appunta はscreenRatio= (getWidth()+getHeight())/2気づいたように使用します。どちらのソリューションも要素の比率を維持します。焦点、つまり画角は、画面自体の比率に応じて、わずかに異なります. fを定義したい任意の関数を実際に使用できます。

  • 上の図でお気づきかもしれませんが、画面座標は[-w/2 ;の間で定義されています。w/2] X および[-h/2 ; Y の場合はh/2]ですが、おそらく[0 ; ]が必要です 。w]および [0 ; h]代わりに。X += w/2およびY += h/2- 問題が解決されました。


結論

これがあなたの質問に答えることを願っています。エディションが必要な場合は近くにいます。

さよなら!

< 自己宣伝注意 > 3D プロジェクションとレンダリングについては、以前にも記事を書きました。実装は Javascript ですが、翻訳は非常に簡単です。

于 2013-05-23T09:13:49.333 に答える