2016-04-08 5 views
0

Я использую сферически украшенные анимированные спрайты вместе с 3D-объектами. Поскольку квад поворачивается назад, чтобы соответствовать углу камеры, он пересекается с 3D-объектами сразу за ним. Это более заметно, когда угол камеры очень большой. Следующая ссылка обеспечивает очень четкое визуальное изображение. http://answers.unity3d.com/questions/582680/billboard-issue-in-front-of-3d-object.htmlБиллиардовые спрайты, пересекающие 3D-объекты

Есть ли эффективный способ решить эту проблему?

ответ

0

Лучшее решение, которое я мог придумать, состояло в том, чтобы использовать цилиндрический щит для расчета глубины и сферический для фактического положения квадроцикла. Это позволяет использовать сферический биллбординг, гарантируя постоянную глубину квадроцикла.

Для справки приведены чертежные модели ModelView Matrixes. [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 для цилиндрического billboarding и генерировать глубины вершины как таковой:

depthV = projectionMatrix * (mvm * vertex); 

Далее установите вторые значения столбцов для сферической billboarding и создать четверной как обычно:

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

Наконец, отправьте depthV в шейдер фрагмента и используйте его для расчета глубины.

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

Масштабирование должно выполняться перед применением матриц ModelView.

Смежные вопросы