Mayavi: BUG: Opacidade de simplificações interagindo com ordenação visual de módulos de visualização

Criado em 6 mar. 2017  ·  10Comentários  ·  Fonte: enthought/mayavi

Alterar a opacidade das linhas de fluxo para algo diferente de seu valor padrão (1.0) traz as linhas de fluxo para a frente da cena, mesmo quando há outros objetos que deveriam obscurecê-los.

Por exemplo, eu indico o exemplo de linha de campo magnético dado aqui: http://docs.enthought.com/mayavi/mayavi/auto/example_magnetic_field_lines.html.

Executar o código como está dá a seguinte cena:
test_bug_1

No entanto, se alterarmos a opacidade das linhas de campo para que seja diferente de seu valor padrão de 1,0 (adicionando field_lines.actor.property.opacity = 0.99 ou ajustando manualmente a opacidade no pipeline Mayavi), obteremos algo como a seguinte cena:
test_bug_2
As linhas de campo estão agora na frente da cena, no entanto, os isocontornos ainda devem obscurecer, como na imagem anterior.

Comentários muito úteis

Com as versões recentes do VTK, isso funciona bem para mim:

from mayavi import mlab
f = mlab.figure()
mlab.points3d(0,0,1,color=(.8,.8,.8),resolution=100,opacity=.99)
mlab.points3d(0,0,0,color=(.8,.8,.8),resolution=100,opacity=.99)
f.scene.renderer.use_depth_peeling = True

Além disso, há um f.scene.renderer.maximum_number_of_peels que você pode usar potencialmente. É 4 por padrão, mas você pode defini-lo como zero sem limite, embora isso torne a renderização mais lenta. Você poderia mexer com isso.

Posso encerrar este problema? Acho que isso parece resolver muitos problemas que já vi antes.

Todos 10 comentários

Este é um problema que poderá ser corrigido em um futuro próximo? Caso contrário, gostaria de saber, para poder encontrar outra forma de contornar o meu problema. Obrigado

Isso parece se aplicar a outros objetos também. Estou usando contour3d com points3d e definir a opacidade dos pontos para algo diferente de 1.0 faz com que a superfície não os obscureça mais.

Eu vejo o que eu acho que é o mesmo problema com dois objetos points3d. Aqui estão alguns exemplos que mostram como a aparência de 2 esferas renderizadas depende da ordem de renderização se a opacidade for definida como 0,99, mas não se a opacidade for definida como 1.

mlab.figure()
mlab.points3d(0,0,1,color=(.8,.8,.8),resolution=100,opacity=.99)
mlab.points3d(0,0,0,color=(.8,.8,.8),resolution=100,opacity=.99)

2

mlab.figure()
mlab.points3d(0,0,0,color=(.8,.8,.8),resolution=100,opacity=.99)
mlab.points3d(0,0,1,color=(.8,.8,.8),resolution=100,opacity=.99)

4

mlab.figure()
mlab.points3d(0,0,1,color=(.8,.8,.8),resolution=100)
mlab.points3d(0,0,0,color=(.8,.8,.8),resolution=100)

1

mlab.figure()
mlab.points3d(0,0,0,color=(.8,.8,.8),resolution=100)
mlab.points3d(0,0,1,color=(.8,.8,.8),resolution=100)

3

O problema não parece depender da escolha de luzes ou light_manager ('vtk' ou 'raymond').

Suponho que uma solução alternativa seja primeiro classificar os objetos a serem renderizados por sua profundidade ao longo de um eixo dentro ou fora da tela.

Você provavelmente precisa ativar a opção de seleção da face frontal. Experimente isto:

mlab.figure()
g1 = mlab.points3d(0,0,1,color=(.8,.8,.8),resolution=100,opacity=.99)
g2 = mlab.points3d(0,0,0,color=(.8,.8,.8),resolution=100,opacity=.99)
g1.actor.property.frontface_culling = True
g2.actor.property.frontface_culling = True

Obrigado Prabhu --- Eu acho que o frontface_culling melhorou os visuais, mas a ordem de renderização ainda era um fator apenas no caso semitransparente.

Eu reproduzi essa observação apenas no vtk (é um problema de nível inferior).

Depois de mais leitura, acho que há uma solução ou duas incorporadas ao vtk, mas outra solução pode ser classificar os objetos antes da renderização.

Aqui estão alguns links sobre vtk que pareceram relevantes:
https://www.vtk.org/Wiki/VTK/Examples/Cxx/Visualization/CorrectlyRenderingTranslucentGeometry
https://www.vtk.org/Wiki/VTK/Depth_Peeling

E alguns links que usei para reproduzir o caso da esfera:
https://lorensen.github.io/VTKExamples/site/Python/GeometricObjects/Sphere/
https://www.vtk.org/Wiki/VTK/Examples/Cxx/Visualization/Opacity

Obrigado por adicionar à discussão e pelos links úteis. Não tenho muito conhecimento sobre VTK ou peeling de profundidade, mas uma solução simples que descobri que funcionou para meu exemplo original e o projeto em que estou trabalhando foi incluir isto:

scene = mlab.gcf().scene
scene.renderer.set(use_depth_peeling=True)

que adaptei desta pergunta sobre um problema semelhante.

Obrigado pela ajuda Matt e Prabhu.

Eu tentei deep_peeling, que para meu caso de uso real é mais útil do que para este exemplo de 2 esferas. Mas em comparação com o reordenamento das esferas, as bordas parecem menos ... anti-alias, acho que pode ser o termo?

f=mlab.figure()
f.scene.renderer.use_depth_peeling=1
g0=mlab.points3d(0,0,1,color=(.8,.8,.8),resolution=100,opacity=.99)
g1=mlab.points3d(0,0,0,color=(.8,.8,.8),resolution=100,opacity=.99)  
g0.actor.property.frontface_culling = True
g1.actor.property.frontface_culling = True

image

Para minha plotagem em 3D, tenho uma lista de pontos e uma lista de cores. Então, em vez de peeling de profundidade, usei esta função para reordenar essas listas antes de plotar:

def orderTransparentRender(cl,c):
    '''Opacity < 1 rendering results in appearance of spheres incorrectly in front of or behind other spheres
    One solution is setting f.scene.renderer.use_depth_peeling=1, however this seemed to result in less anti-aliased edges?
    This function sorts the cluster list cl and color list c together.
    '''
    cz=zip(cl,c)
    cz=sorted(cz,key=lambda x:-1*x[0][2])
    cz=zip(*cz)
    return cz[0],cz[1]

Caso contrário, a chamada classificada pode ser tudo o que é necessário. Aprendi isso com os documentos do python: https://wiki.python.org/moin/HowTo/Sorting. Aprendi sobre zip do python aqui: https://stackoverflow.com/questions/1663807/how-can-i-iterate-through-two-lists-in-parallel

Com as versões recentes do VTK, isso funciona bem para mim:

from mayavi import mlab
f = mlab.figure()
mlab.points3d(0,0,1,color=(.8,.8,.8),resolution=100,opacity=.99)
mlab.points3d(0,0,0,color=(.8,.8,.8),resolution=100,opacity=.99)
f.scene.renderer.use_depth_peeling = True

Além disso, há um f.scene.renderer.maximum_number_of_peels que você pode usar potencialmente. É 4 por padrão, mas você pode defini-lo como zero sem limite, embora isso torne a renderização mais lenta. Você poderia mexer com isso.

Posso encerrar este problema? Acho que isso parece resolver muitos problemas que já vi antes.

Obrigada. Eu poderei trabalhar com isso. Você pode fechar este problema.

Matthew Allcock | Pesquisador doutorado
Universidade de Sheffield | Escola de Matemática e Estatística
www.matthewallcock.co.uk

No domingo, 26 de agosto de 2018, 21:55 Prabhu Ramachandran, notificaçõ[email protected]
escreveu:

Com as versões recentes do VTK, isso funciona bem para mim:

de mayavi import mlab
f = mlab.figure ()
mlab.points3d (0,0,1, cor = (. 8, .8, .8), resolução = 100, opacidade = .99)
mlab.points3d (0,0,0, cor = (. 8, .8, .8), resolução = 100, opacidade = .99)
f.scene.renderer.use_depth_peeling = True

Além disso, há um f.scene.renderer.maximum_number_of_peels que você pode
potencialmente usar. É 4 por padrão, mas você pode defini-lo como zero para não
limite, embora isso torne a renderização mais lenta. Você poderia mexer com isso.

Posso encerrar este problema? Eu acho que isso parece resolver muitos problemas que eu tenho
visto antes.

-
Você está recebendo isso porque é o autor do tópico.
Responda a este e-mail diretamente, visualize-o no GitHub
https://github.com/enthought/mayavi/issues/491#issuecomment-416071420 ,
ou silenciar o tópico
https://github.com/notifications/unsubscribe-auth/AP4RUC8AYAnDAV6-wE88hHw5cPP-x01gks5uUwtGgaJpZM4MT7Rp
.

Ótimo, obrigado.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

scottstanie picture scottstanie  ·  4Comentários

jan-janssen picture jan-janssen  ·  21Comentários

Make42 picture Make42  ·  7Comentários

thoth291 picture thoth291  ·  10Comentários

indranilsinharoy picture indranilsinharoy  ·  9Comentários