2016-04-17 9 views
0

正規化球面上の点(半径0.5、中心点0,0,0)をフィッシュアイテクスチャ画像にどのようにマッピングしますか?私はC#言語とOpenGLを使用しています。結果は画像のUV座標でなければなりません。球は、球の各頂点の3D座標のリストに過ぎないので、これらのそれぞれは画像にUV座標を取得します。フィッシュアイ画像の球面上のピクセル位置へのマップ点

最後の結果は、球にテクスチャを付けたときに魚眼画像が360度まわりに折り返してくる完全な球です。

例の魚眼画像:

enter image description here

答えて

0

球にマッピングするための単一の方法はありません。あなたのポストのテクスチャは、シームが指定された世界の飛行機に登場するように見えます。これを一般的なスカイドームタイプのテクスチャと比較してください。このテクスチャでは、球体が通常底部で結合します(カメラが結合を認識できない場所)。

float3 PointOnSphere(float phi, float theta, float radius) 
{ 
    float3 pos = float3(0, 0, 0); 

    pos.x = radius * cos(phi) * sin(theta); 
    pos.y = radius * sin(phi) * sin(theta); 
    pos.z = radius * cos(theta); 

    return pos; 
} 

または表面上の点からUVを取得することを逆に:あなたはUVに基づいてポイントをマップするために、次のようにシェーダコードを使用する場合があります

アップし、どこで道
float2 AngleFromPoint(float3 pos) 
{ 
    float phi = atan(pos.y/pos.x); 
    float theta = atan(pos.y/pos.z/sin(phi)); 
    return(float2(phi, theta)); 
} 

シームジョイントは、自分で練習しなければならないものです。

texcoord = pow(texcoord, 0.5f); 

編集:テクスチャが圧縮に見える場合、それは非直線的であるので、あなたのような何かをしようとする必要があるかもしれないと明らかに、0に角度を正常化 - テクスチャのための1は私がAngleFromPointに差し込まれてきた

+0

を調整するが、非常に歪んだ画像を得る。 AngleFromPointへの入力は、球上の頂点の1つだけですか? – jjxtra

+0

AngleFromPointは角度をラジアンで返します。出力色を設定しただけで、座標を確認できます:color = float4(phi、theta、0、1);それは、赤色から緑色から黄色でも、黒色または黄色の大きな色彩でなくてもよい – tim

関連する問題