2017-01-10 14 views
0

私はカメラの原点を-zで見てパノラマ画像としてロードする画像の等角投影をしています。私の座標系は右利きです。すなわち、xは右に、yは上に(北に)、zは画面外に出ています。右手のopenglの世界座標への緯度と経度の変換

私がしたいのは、選択したピクセルを取り、ワールド座標xyzに変換することです。

Iは緯度と経度を取得するために使用している式は、次のとおり

double centerX = totalWidth/2; 
double centerY = totalHeight/2; 

double latScaling = centerY/90; 
double lonScaling = centerX/180; 


double longitude = (pixelX-centerX)/lonScaling; 
double latitude = -(pixelY-centerY)/latScaling; 

totalWidthとtotalHeightは正距円筒画像の幅と高さとpixelXとpixelYは、選択されたピクセル座標です。

さらに私は、これらの緯度/経度を使用している世界のように座標を取得する:

double x = sphereRadius * Math.sin(latRadians) * Math.sin(longRadians); 
double y = sphereRadius * Math.cos(latRadians); 
double z = sphereRadius * Math.cos(longRadians) * Math.sin(latRadians); 

sphereRadiusは、画像が最終的に描画されたOpenGLの球の半径に等しい18です。カメラはこの球の原点にあります。 私のアプローチが正しいか、使用されている数式が右利きの座標系に対して正しいかどうかを誰かが確認できますか?

上記の式を使用すると、x = 0、y = 18、z = 0(緯度= 0、経度= 0)が得られます。私は何かを逃したか?

EDIT:私のために働いているようだ式は次のとおりです。

// Y軸を反転 latRadians =にMath.PI/2 - latRadians。

double x = sphereRadius * Math.sin(latRadians) * Math.sin(longRadians); 
    double y = -sphereRadius * Math.cos(latRadians); 
    double z = -sphereRadius * Math.sin(latRadians) * Math.cos(longRadians); 

はまだいくつかのオフセット(850周辺の画素)があります、それは真のスケール値を含むので偏差は、赤道と子午線で最小です。私はカメラの上のベクトルと右のベクトルの間の角度を通してオフセットを計算する必要があると思う。誰かが私を修正することはできますか?

私はピクセルxyの位置を取るフラットな等角投影です。そして、この正射影は球の内側に包まれ、私のカメラはこの球の起源です。ピクセルxyからワールド座標を計算する必要があります。これはいくつかの疑念を明確にしたいと考えています。

+1

スロー「sin(lat)」と「cos(lat) '。 –

+0

あなたのコメントごとに私の新しい公式は double x = sphereRadius * Math.cos(latRadians)* Math.sin(longRadians); double y = sphereRadius * Math.cos(latRadians); double z = sphereRadius * Math.cos(longRadians)* Math.cos(latRadians); 新しい値はx = 0、y = 18、z = 18ですが、オフセットはまだ存在します。私の経度は西から東-180から180、緯度南から北-90から90までです。 –

答えて

0

私のアプローチはやや間違っていました。緯度経度マッピングを検索する代わりに、テクスチャのUVマッピングを計算しなければなりませんでした。 UVマッピングは、緯度/経度マッピングとは少し異なります。 -PIとPIの間の値の代わりに、UVマッピングは0.0〜1.0の間です。テクスチャはセクタとリングに分割されています。

はピクセル

double u = pixelX/totalWidth; 
double v = 1 - pixelY/totalHeight; 

のxy位置からUVマッピングを生成し、変換するには、次の式を使用:あなたは、これは私がこの問題を解決する方法である球体を生成するためのロジックhere

を見つけることができますXYZは、球体の座標に+カメラがまたはである-ve Y、上の南Y及びVEの上

double theta = 2 * Math.PI * u; //sector 
double phi = Math.PI * v; //ring 

double x = Math.cos(theta) * Math.sin(phi) * sphereRadius; 
double y = -Math.sin(-Math.PI/2 + phi) * sphereRadius; 
double z = Math.sin(theta) * Math.sin(phi) * sphereRadius; 

球は北y軸上の極を有しますこの球のiginは0,1,0、右ベクトルは1,0,0、look-atは0,0、-1である。

関連する問題