2016-04-13 33 views
3

Unityで空の球を使用して360度ビューに魚眼画像をマップしようとしています。シーンは球の内側にあります。私は非常に近いですが、私は若干の歪みが見られます。私は次のようにUV座標計算しています:ここでフィッシュアイを球面にマッピングする - 360度ビュー

Vector3 v = currentVertice; // unit vector from edge of sphere, -1, -1, -1 to 1, 1, 1 
float r = Mathf.Atan2(Mathf.Sqrt(v.x * v.x + v.y * v.y), v.z)/(Mathf.PI * 2.0f); 
float phi = Mathf.Atan2(v.y, v.x); 
textureCoordinates.x = (r * Mathf.Cos(phi)) + 0.5f; 
textureCoordinates.y = (r * Mathf.Sin(phi)) + 0.5f; 

は歪みや三角形である:

enter image description here

全体球体の残りの部分は非常に良い感じです、それは私が手にこの1箇所だけですねじれ。ここで

ソース魚眼画像です:

enter image description here

と同じ歪みエリアを示す上面の上にUVテストテクスチャと同じ球が。フルUVテストテクスチャは右側にあり、正方形ですが、スクリーンショットの目的のために右側の四角形に引き伸ばされています。

enter image description here

上記歪みは、球マッピングはなく、フィッシュアイ・マッピングを使用しています。ここではフィッシュアイマッピングを使用してUVテクスチャです:

enter image description here

数学は私の強力なポイントは、私はここで何も悪いことをやっていないか、またはこの種のマッピングは、単純に100%可能ではないでしょうか?

答えて

0

あなたが見ているのは、rが1に近づく場合です。ソース画像でわかるように、非常に歪んだ画像データと黒の境界部分です。

この領域は非常に歪んでいますが、これは主な問題ではありません。結果を見ると、UV方向に問題があることがわかります。

私が何を意味するかを実証するために、ソースイメージに数行追加しました。 rが小さければ(黄色の線)、クォードの角の間でUV座標を補間できることがわかります(トリスの代わりにクワッドを仮定)。しかし、rが大きければ(赤い角)、UV座標を補間することで、rが1よりはるかに小さい(赤線)元画像の領域を通過し、UV空間に歪みが生じます。実際には、赤い線は直線ではありませんが、ソース画像データの境界に沿って移動する必要があります。

これは、rが1に近づくskysphereの領域でより高いポリカウントを持つことで改善できますが、UVが直線的に補間されている限り完全ではありません。

enter image description here

私はまた別の問題を発見しました。現場を注意深く見ると、完全なソースイメージがそこに存在することがわかります。これは、その点でUV座標が折り返されるためです。ビューアーの周りをレンダリングが進むにつれて、uv座標は0から1に向かって移動します。それらのポイントは1になりますが、隣接する頂点は0.001か何かにあり、ソース画像全体が中間にレンダリングされます。これを修正するには、球の表面が始まる場所と終わる場所の2つの別個の頂点を、あなたのskysphereの縫い目に配置する必要があります。オブジェクト空間では同じですが、uv空間では1つは0に、もう1つは1にあります。

+0

赤道よりもむしろ球の周りに縫い目が走っていて、それは正しいのですか? – jjxtra

+0

私は三角形が互いに頂点を共有していますが、私は三角形と四角形ではなく、八面体を使用していることを言及する必要があります。 – jjxtra

+0

私は、それが事を変えたり助けてくれたら、私の質問にuvテストテクスチャを追加しました。 – jjxtra

関連する問題