使用VTK创建生物细胞的3D模型——我的第1篇博客

细胞在生物学中是一个常见的概念,它是构成生命体的基本单位。细胞结构复杂多样,但通常由细胞质、细胞膜和细胞核组成。而在计算机图形学中,我们可以使用VTK(Visualization Toolkit)来创建和展示生物细胞的三维模型。

下面是一个使用VTK创建简单细胞模型的Python代码。

注意需要先引入VTK库,安装VTK库。可以从官方网站(https://vtk.org/download/)下载预编译二进制文件或源代码进行安装。

首先,我们通过VTK创建外部细胞膜,即一个球体。我们调用vtkSphereSource()来创建一个球体,并使用SetThetaResolution()和SetPhiResolution()设置球体的细分程度。然后我们创建一个vtkPolyDataMapper来将球体数据映射到渲染窗口,接着使用vtkActor将渲染器中显示的对象与其属性关联起来。在这里我们选择灰色并减小了透明度。

接下来创建细胞核和液泡。跟细胞膜一样,我们调用vtkSphereSource()创建一个球体,分别表示细胞核和液泡。对于液泡,我们还通过vtkTransform()设置其位置。然后再将球体数据映射到vtkActor上。

为了生成完整的细胞模型,我们需要将上述创建的所有球体组合为一个PolyData。我们使用vtkAppendPolyData()来处理数据,并将数据映射到Actor上。

最后,我们设置相机和灯光的位置。在这个例子中,相机位于(1.5, 0.5, 3),指向细胞质中心(0,0,0)。我们还创建了一个灯光以提高模型的可见性。

程序运行效果:

 

接下来请看完整的Python代码:

import vtk

# 创建外部细胞膜
sphere = vtk.vtkSphereSource()
sphere.SetThetaResolution(50)
sphere.SetPhiResolution(50)
sphere.SetRadius(1.0)

# 创建外壳材质和颜色
outer_mapper = vtk.vtkPolyDataMapper()
outer_mapper.SetInputConnection(sphere.GetOutputPort())

outer_actor = vtk.vtkActor()
outer_actor.SetMapper(outer_mapper)
outer_actor.GetProperty().SetColor(0.7, 0.7, 0.7)
outer_actor.GetProperty().SetOpacity(0.2)

# 创建细胞核
inner_sphere = vtk.vtkSphereSource()
inner_sphere.SetThetaResolution(50)
inner_sphere.SetPhiResolution(50)
inner_sphere.SetRadius(0.3)

# 创建液泡
vacuole_sphere = vtk.vtkSphereSource()
vacuole_sphere.SetThetaResolution(10)
vacuole_sphere.SetPhiResolution(10)
vacuole_sphere.SetRadius(0.15)

# 移动液泡的位置
vacuole_transform = vtk.vtkTransform()
vacuole_transform.Translate(0.5, 0.2, 0.5)

vacuole_transform_filter = vtk.vtkTransformPolyDataFilter()
vacuole_transform_filter.SetInputConnection(vacuole_sphere.GetOutputPort())
vacuole_transform_filter.SetTransform(vacuole_transform)

vacuole_mapper = vtk.vtkPolyDataMapper()
vacuole_mapper.SetInputConnection(vacuole_transform_filter.GetOutputPort())

vacuole_actor = vtk.vtkActor()
vacuole_actor.SetMapper(vacuole_mapper)
vacuole_actor.GetProperty().SetColor(1, 1, 0)
vacuole_actor.GetProperty().SetOpacity(0.5)

# 根据内壳生成圆球,表示细胞质
inner_sphere.SetCenter(0, 0, 0)
# 创建组合过的 PolyData
combine_filter = vtk.vtkAppendPolyData()
combine_filter.AddInputConnection(inner_sphere.GetOutputPort())
combine_filter.AddInputConnection(vacuole_transform_filter.GetOutputPort())
combine_filter.AddInputConnection(sphere.GetOutputPort())
combine_mapper = vtk.vtkPolyDataMapper()
combine_mapper.SetInputConnection(combine_filter.GetOutputPort())

# 创建内部 Actor 并将内部 PolyDataMapper 分配给它
inner_actor = vtk.vtkActor()
inner_actor.SetMapper(combine_mapper)
inner_actor.GetProperty().SetColor(1, 0.5, 0.5)
inner_actor.GetProperty().SetOpacity(0.2)

# 设置相机和灯光位置
camera = vtk.vtkCamera()
camera.SetPosition(1.5, 0.5, 3)
camera.SetFocalPoint(0, 0, 0)

light = vtk.vtkLight()
light.SetPosition(0, 0, 3)

# 渲染器和窗口
renderer = vtk.vtkRenderer()
renderer.AddActor(outer_actor)
renderer.AddActor(inner_actor)
renderer.AddActor(vacuole_actor)
renderer.SetActiveCamera(camera)
renderer.AddLight(light)

render_window = vtk.vtkRenderWindow()
render_window.AddRenderer(renderer)

interactor = vtk.vtkRenderWindowInteractor()
interactor.SetRenderWindow(render_window)
render_window.SetWindowName("saccharomyces")  # 设置窗口标题

# 渲染和交互
interactor.Initialize()
render_window.Render()
interactor.Start()

细胞模型现在已经完成了,我们可以将其导出为图片或视频,或者通过交互式操作来展示、观察。在本例中,我们使用vtkRenderWindowInteractor()启动交互式窗口,可以通过鼠标和键盘来操纵视角。

总之,使用VTK可以很方便地创建和展示生物细胞模型,这不仅可以是生物学研究的有用工具,也可以作为计算机图形学的一个有趣的项目。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在Qt中使用VTK(Visualization Toolkit)加载obj3d模型,您可以使用VTK的Qt插件,即VTK的Qt渲染窗口类QVTKOpenGLNativeWidget。 以下是一个简单的示例代码: ```cpp #include <vtkSmartPointer.h> #include <vtkOBJReader.h> #include <vtkPolyDataMapper.h> #include <vtkActor.h> #include <vtkRenderer.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h> #include <QVTKOpenGLNativeWidget.h> #include <QVBoxLayout> #include <QApplication> #include <QWidget> int main(int argc, char *argv[]) { QApplication app(argc, argv); // 创建Qt窗口和布局 QWidget *widget = new QWidget(); QVBoxLayout *layout = new QVBoxLayout(widget); // 创建QVTKOpenGLNativeWidget并添加到布局中 QVTKOpenGLNativeWidget *vtkWidget = new QVTKOpenGLNativeWidget(); layout->addWidget(vtkWidget); // 创建VTK渲染器和渲染窗口 vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New(); vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New(); renderWindow->AddRenderer(renderer); // 将QVTKOpenGLNativeWidget与VTK渲染窗口关联 vtkWidget->SetRenderWindow(renderWindow); // 加载obj3d模型 vtkSmartPointer<vtkOBJReader> reader = vtkSmartPointer<vtkOBJReader>::New(); reader->SetFileName("path/to/your/model.obj"); reader->Update(); // 创建VTK演员和映射器 vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New(); mapper->SetInputConnection(reader->GetOutputPort()); vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New(); actor->SetMapper(mapper); // 将演员添加到渲染器中 renderer->AddActor(actor); // 显示窗口 widget->show(); // 运行Qt事件循环 return app.exec(); } ``` 在上面的代码中,我们创建了一个Qt窗口和布局,然后创建了一个QVTKOpenGLNativeWidget并将其添加到布局中。然后,我们创建了一个VTK渲染器和渲染窗口,并将QVTKOpenGLNativeWidget与VTK渲染窗口关联。接下来,我们加载obj3d模型创建VTK演员和映射器。最后,我们将演员添加到渲染器中,并显示窗口。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值