現在、拡張現実アプリを作成していますが、画面にオブジェクトを表示するのに問題があります。AndroidデバイスでGPSポイントを対応するスクリーンポイントに変換できないことは、私にとって非常にイライラします。私は、stackoverflow に関する多くの記事や他の多くの投稿を読みました (既に同様の質問をしました) が、それでもあなたの助けが必要です。
ウィキペディアで説明されている透視投影を行いました。
結果のスクリーンポイントを取得するには、透視投影の結果をどうする必要がありますか?
現在、拡張現実アプリを作成していますが、画面にオブジェクトを表示するのに問題があります。AndroidデバイスでGPSポイントを対応するスクリーンポイントに変換できないことは、私にとって非常にイライラします。私は、stackoverflow に関する多くの記事や他の多くの投稿を読みました (既に同様の質問をしました) が、それでもあなたの助けが必要です。
ウィキペディアで説明されている透視投影を行いました。
結果のスクリーンポイントを取得するには、透視投影の結果をどうする必要がありますか?
ウィキペディアの記事も、少し前に読んだときに混乱しました。これを別の方法で説明する私の試みは次のとおりです。
状況を単純化しましょう。我々は持っています:
...そして、私たちが望むもの:
X-screen-coordinates のスキーマ:
E は、この構成での「目」の位置であり、簡単にするために原点として選択しました。
焦点距離fは、次のことを知って推定できます。
tan(α) = (w/2) / f
(1)三角形ECDとEBMが類似していることを図で確認できます。そのため、サイド スプリッター定理を使用すると、次のようになります。
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についても同じ理由です。
いくつかのコメント:
tan(α) = 1
ます。そのため、この用語は多くの実装では表示されません。表示する要素の比率を維持したい場合は、 XとYの両方で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 ですが、翻訳は非常に簡単です。