2016-04-08 2 views
0

J'utilise des sprites à panneaux sphériques accompagnés d'objets 3D. Parce que le quad se penche en arrière pour correspondre à l'angle de la caméra, il se croise avec des objets 3D immédiatement derrière lui. Il est plus visible lorsque l'angle de la caméra est très grand. Le lien suivant fournit un visuel très clair. http://answers.unity3d.com/questions/582680/billboard-issue-in-front-of-3d-object.htmlLes sprites Billboarded croisent des objets 3D

Existe-t-il un moyen efficace de résoudre ce problème?

Répondre

0

La meilleure solution que je pouvais trouver était d'utiliser l'affichage cylindrique pour les calculs de profondeur et sphérique pour la position réelle du quad. Cela vous permet d'utiliser un panneau d'affichage sphérique tout en vous assurant que la profondeur du quad reste constante.

Pour référence, voici les matrices ModelView d'affichage. [x]: implique que la valeur est laissée telle quelle.

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] 

d'abord modifier la ModelViewMatrix pour billboarding cylindrique et générer un sommet de la profondeur en tant que tel:

depthV = projectionMatrix * (mvm * vertex); 

Suivant définir les deuxièmes valeurs de colonne pour billboarding sphérique et créer le quad comme d'habitude:

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

Enfin, envoyez depthV au fragment shader et utilisez-le pour le calcul de profondeur.

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

La mise à l'échelle doit être effectuée avant d'appliquer les matrices ModelView.