一:主要的知识点
1、说明
本文只是教程内容的一小段,因博客字数限制,故进行拆分。主教程链接:vtk教程------逐行解析官网所有Python示例-CSDN博客
2、知识点纪要
本段代码主要涉及的有①创建一个vtkStructuredPoints数据并进行渲染展示
二:代码及注释
python
import vtkmodules.vtkRenderingOpenGL2
import vtkmodules.vtkInteractionStyle
from vtkmodules.vtkCommonDataModel import vtkStructuredPoints
from vtkmodules.vtkCommonColor import vtkNamedColors
from vtkmodules.vtkCommonCore import vtkDoubleArray
from vtkmodules.vtkFiltersCore import vtkContourFilter
from vtkmodules.vtkRenderingCore import (
vtkActor,
vtkPolyDataMapper,
vtkRenderWindow,
vtkRenderWindowInteractor,
vtkRenderer
)
def main():
colors = vtkNamedColors()
"""
vtkStructuredPoints 是 VTK 中最基础、最经典的规则体数据结构之一。在体数据(volume data)处理、医学影像(CT、MRI)、流场分析中用得非常多。
它和 vtkImageData 非常接近(后者是它的现代替代版本)。常用于医学图像,距离场、密度场,三维纹理数据
基本定义:
vtkStructuredPoints 表示一个**在三维空间中均匀分布(uniform spacing)**的点阵数据。
也就是说:网格点是规则排列的;每个点在空间中的位置是通过原点 + 坐标间距计算出来的;
每个点都可以有标量(scalar)、向量(vector)等数据。
它是一个"结构化、规则间距的点网格","非结构化"网格(如 vtkUnstructuredGrid)不同
数据组织方式:
属性 | 含义 |
Dimensions | 网格点的数量,例如 `(nx, ny, nz)` |
Origin | 起始点(左下角/原点坐标) |
Spacing | 各轴方向的网格间距 `(dx, dy, dz)` |
"""
vol = vtkStructuredPoints()
vol.SetOrigin(-0.5, -0.5, -0.5)
vol.SetDimensions(26, 26, 26)
sp = 1.0 / 25.0
vol.SetSpacing(sp, sp, sp)
scalars = vtkDoubleArray()
scalars.SetNumberOfComponents(1)
scalars.SetNumberOfTuples(26 * 26 * 26)
for k in range(0, 26):
z = -0.5 + k * sp
kOffset = k * 26 * 26
for j in range(0, 26):
y = -0.5 + j * sp
jOffset = j * 26
for i in range(0, 26):
x = -0.5 + i * sp
s = x * x + y * y + z * z - (0.4 * 0.4)
offset = i + jOffset + kOffset
scalars.InsertTuple1(offset, s) # offset 索引, s具体的标量值
# scalars.InsertNextTuple1(s) # 等价替代
vol.GetPointData().SetScalars(scalars)
# 等值面提取
contour = vtkContourFilter()
contour.SetInputData(vol)
contour.SetValue(0, 0.0)
volMapper = vtkPolyDataMapper()
volMapper.SetInputConnection(contour.GetOutputPort())
volMapper.ScalarVisibilityOff()
volActor = vtkActor()
volActor.SetMapper(volMapper)
volActor.GetProperty().EdgeVisibilityOn()
volActor.GetProperty().SetColor(colors.GetColor3d('Salmon'))
renderer = vtkRenderer()
renWin = vtkRenderWindow()
renWin.AddRenderer(renderer)
iren = vtkRenderWindowInteractor()
iren.SetRenderWindow(renWin)
renderer.AddActor(volActor)
renderer.SetBackground(colors.GetColor3d('SlateGray'))
renWin.SetSize(512, 512)
renWin.SetWindowName('Vol')
# Interact with the data.
renWin.Render()
iren.Start()
if __name__ == '__main__':
main()