4

視線方向に基づいて画像の透視投影を作成しようとしています。しかし、私はこの分野の経験がなく、自分でそれを行うことはできません。手伝ってくれませんか。

画像とオブザーバー(カメラ)があります。カメラが見えない球上のオブジェクトと見なされ、画像が球の中央を通過する平面であると見なすことができる場合、カメラの位置は次のように表すことができます。

x = dcos(θ)cos(φ)

y = dsin(θ)

z = dsin(φ)cos(θ)

ここで、θは緯度、φは経度、dは画像の中央がある球の中央からの距離(半径)です。

これらの式はどこかで見つかりましたが、座標についてはわかりません(わかりませんが、xはzである必要があるように見えますが、座標系によって異なると思います)。

今、私がする必要があるのは、カメラから見たように(適切な視点で)見えるように、画像を適切に変換することです。これをどのように行うことができるか、いくつかの言葉を教えていただけませんか。どのような手順を踏む必要がありますか?

私はiOSアプリを開発していて、QuartzCoreから次の方法を使用できると思いました。しかし、この方法にどの角度を渡す必要があるのか​​、カメラの位置から新しいx、y、z座標を導出する方法がわかりません。

CATransform3D CATransform3DRotate (CATransform3D t, CGFloat angle,
    CGFloat x, CGFloat y, CGFloat z)

これまでのところ、次の方法で簡単な表示パースペクティブを作成することに成功しました。

  1. .m34が1/-1000に設定された単位行列(CATransform3Dパラメーターとして)を使用し、
  2. (0、1、0)ベクトルを使用してφの角度で画像を回転させます。
  3. 結果をθおよび(1、0、0)ベクトルによる回転と連結します。
  4. dに基づくスケーリングは無視されます(他の基準に基づいて画像をスケーリングします)。

しかし、私が得た結果は私が望んでいたものではありませんでした(それは明白でした):-/。これらの2つの角度のいずれかが0に近い限り、遠近法は現実的に見えます。したがって、適切な変換を実現するために、適切な角度とx、y、z座標を計算する方法があるのではないかと思いました(これは間違っている可能性があります)それは私の推測です)。

4

1 に答える 1

2

なんとか解決策を見つけたと思いますが、残念ながら自分の計算や考え、実験に基づいているので、正しいかどうかわかりません。大丈夫そうですが、あなたは知っています...

したがって、座標系が次のようになっている場合: ここに画像の説明を入力してください

変換される画像の平面はX軸とY軸を通り、その中心はシステムの原点にあり、次の座標になります。

x = dsin(φ)cos(θ)

y = dsin(θ)

z = dcos(θ)cos(φ)

座標系の原点から始まり、画像を観察しているカメラの位置を指すベクトルを定義します。dは1に設定できるため、さらに正規化せずに単位ベクトルを一度に取得できます。シータはZY平面の角度であり、ファイはZX平面の角度です。シータはZ+からY+軸に0°から90°に上昇しますが、ファイはZ+からX+軸に0°から90°に上昇します(どちらの場合も反対方向に-90°に上昇します)。

したがって、変換ベクトルは次のようになります。

x1 = -y / z

y1 = -x / z

z1=0。

z1 = 0についてはよくわかりませんが、Z軸を中心とした回転は私には間違っているように見えました。

最後に計算するのは、画像を変換する必要のある角度です。私の謙虚な意見では、これはカメラを指すベクトル(x、y、z)と画像に垂直なベクトル(Z軸(0、0、1))の間の角度である必要があります。

2つのベクトルの内積は、それらの間の角度の正弦を与えるため、角度は次のようになります。

α=arccos(x * 0 + y * 0 + z * 1)= arccos(z)。

したがって、アルファ角度とx1、y1、z1座標は、質問で述べたCATransform3DRotateメソッドのパラメーターです。

このアプローチが正しいかどうか誰かに教えてもらえれば幸いです。どうもありがとう!

于 2012-08-21T22:42:49.910 に答える