Mayavi: バグ:視覚化モジュールの視覚的順序付けと相互作用する合理化の不透明性

作成日 2017年03月06日  ·  10コメント  ·  ソース: enthought/mayavi

流線の不透明度をデフォルト値(1.0)以外に変更すると、流線を覆い隠す必要のあるオブジェクトが他にある場合でも、流線がシーンの前面に表示されます。

たとえば、 http ://docs.enthought.com/mayavi/mayavi/auto/example_magnetic_field_lines.htmlにある磁力線の例を参照してください

コードをそのまま実行すると、次のシーンが得られます。
test_bug_1

ただし、フィールドラインの不透明度を変更してデフォルト値の1.0と異なるようにすると( field_lines.actor.property.opacity = 0.99追加するか、Mayaviパイプラインで不透明度を手動で調整することにより)、次のようなシーンになります。
test_bug_2
これで力線がシーンの前面に表示されますが、前の画像のように等高線はまだ不明瞭になっているはずです。

最も参考になるコメント

最近のVTKバージョンでは、これは私にとってうまく機能します:

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

また、潜在的に使用できるf.scene.renderer.maximum_number_of_peelsがあります。 デフォルトでは4ですが、レンダリングが遅くなりますが、制限なしでゼロに設定できます。 あなたはこれをいじくり回すことができます。

この問題を解決できますか? これは私が以前に見た多くの問題を解決するように思われると思います。

全てのコメント10件

これは近い将来修正可能な問題ですか? そうでない場合は、問題を回避する別の方法を見つけることができるように、知っていただければ幸いです。 ありがとうございました

これは他のオブジェクトにも当てはまるようです。 私はpoints3dでcontour3dを使用しており、ポイントの不透明度を1.0以外に設定すると、サーフェスがポイントを覆い隠さなくなります。

2つのpoints3dオブジェクトで同じ問題だと思うことがわかります。 不透明度が.99に設定されている場合、レンダリングされた2つの球の外観がレンダリング順序にどのように依存するかを示すいくつかの例を示しますが、不透明度が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

この問題は、lightsまたはlight_manager( 'vtk'または 'raymond')の選択に依存していないようです。

回避策の1つは、最初に、レンダリングされるオブジェクトを、軸に沿った深さで画面に出入りするように並べ替えることだと思います。

おそらく、前面カリングオプションをオンに設定する必要があります。 これを試して:

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

ありがとうPrabhu --- frontface_cullingはビジュアルを改善したと思いますが、レンダリングの順序は半透明の場合にのみ要因でした。

私はその観察をvtkだけで再現しました(それはより低いレベルの問題です)。

さらに読んだ後、vtkに組み込まれている解決策が1つか2つあると思いますが、別の解決策は、レンダリングする前にオブジェクトを並べ替えることです。

関連性があると思われるvtkに関するリンクをいくつか示します。
https://www.vtk.org/Wiki/VTK/Examples/Cxx/Visualization/CorrectlyRenderingTranslucentGeometry
https://www.vtk.org/Wiki/VTK/Depth_Peeling

そして、球体のケースを再現するために使用したいくつかのリンク:
https://lorensen.github.io/VTKExamples/site/Python/GeometricObjects/Sphere/
https://www.vtk.org/Wiki/VTK/Examples/Cxx/Visualization/Opacity

ディスカッションに追加していただき、役立つリンクをありがとうございます。 私はVTKやデプスピーリングについてあまり知識がありませんが、元の例と私が取り組んでいるプロジェクトで機能することがわかった簡単な解決策は、これを含めることでした。

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

私は同様の問題についてこの質問から適応しました。

マットとプラブの助けに感謝します。

私はdepth_peelingを試しました。これは、実際のユースケースでは、この2球の例よりも役立ちます。 しかし、球を並べ替えるのに比べて、エッジは少ないように見えます...アンチエイリアスされた用語かもしれませんか?

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

3Dプロット用に、点のリストと色のリストがあります。 したがって、デプスピーリングの代わりに、この関数を使用して、プロットする前にこれらのリストを並べ替えました。

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]

それ以外の場合は、ソートされた呼び出しだけで十分です。 私はPythonドキュメントからそれを学びました: httpszipについて学びました: https

最近のVTKバージョンでは、これは私にとってうまく機能します:

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

また、潜在的に使用できるf.scene.renderer.maximum_number_of_peelsがあります。 デフォルトでは4ですが、レンダリングが遅くなりますが、制限なしでゼロに設定できます。 あなたはこれをいじくり回すことができます。

この問題を解決できますか? これは私が以前に見た多くの問題を解決するように思われると思います。

ありがとうございました。 私はこれで作業できるようになります。 この問題を解決できます。

マシュー・オールコック| 博士課程の研究者
シェフィールド大学| 数学と統計学部
www.matthewallcock.co.uk

2018年8月26日日曜日、21:55 Prabhu Ramachandran、 notifications @ github.com
書きました:

最近のVTKバージョンでは、これは私にとってうまく機能します:

マヤビからインポート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

また、あなたができるf.scene.renderer.maximum_number_of_peelsがあります
潜在的に使用します。 デフォルトでは4ですが、ゼロに設定することもできます。
これはレンダリングを遅くしますが、制限します。 あなたはこれをいじくり回すことができます。

この問題を解決できますか? これは私が持っている多くの問題を解決するようだと思います
前に見た。


スレッドを作成したため、これを受け取っています。
このメールに直接返信し、GitHubで表示してください
https://github.com/enthought/mayavi/issues/491#issuecomment-416071420
またはスレッドをミュートします
https://github.com/notifications/unsubscribe-auth/AP4RUC8AYAnDAV6-wE88hHw5cPP-x01gks5uUwtGgaJpZM4MT7Rp

まことにありがとうございます。

このページは役に立ちましたか?
0 / 5 - 0 評価