C4D材质基础:从金属到玻璃的质感模拟
2025/12/26 16:23:15
1、说明
本文只是教程内容的一小段,因博客字数限制,故进行拆分。主教程链接:vtk教程——逐行解析官网所有Python示例-CSDN博客
2、知识点纪要
本段代码主要涉及的有①透镜模型
import vtkmodules.vtkRenderingCore import vtkmodules.vtkInteractionStyle from vtkmodules.vtkCommonColor import vtkNamedColors from vtkmodules.vtkFiltersSources import vtkSphereSource from vtkmodules.vtkCommonDataModel import vtkSphere from vtkmodules.vtkFiltersCore import vtkFlyingEdges3D, vtkProbeFilter from vtkmodules.vtkIOImage import vtkMetaImageReader from vtkmodules.vtkCommonCore import vtkLookupTable from vtkmodules.vtkFiltersGeneral import vtkClipDataSet from vtkmodules.vtkRenderingCore import ( vtkActor, vtkCamera, vtkDataSetMapper, vtkProperty, vtkRenderWindow, vtkRenderWindowInteractor, vtkRenderer ) def main(): colors = vtkNamedColors() colors.SetColor('SkinColor', [240, 184, 160, 255]) colors.SetColor('BackfaceColor', [255, 229, 200, 255]) colors.SetColor('BkgColor', [51, 77, 102, 255]) file_name = "Data/FullHead.mhd" reader = vtkMetaImageReader() reader.SetFileName(file_name) reader.Update() skin_extractor = vtkFlyingEdges3D() skin_extractor.SetInputConnection(reader.GetOutputPort()) skin_extractor.SetValue(0, 500) clip_function = vtkSphere() clip_function.SetRadius(50) clip_function.SetCenter(73, 52, 15) skin_clip = vtkClipDataSet() skin_clip.SetInputConnection(skin_extractor.GetOutputPort()) skin_clip.SetClipFunction(clip_function) skin_clip.SetValue(0) skin_clip.GenerateClipScalarsOn() skin_clip.Update() skin_mapper = vtkDataSetMapper() skin_mapper.SetInputConnection(skin_clip.GetOutputPort()) skin_mapper.ScalarVisibilityOff() skin = vtkActor() skin.SetMapper(skin_mapper) skin.GetProperty().SetDiffuseColor(colors.GetColor3d('SkinColor')) back_prop = vtkProperty() back_prop.SetDiffuseColor(colors.GetColor3d('BackfaceColor')) skin.SetBackfaceProperty(back_prop) """ 定义透镜模型。这里的“透镜”指的就是用来显示内部组织的那个球形区域 vtkSphereSource 创建了一个几何体(一个由三角形网格组成的球),作为内部数据(体素强度)的载体 它的几何形状必须匹配用于裁剪等值面的隐式球体 """ lens_model = vtkSphereSource() lens_model.SetRadius(50) lens_model.SetCenter(73, 52, 15) lens_model.SetPhiResolution(201) lens_model.SetThetaResolution(101) """ vtkProbeFilter 是一个数据重采样过滤器,用于将一个数据集的属性(例如标量、矢量等)采样或映射到另一个数据集的几何结构上 在这里是实现将3D体积数据注入到球形几何体种的关键 """ lens_probe = vtkProbeFilter() """ 这里的SetInputConnection 定义了几何结构或查询点 输入的参数得是一个集合数据集,提供了要进行数据采样和属性附加的点的位置 """ lens_probe.SetInputConnection(lens_model.GetOutputPort()) """ SetSourceConnection 定义了属性值或数据源 输入的参数通常是一个带有属性值的数据集(通常是体积数据 vtkImageData 或 vtkUnstructuredGrid) """ lens_probe.SetSourceConnection(reader.GetOutputPort()) """ 这里以500为阈值,裁剪出符合指定标量值(500)的等值面 """ lens_clip = vtkClipDataSet() lens_clip.SetInputConnection(lens_probe.GetOutputPort()) # 正常人体体素值编码,空气,组织,皮肤和骨骼的排列顺序是 空气<软组织/水<皮肤/脂肪<骨骼 # 这里设皮肤为500,故只保留了内部组织或谷歌 lens_clip.SetValue(500) # lens_clip.InsideOutOn() # 保留<500的部分,默认关闭,所以源代码是保留>500的部分 lens_clip.GenerateClipScalarsOff() lens_clip.Update() bw_lut = vtkLookupTable() bw_lut.SetTableRange(0, 2048) bw_lut.SetSaturationRange(0, 0) bw_lut.SetHueRange(0, 0) bw_lut.SetValueRange(0.2, 1) bw_lut.Build() lens_mapper = vtkDataSetMapper() lens_mapper.SetInputConnection(lens_clip.GetOutputPort()) lens_mapper.SetScalarRange(lens_clip.GetOutput().GetScalarRange()) lens_mapper.SetLookupTable(bw_lut) lens = vtkActor() lens.SetMapper(lens_mapper) a_camera = vtkCamera() a_camera.SetViewUp(0, 0, -1) a_camera.SetPosition(0, -1, 0) a_camera.SetFocalPoint(0, 0, 0) a_camera.ComputeViewPlaneNormal() a_camera.Azimuth(30.0) a_camera.Elevation(30.0) a_renderer = vtkRenderer() ren_win = vtkRenderWindow() ren_win.AddRenderer(a_renderer) iren = vtkRenderWindowInteractor() iren.SetRenderWindow(ren_win) a_renderer.AddActor(lens) a_renderer.AddActor(skin) a_renderer.SetActiveCamera(a_camera) a_renderer.ResetCamera() a_camera.Dolly(1.5) a_renderer.SetBackground(colors.GetColor3d('BkgColor')) ren_win.SetSize(640, 480) ren_win.SetWindowName('TissueLens') a_renderer.ResetCameraClippingRange() ren_win.Render() iren.Initialize() iren.Start() if __name__ == '__main__': main()