利用Python绘制三维的规则体(3维柱体、立方体和旋转棱柱)

给大家分享几种用python绘制三维的几何体的方法:

1.3维柱体

import vtk

# *************柱体****************
# 生成一个中心在渲染场景原点的柱体,柱体的长轴沿着Y轴,柱体的高度、截面半径等都可以任意指定
cylinder = vtk.vtkCylinderSource()
# 高
cylinder.SetHeight(3.0)
# 截面半径
cylinder.SetRadius(1.0)
# 横截面边数
cylinder.SetResolution(360)
print(f"高:{cylinder.GetHeight()}、半径:{cylinder.GetRadius()}、面:{cylinder.GetResolution()}")
# 映射,将输入的数据转换为几何图元(点、线、多边形)进行渲染
cylinderMapper = vtk.vtkPolyDataMapper()
# 设置 VTK 可视化管线的输入数据接口,对应的可视化管线输出数据的接口为 GetOutputPort()
cylinderMapper.SetInputConnection(cylinder.GetOutputPort())

# 三维空间中渲染对象最常用的 vtkProp 子类是 vtkActor(表达场景中的几何数据)和 vtkVolume(表达场景中的体数据)
"""vtkProp子类负责确定渲染场景中对象的位置、大小和方向信息。
Prop依赖于两个对象(Prop一词来源于戏剧里的“道具”,在VTK里表示的是渲染场景中可以看得到的对象。)
一个是Mapper(vtkMapper)对象,负责存放数据和渲染信息,另一个是属性(vtkProperty)对象,负责控制颜色、不透明度等参数。
"""
cylinderActor = vtk.vtkActor()
# 绘制对象添加映射器,设置生成几何图元的Mapper,即连接一个Actor到可视化管线的末端(可视化管线的末端就是Mapper)
cylinderActor.SetMapper(cylinderMapper)

# 绘制器,负责管理场景的渲染过程。
# 组成场景的所有对象包括Prop,照相机(Camera)和光照(Light)都被集中在一个vtkRenderer对象中。
# 一个vtkRenderWindow中可以有多个vtkRenderer对象,而这些vtkRenderer可以渲染在窗口中不同的矩形区域中(即视口),或者覆盖整个窗口区域。
renderer = vtk.vtkRenderer()
# 绘制器添加对象,添加vtkProp类型的对象到渲染场景中
renderer.AddActor(cylinderActor)
# 绘制器设置背景,设置渲染场景的背景颜色
renderer.SetBackground(0.1,0.2,0.4)
print("Renderer bg:",renderer.GetBackground())
# SetBackground2()用于设置渐变的另外一种颜色
renderer.SetBackground2(1.0,1.0,1.0)
# 打开背景颜色渐变效果,相当于调用方法 GradientBackgroundOn()
renderer.SetGradientBackground(1)


# 绘制窗口,将操作系统与VTK渲染引擎连接到一起
renWin = vtk.vtkRenderWindow()
# 绘制窗口添加绘制器,加入 vtkRenderer 对象
renWin.AddRenderer(renderer)
# 设置窗口的大小,以像素为单位
renWin.SetSize(1200,1200)
print("Window size:",renWin.GetSize())
# 绘制窗口内所有绘制器同步渲染绘制
#renWin.Render()
# 交互器,提供平台独立的响应鼠标、键盘和时钟事件的交互机制
"""vtkRenderWindowInteractor自动建立一个默认的3D场景交互器样式(Interactor Style):vtkInteractorStyleSwitch,
当然你也可以选择其他的交互器样式,或者是创建自己的交互器样式"""
i_ren = vtk.vtkRenderWindowInteractor()
# 交互器绑定绘制窗口,设置渲染窗口,消息是通过渲染窗口捕获到的,所以必须要给交互器对象设置渲染窗口
i_ren.SetRenderWindow(renWin)
# 为处理窗口事件做准备,交互器工作之前必须先调用这个方法进行初始化
i_ren.Initialize()
# 开始进入事件响应循环,交互器处于等待状态,等待用户交互事件的发生
i_ren.Start()

运行结果:

 2:立方体

import vtk
# 1. 读取数据
cube = vtk.vtkCubeSource()
cube.Update()#记得加这句不加看不到模型
# 2. 建图(将点拼接成立方体)
cube_mapper = vtk.vtkPolyDataMapper()
cube_mapper.SetInputData(cube.GetOutput())
# 3. 根据2创建执行单元
cube_actor = vtk.vtkActor()
cube_actor.SetMapper(cube_mapper)

cube_actor.GetProperty().SetColor(1.0, 0.0, 0.0)
# 4. 渲染(将执行单元和背景组合在一起按照某个视角绘制)
renderer = vtk.vtkRenderer()
renderer.SetBackground(0.0, 0.0, 0.0)#背景只有一个所以是Set()
renderer.AddActor(cube_actor)#因为actor有可能为多个所以是add()

# 5. 显示渲染窗口
render_window = vtk.vtkRenderWindow()
render_window.SetWindowName("My First Cube")
render_window.SetSize(400,400)
render_window.AddRenderer(renderer)# 渲染也会有可能有多个渲染把他们一起显示
# 6. 创建交互控键(可以用鼠标拖来拖去看三维模型)
interactor = vtk.vtkRenderWindowInteractor()
interactor.SetRenderWindow(render_window)
interactor.Initialize()
render_window.Render()
interactor.Start()

运行结果:

 3:旋转棱柱:

import vtk
import time

cone = vtk.vtkConeSource()
cone.SetHeight(3.0)
cone.SetRadius(1.0)
cone.SetResolution(10)

coneMapper = vtk.vtkPolyDataMapper()
coneMapper.SetInputConnection(cone.GetOutputPort())

coneActor = vtk.vtkActor()
coneActor.SetMapper(coneMapper)

ren1 = vtk.vtkRenderer()
ren1.AddActor(coneActor)
ren1.SetBackground(0.1, 0.2, 0.4)

renWin = vtk.vtkRenderWindow()
renWin.AddRenderer(ren1)
renWin.SetSize(300, 300)

for i in range(0, 360):
    time.sleep(0.08)
    renWin.Render()
    ren1.GetActiveCamera().Azimuth(i)

 

  • 2
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YinHeCS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值