news 2026/4/18 11:11:01

FlatVersusGouraud 对比平面着色和高洛德着色

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
FlatVersusGouraud 对比平面着色和高洛德着色

一:主要的知识点

1、说明

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

2、知识点纪要

本段代码主要涉及的有①平面着色与高洛德着色的区别


二:代码及注释

import vtkmodules.vtkRenderingOpenGL2 import vtkmodules.vtkInteractionStyle from vtkmodules.vtkCommonColor import vtkNamedColors from vtkmodules.vtkIOGeometry import vtkOBJReader from vtkmodules.vtkFiltersSources import vtkSphereSource, vtkCylinderSource from collections import OrderedDict from vtkmodules.vtkRenderingCore import vtkPolyDataMapper, vtkActor, vtkRenderer, vtkRenderWindow, \ vtkRenderWindowInteractor from vtkmodules.vtkCommonDataModel import vtkQuadric from vtkmodules.vtkImagingHybrid import vtkSampleFunction from vtkmodules.vtkFiltersCore import vtkContourFilter def CreateIsoSurface(flat): quadric = vtkQuadric() quadric.SetCoefficients(1, 2, 3, 0, 1, 0, 0, 0, 0, 0) sample = vtkSampleFunction() sample.SetSampleDimensions(25, 25, 25) sample.SetImplicitFunction(quadric) # Generate the implicit surface. contour = vtkContourFilter() contour.SetInputConnection(sample.GetOutputPort()) range = [1.0, 6.0] contour.GenerateValues(5, range) # Map the contour. contourMapper = vtkPolyDataMapper() contourMapper.SetInputConnection(contour.GetOutputPort()) contourMapper.SetScalarRange(0, 7) actor = vtkActor() actor.SetMapper(contourMapper) if flat: actor.GetProperty().SetInterpolationToFlat() else: actor.GetProperty().SetInterpolationToGouraud() renderer = vtkRenderer() renderer.AddActor(actor) return renderer def CreateModel(flat, fileName): ''' :param flat: The interpolation to use (flat or Gouraud). :param fileName: The file name. :return: the renderer ''' colors = vtkNamedColors() reader = vtkOBJReader() reader.SetFileName(fileName) mapper = vtkPolyDataMapper() mapper.SetInputConnection(reader.GetOutputPort()) actor = vtkActor() actor.SetMapper(mapper) actor.GetProperty().SetColor(colors.GetColor3d('Tan')) if flat: actor.GetProperty().SetInterpolationToFlat() else: actor.GetProperty().SetInterpolationToGouraud() renderer = vtkRenderer() renderer.AddActor(actor) return renderer def CreateCylinder(flat): colors = vtkNamedColors() cylinder = vtkCylinderSource() mapper = vtkPolyDataMapper() mapper.SetInputConnection(cylinder.GetOutputPort()) actor = vtkActor() actor.SetMapper(mapper) actor.GetProperty().SetColor(colors.GetColor3d('MistyRose')) if flat: actor.GetProperty().SetInterpolationToFlat() else: actor.GetProperty().SetInterpolationToGouraud() renderer = vtkRenderer() renderer.AddActor(actor) return renderer def CreateSphere(flat): colors = vtkNamedColors() sphere = vtkSphereSource() mapper = vtkPolyDataMapper() mapper.SetInputConnection(sphere.GetOutputPort()) actor = vtkActor() actor.SetMapper(mapper) actor.GetProperty().SetColor(colors.GetColor3d('MistyRose')) if flat: actor.GetProperty().SetInterpolationToFlat() else: actor.GetProperty().SetInterpolationToGouraud() renderer = vtkRenderer() renderer.AddActor(actor) return renderer def main(): """ 平面着色 SetInterpolationToFlat 原理: 对多边形(三角形或四边形)的整个表面使用一个恒定的颜色和法向量计算亮度 视觉效果: 结果是棱角分明的。可以看到组成曲面的各个多边形的边界,常用于显示模型的实际拓扑结构或模拟低多边形艺术风格 高洛德着色 SetInterpolationToGouraud 原理: 在多边形的顶点处计算颜色和亮度,然后将这些颜色值在多边形内部进行线性插值 视觉效果: 结果是平滑且连续的。它极大地减少了多边形边缘的可见性,使低分辨率的曲面看起来更圆滑,更逼真 """ colors = vtkNamedColors() fileName = "Data/cow.obj" renderers = OrderedDict() renderers['flatSphereRenderer'] = CreateSphere(True) renderers['flatCylinderRenderer'] = CreateCylinder(True) renderers['flatIsoSurfaceRenderer'] = CreateIsoSurface(True) renderers['flatModelRenderer'] = CreateModel(True, fileName) renderers['smoothSphereRenderer'] = CreateSphere(False) renderers['smoothCylinderRenderer'] = CreateCylinder(False) renderers['smoothIsoSurfaceRenderer'] = CreateIsoSurface(False) renderers['smoothModelRenderer'] = CreateModel(False, fileName) keys = list(renderers.keys()) renderWindow = vtkRenderWindow() # Setup the viewports for the renderers. rendererSize = 256 xGridDimensions = 4 yGridDimensions = 2 renderWindow.SetSize(rendererSize * xGridDimensions, rendererSize * yGridDimensions) renderWindow.SetWindowName('FlatVersusGouraud') for row in range(0, yGridDimensions): for col in range(0, xGridDimensions): # (xmin, ymin, xmax, ymax) viewport = [0] * 4 viewport[0] = col / xGridDimensions viewport[1] = (yGridDimensions - (row + 1)) / yGridDimensions viewport[2] = (col + 1) / xGridDimensions viewport[3] = (yGridDimensions - row) / yGridDimensions index = row * xGridDimensions + col renderers[keys[index]].SetViewport(viewport) for r in range(0, len(renderers)): renderers[keys[r]].SetBackground(colors.GetColor3d('SlateGray')) renderers[keys[r]].GetActiveCamera().Azimuth(20) renderers[keys[r]].GetActiveCamera().Elevation(30) renderers[keys[r]].ResetCamera() if r > 3: renderers[keys[r]].SetActiveCamera(renderers[keys[r - 4]].GetActiveCamera()) renderWindow.AddRenderer(renderers[keys[r]]) interactor = vtkRenderWindowInteractor() interactor.SetRenderWindow(renderWindow) renderWindow.Render() interactor.Start() if __name__ == '__main__': main()
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 20:45:22

GradientBackground 比较不同类型的背景渐变着色模式与坐标转换

一:主要的知识点 1、说明 本文只是教程内容的一小段,因博客字数限制,故进行拆分。主教程链接:vtk教程——逐行解析官网所有Python示例-CSDN博客 2、知识点纪要 本段代码主要涉及的有①背景渐变着色的区分,②vtkCoo…

作者头像 李华
网站建设 2026/4/17 19:27:52

Firebase Admin PHP SDK:企业级后端开发的终极解决方案

Firebase Admin PHP SDK:企业级后端开发的终极解决方案 【免费下载链接】firebase-php Unofficial Firebase Admin SDK for PHP 项目地址: https://gitcode.com/gh_mirrors/fi/firebase-php Firebase Admin PHP SDK 是一个专为 PHP 开发者设计的非官方 Fireb…

作者头像 李华
网站建设 2026/4/18 3:47:11

Proteus 8 Professional中Keil调试信息输出的配置方法

在 Proteus 中“看见”程序运行:手把手教你配置 Keil 调试信息输出你有没有过这样的经历?写完一段单片机代码,烧进开发板后却不知道它到底干了什么。LED 不亮、串口没输出、变量值对不上……调试像在黑箱里摸索,全靠猜。如果能在电…

作者头像 李华
网站建设 2026/4/18 3:43:51

操作指南:Proteus下载安装后元件库缺失解决方法

解决Proteus安装后元件库找不到的完整实战指南你是不是也遇到过这种情况:好不容易搜到一个“Proteus下载安装”教程,兴冲冲地装完打开软件,结果一搜索“电阻”、“电容”、“AT89C51”,却发现什么都没有?“Pick Device…

作者头像 李华
网站建设 2026/4/18 3:48:49

Lottie-web终极评测:从设计到开发的无缝动画协作方案

Lottie-web终极评测:从设计到开发的无缝动画协作方案 【免费下载链接】lottie-web 项目地址: https://gitcode.com/gh_mirrors/lot/lottie-web 在当今追求极致用户体验的时代,网页动画已成为提升用户参与度和品牌形象的关键要素。传统动画开发方…

作者头像 李华
网站建设 2026/4/18 3:50:10

Zynq平台下XADC采集模拟信号项目应用

基于Zynq平台的XADC高精度模拟信号采集实战指南你有没有遇到过这样的场景:系统里接了几个温度、电压传感器,原本以为很简单,结果发现外部ADC芯片占PCB空间不说,SPI通信还卡顿,采样频率上不去,CPU整天忙着轮…

作者头像 李华