news 2026/6/11 4:16:34

Bottle 一条曲线通过旋转形成一个瓶子的mesh

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Bottle 一条曲线通过旋转形成一个瓶子的mesh

一:主要的知识点

1、说明

本文只是教程内容的一小段,因博客字数限制,故进行拆分。主教程链接:vtk教程——逐行解析官网所有Python示例-CSDN博客

2、知识点纪要

本段代码主要涉及的有①围绕某个轴旋转进行模型生成


二:代码及注释

import vtkmodules.vtkRenderingOpenGL2 from vtkmodules.vtkCommonColor import vtkNamedColors from vtkmodules.vtkCommonCore import vtkPoints from vtkmodules.vtkCommonDataModel import vtkCellArray, vtkPolyData from vtkmodules.vtkFiltersCore import vtkStripper, vtkTubeFilter from vtkmodules.vtkFiltersModeling import vtkRotationalExtrusionFilter from vtkmodules.vtkRenderingCore import ( vtkActor, vtkPolyDataMapper, vtkRenderWindow, vtkRenderWindowInteractor, vtkRenderer ) def main(): colors = vtkNamedColors() points = vtkPoints() points.InsertPoint(0, 0.01, 0.0, 0.0) points.InsertPoint(1, 1.5, 0.0, 0.0) points.InsertPoint(2, 1.5, 0.0, 3.5) points.InsertPoint(3, 1.25, 0.0, 3.75) points.InsertPoint(4, 0.75, 0.0, 4.00) points.InsertPoint(5, 0.6, 0.0, 4.35) points.InsertPoint(6, 0.7, 0.0, 4.65) points.InsertPoint(7, 1.0, 0.0, 4.75) points.InsertPoint(8, 1.0, 0.0, 5.0) points.InsertPoint(9, 0.2, 0.0, 5.0) lines = vtkCellArray() lines.InsertNextCell(10) # 创建一个新的单元(cell),需要参数指定这个单元需要多少个点 lines.InsertCellPoint(0) # 将这个点的ID添加到当前正在构建的单元中 lines.InsertCellPoint(1) lines.InsertCellPoint(2) lines.InsertCellPoint(3) lines.InsertCellPoint(4) lines.InsertCellPoint(5) lines.InsertCellPoint(6) lines.InsertCellPoint(7) lines.InsertCellPoint(8) lines.InsertCellPoint(9) profile = vtkPolyData() profile.SetPoints(points) profile.SetLines(lines) # 根据profile绕着某个轴进行旋转,获得一个完整的mesh extrude = vtkRotationalExtrusionFilter() extrude.SetInputData(profile) """ Resolution 控制 旋转拉伸时的分段数,也就是把 360° 拆分成多少个切片。 值越大,旋转生成的 3D 表面越平滑;值越小,表面就会显得棱角分明 """ extrude.SetResolution(60) """ extrude = vtkRotationalExtrusionFilter() extrude.SetInputData(profile) extrude.SetResolution(360) # 设置旋转后的 角度分辨率(采样数) extrude.SetTranslation(6) # 在旋转的同时沿着 Z 轴平移 6 个单位长度 extrude.SetDeltaRadius(1.0) # 表示在旋转过程中半径的变化量, 也就是每转一圈,物体的半径增加1个单位 extrude.SetAngle(2160.0) # 设置旋转的总角度 """ mapper = vtkPolyDataMapper() mapper.SetInputConnection(extrude.GetOutputPort()) bottle = vtkActor() bottle.SetMapper(mapper) bottle.GetProperty().SetColor(colors.GetColor3d("Mint")) """ vtkStripper 将一个网格中独立的多边形(通常是三角形或四边形)转换为三角形带(triangle strips)和多边形带(polygon strips) 方便渲染,但是在这个例子里,有没有这个区别不大,可以视为是一个优化方法。 """ stripper = vtkStripper() stripper.SetInputData(profile) # 将这条线进行膨胀并显示 tubes = vtkTubeFilter() tubes.SetInputConnection(stripper.GetOutputPort()) """ 下面这种写法,摒弃了stripper的优化,直接使用profile这个polydata也可以 """ tubes.SetInputConnection(stripper.GetOutputPort()) tubes.SetNumberOfSides(11) tubes.SetRadius(0.05) profileMapper = vtkPolyDataMapper() profileMapper.SetInputConnection(tubes.GetOutputPort()) profileActor = vtkActor() profileActor.SetMapper(profileMapper) profileActor.GetProperty().SetColor(colors.GetColor3d('Tomato')) renderer = vtkRenderer() renWin = vtkRenderWindow() renWin.AddRenderer(renderer) iren = vtkRenderWindowInteractor() iren.SetRenderWindow(renWin) renderer.AddActor(bottle) renderer.AddActor(profileActor) renderer.SetBackground(colors.GetColor3d('Burlywood')) renWin.SetSize(640, 480) renWin.SetWindowName('Bottle'); renWin.Render() renderer.GetActiveCamera().SetPosition(1, 0, 0) renderer.GetActiveCamera().SetFocalPoint(0, 0, 0) renderer.GetActiveCamera().SetViewUp(0, 0, 1) renderer.ResetCamera() renderer.GetActiveCamera().Azimuth(30) renderer.GetActiveCamera().Elevation(30) renWin.Render() iren.Start() if __name__ == '__main__': main()
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 13:54:57

15、探索 Spotlight 与 I/O 重定向的强大功能

探索 Spotlight 与 I/O 重定向的强大功能 1. 认识元数据与 mdls 命令 在计算机的日常使用中,我们常常会接触到与文件相关的数据,例如文件名、文件大小和创建日期等。但实际上,很多文件还包含了额外的补充信息,这些信息被称为元数据。元数据在 Spotlight 中起着核心作用。…

作者头像 李华
网站建设 2026/6/10 6:26:11

Qt 入门实战(二):HelloWorld 的两种方式与控件内存管理

Qt 学起来挺有意思的,但初学者往往会被一些细节绕晕。 在上一篇博客里,我们讲了 Qt 的环境搭建和基础概念,这篇我们直接来动手做一个最简单的 HelloWorld,顺便把控件的生命周期、堆栈分配、QString 这些关键点顺便梳理一下。一、H…

作者头像 李华
网站建设 2026/6/10 1:47:54

一体化负氧离子传感器:支持24小时连续在线监测,可实时输出数据

一体化负氧离子传感器是一款功能强大且高度集成的环境监测设备,在众多领域发挥着至关重要的作用。从功能上看,它以精准测量负氧离子浓度为核心,同时还能同步监测多种环境参数。像温度、湿度、PM2.5、PM10、气压、氧含量、噪声、风速、风向等&…

作者头像 李华
网站建设 2026/6/10 13:54:35

护网入门平民化挖掘技巧分享(思路+例子)

【网络安全干货】护网行动实战经验分享:漏洞挖掘到内网渗透的完整流程,新手必藏 文章分享了护网行动中的漏洞挖掘和渗透测试经验,包括0day、Nday漏洞利用,白盒与黑盒审计方法,以及普通人可用的指纹识别和接口泄露等技…

作者头像 李华
网站建设 2026/6/10 13:52:09

AI时代产品经理的救命稻草:零基础入门AI产品,薪资暴涨40-60%!

简介 传统产品经理技能在AI时代迅速贬值,63%企业转型AI产品,AI产品人才稀缺且薪资上涨40-60%。文章推广"零基础入门AI产品经理"课程,内容包括AI产品应用原理、行业案例解析和求职辅导,适合产品经理、创业者、程序员等人…

作者头像 李华