2016-04-08 15 views
0

3Dオブジェクトとともに球形のビルボードスプライトを使用しています。クワッドはカメラの角度に合わせて後方に傾いているため、カメラの直後の3Dオブジェクトと交差します。カメラアングルが非常に大きい場合は、より目立つようになります。次のリンクは非常に明確な視覚を提供します。 http://answers.unity3d.com/questions/582680/billboard-issue-in-front-of-3d-object.html3Dオブジェクトを交差するビルボードスプライト

これを解決する有効な方法はありますか?

答えて

0

私が思いつくことができる最高の解決策は、深度計算には円柱状のビボーディングを使用し、クワッドの実際の位置には球形を使用することでした。これにより、クワッドの深さを一定に保ちながら、球形のビボーディングを使用することができます。

ここでは、BillboardのModelView Matrixが参照されています。 [x]:値がそのまま残っていることを示します。

Cylindrical mvMatrix    Spherical mvMatrix 

[1][x][0][x]      [1][0][0][x] 
[0][x][0][x]      [0][1][0][x] 
[0][x][1][x]      [0][0][1][x] 
[x][x][x][x]      [x][x][x][x] 

まず円筒形ビルボーディングためModelViewMatrixを変更しような深さの頂点を生成する:

depthV = projectionMatrix * (mvm * vertex); 

次に球状ビルボーディングのための第2の列の値を設定し、通常通りクワッドを作成する:

mvm[1][0] = 0; mvm[1][2] = 0; mvm[1][1] = 1; 
gl_Position = projectionMatrix * (mvm * vertex); 

最後に、深さVをフラグメントシェーダに送り、深度計算に使用します。

float ndcDepth = depthV.z/depthV.w; 
gl_FragDepth = ((gl_DepthRange.diff * ndcDepth) + gl_DepthRange.near + gl_DepthRange.far)/2.0; 

スケーリングは、ModelViewマトリックスを適用する前に行う必要があります。