前言
本人菜狗一枚,第一次寫文章,python懂的也不多,肯定有很多表述存在問題,如有錯(cuò)誤請大佬們不吝賜教。
整個(gè)open3d的gui我是照著源碼里的示例和官方文檔摸出來的,因?yàn)榇_實(shí)很少有關(guān)于這個(gè)的教程,官方也沒給。所以我順便整理分享一下。
Open3D官網(wǎng)
官方文檔
open3d版本:0.14.1
Open3D安裝:
閑話少說,直接開整。
Pip
pip install open3d
Conda
conda install -c open3d-admin -c conda-forge open3d
第一個(gè)Open3D窗口
Open3d提供了很多種可視化方案,同時(shí)也提供了一個(gè)open3d.visualization.gui
模塊和open3d.visualization.rendering
模塊用來快速構(gòu)建小應(yīng)用。
1. 導(dǎo)入相應(yīng)模塊
import open3d as o3d
import open3d.visualization.gui as gui
import open3d.visualization.rendering as rendering
-
o3d
提供所有的Open3d模塊,包括常用的模型加載(o3d.io
),幾何和數(shù)據(jù)結(jié)構(gòu)(o3d.geometry
)等。 -
gui
提供了應(yīng)用的全局實(shí)例(gui.Application.instance
),和全部可用的控件。 -
rendering
提供了場景模型渲染的相關(guān)部分。
2. 初始化應(yīng)用實(shí)例并創(chuàng)建窗口
我們定義一個(gè)應(yīng)用類,用來創(chuàng)建界面,界面布局和相應(yīng)事件等設(shè)置都應(yīng)該在__init__
中完成。
class App:
def __init__(self):
# 初始化實(shí)例
gui.Application.instance.initialize()
# 創(chuàng)建主窗口
self.window = gui.Application.instance.create_window('My First Window', 800, 600)
# 創(chuàng)建顯示場景
self.scene = gui.SceneWidget()
self.scene.scene = rendering.Open3DScene(self.window.renderer)
# 將場景添加到窗口中
self.window.add_child(self.scene)
# 創(chuàng)建一個(gè)球
sphere = o3d.geometry.TriangleMesh.create_sphere()
sphere.paint_uniform_color([0.0, 1.0, 1.0])
sphere.compute_vertex_normals()
material = rendering.MaterialRecord()
material.shader = 'defaultLit'
# 將球加入場景中渲染
self.scene.scene.add_geometry("Sphere", sphere, material)
# 設(shè)置相機(jī)屬性
bounds = sphere.get_axis_aligned_bounding_box()
self.scene.setup_camera(60, bounds, bounds.get_center())
def run(self):
gui.Application.instance.run()
if __name__ == "__main__":
app = App()
app.run()
2.1 初始化
當(dāng)我們想要使用gui
模塊創(chuàng)建一個(gè)應(yīng)用程序時(shí),在使用任何控件之前,必須先初始化全局應(yīng)用單例gui.Application.instance
gui.Application.instance.initialize()
初始化有兩種方式,其中的一種必須首先被調(diào)用。
- initialize(self: gui.Application) -> None
- 使用默認(rèn)的資源初始化。
- initialize(self: gui.Application, arg0: str) -> None
- arg0是資源文件路徑(resources),用該資源初始化。
2.2 創(chuàng)建窗口
當(dāng)應(yīng)用初始化后,我們就可以通過全局應(yīng)用單例創(chuàng)建窗口了,我們將窗口命名為”My First Window“。
self.window = gui.Application.instance.create_window('My First Window', 800, 600)
該函數(shù)原型是:
create_window
(self: open3d.cpu.pybind.visualization.gui.Application, title: str = ‘’, width: int = - 1, height: int = - 1, x: int = - 1, y: int = - 1, flags: int = 0) → open3d::visualization::gui::PyWindow
- title是應(yīng)用窗口名稱,即左上角的title。
- width和height是窗口大小。
- x, y和flag是可選的。(我也不曉得是啥)
該函數(shù)返回一個(gè)應(yīng)用窗口。
2.3 添加場景
有了窗口之后,我們可以向窗口里添加一個(gè)組件gui.SceneWidget
,這個(gè)控件是用來展示3D模型的場景。
self.scene = gui.SceneWidget()
self.scene.scene = rendering.Open3DScene(self.window.renderer)
gui.SceneWidget()
返回一個(gè)空的組件,所以我們必須為組件添加一個(gè)渲染器。這個(gè)渲染器可以直接用主窗口的渲染器(即self.window.renderer
)來初始化。
之后,我們將創(chuàng)建的控件作為主窗口的子控件添加到應(yīng)用中。通過調(diào)用窗口的add_child()
完成。
self.window.add_child(self.scene)
2.4 添加模型
在之前的步驟中,我們創(chuàng)建了一個(gè)空的場景,我們可以向場景中添加不同的模型進(jìn)行渲染。每個(gè)模型都有一個(gè)對應(yīng)的材質(zhì)(Material),用來決定模型的顏色、紋理、著色模型、光照等。
這里我們創(chuàng)建一個(gè)在圓心在原點(diǎn)(0,0,0)的球和對應(yīng)材質(zhì)。
material.shader= 'defaultLit'
表示使用默認(rèn)的光照模型進(jìn)行著色。由于光照模型需要法向量信息,所以我們需要計(jì)算球頂點(diǎn)的法向量。
sphere = o3d.geometry.TriangleMesh.create_sphere()
sphere.paint_uniform_color([0.0, 1.0, 1.0])
sphere.compute_vertex_normals()
material = rendering.Material()
material.shader = 'defaultLit'
準(zhǔn)備好模型就可以將其添加到場景中了。
self.scene.scene.add_geometry("Sphere", sphere, material)
- 第一個(gè)參數(shù)是模型的名字,之后可以用這個(gè)唯一的名字操作相應(yīng)的模型(如隱藏該模型)。
- 第二個(gè)參數(shù)是模型,類型是
o3d.geometry.Geometry3D
或o3d.geometry.Geometry
, - 第三個(gè)參數(shù)是模型材質(zhì)。
2.5 相機(jī)屬性
場景中有了模型,我們需要設(shè)置相機(jī)來觀察模型。
bounds = sphere.get_axis_aligned_bounding_box()
self.scene.setup_camera(60, bounds, bounds.get_center())
設(shè)置場景的相機(jī)通過setup_camera()
實(shí)現(xiàn),其原型之一如下:
setup_camera(field_of_view, model_bounds, center_of_rotation)
- 第一個(gè)參數(shù)決定視野范圍FOV;
- 第二個(gè)參數(shù)是模型的包圍盒,可以通過
get_axis_aligned_bounding_box
來獲得;- 第三個(gè)參數(shù)是攝像機(jī)的旋轉(zhuǎn)中心;
2.6 循環(huán)事件
此時(shí)我們已經(jīng)創(chuàng)建好了窗口,添加了模型,要讓應(yīng)用開始運(yùn)行,只需要讓全局單例跑起來。
gui.Application.instance.run()
這樣應(yīng)用就會(huì)一直運(yùn)行直到關(guān)閉,而不會(huì)閃一下就結(jié)束。
3.運(yùn)行結(jié)果
運(yùn)行這個(gè)程序,你將會(huì)得到一個(gè)可以旋轉(zhuǎn)的青色球。文章來源:http://www.zghlxwxcb.cn/news/detail-411964.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-411964.html
到了這里,關(guān)于Open3D-GUI系列教程(一)創(chuàng)建一個(gè)Open3D應(yīng)用窗口的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!