Open3Dで背景色を変える
Open3DのVisualizer、便利なんですが背景が白いので目に刺さりがち...。背景色を変更して目を保護したいと思います。
通常
import open3d as o3d
bunny = o3d.data.BunnyMesh()
mesh = o3d.io.read_triangle_mesh(bunny.path)
mesh.compute_vertex_normals()
o3d.visualization.draw_geometries([mesh])
open3d.visualization.draw_geometries()
でオブジェクトを表示するのは上記のようなコードですが、これだと背景が白に固定されます。背景色のオプションは存在しません。
Visualizerを用いてレンダリング
では背景色のオプションがどこに存在するかというと、visualization.RenderOption
内にあります。
RenderOptionはVisualizer.get_render_option()
からオブジェクトを得ることができます。つまりdraw_geometries()
での表示ではなくVisualizerを用いたレンダリングが必要になることがわかります。
draw_geometries()
とほぼ等価な挙動をVisualizerで書き直すと以下のようになります。
vis = o3d.visualization.Visualizer()
vis.create_window()
vis.add_geometry(mesh)
while vis.poll_events():
vis.update_renderer()
vis.destroy_window()
open3d.visualization.Visualizer()
でインスタンスを作成後、Visualizer.create_window()
で表示用のウィンドウを生成します。また表示したいオブジェクトはVisualizer.add_geometry()
で1つづ指定します。
後ろが少し複雑です。ウィンドウのインタラクションを維持しながら表示を続けるために、Visualizer.poll_events()
を待ちながらVisualizer.update_renderer()
を繰り返します。poll_events()
は例えばウィンドウが閉じられるとfalseを返すようになります。
Visualizerオブジェクトにアクセスできるようになったので、RenderOptionを弄れば背景色の変更が可能です。
import open3d as o3d
import numpy as np
bunny = o3d.data.BunnyMesh()
mesh = o3d.io.read_triangle_mesh(bunny.path)
mesh.compute_vertex_normals()
vis = o3d.visualization.Visualizer()
vis.create_window()
render_option = vis.get_render_option()
render_option.background_color = np.asarray([0, 0, 0.2])
vis.add_geometry(mesh)
while vis.poll_events():
vis.update_renderer()
vis.destroy_window()
notebook上でVisualizerを使うと稀によくGLFWのエラーが出てしまうので注意!
Discussion