之前的那篇画体的demo,实现了一个画柱体,正好补充一下vtk的纹理总结吧
额,首先什么叫纹理?
实际上就是给vtk里的actor穿上衣服
具体操作:上代码:(从网上看的,但是忘记链接了,如果有问题请联系,我删除此篇)
# -*- coding: utf-8 -*-
# !/usr/bin/env python
import vtk
cylinder=vtk.vtkCylinderSource()
cylinder.SetHeight(3.0)
cylinder.SetRadius(1.0)
cylinder.SetResolution(360)
# 三维空间中渲染对象最常用的vtkProp子类 是vtkActor(表达场景中的几何数据)和 vtkVolume(表达场景中的体数据)
"""vtkProp子类负责确定渲染场景中对象的位置、大小和方向信息。
Prop依赖于两个对象(Prop一词来源于戏剧里的“道具”,在VTK里表示的是渲染场景中可以看得到的对象。)
一个是Mapper(vtkMapper)对象,负责存放数据和渲染信息,另一个是属性(vtkProperty)对象,负责控制颜色、不透明度等参数。
"""
mapper=vtk.vtkPolyDataMapper()
mapper.SetInputConnection(cylinder.GetOutputPort())
# 读取 bmp 背景图片
bmpReader = vtk.vtkBMPReader()
bmpReader.SetFileName("C:\\Users\\wanji\\Desktop\\star.bmp")
# 纹理
texture=vtk.vtkTexture()
# 数据接口联通纹理
texture.SetInputConnection(bmpReader.GetOutputPort())
# 插入纹理
texture.InterpolateOn()
actor=vtk.vtkActor()
actor.SetMapper(mapper)
# 设置纹理属性
actor.SetTexture(texture)
ren=vtk.vtkRenderer()
ren.SetBackground(0.8,0.3,0.8)
ren.SetBackground(0.3,0.5,0.9)
ren.SetGradientBackground(1)
ren.AddActor(actor)
ren_window=vtk.vtkRenderWindow()
ren_window.SetWindowName('axiong first cube')
ren_window.SetSize(300,300)
ren_window.AddRenderer(ren)
interactor=vtk.vtkRenderWindowInteractor()
interactor.SetRenderWindow(ren_window)
style=vtk.vtkInteractorStyleMultiTouchCamera()
interactor.SetInteractorStyle(style)
interactor.Initialize()
ren_window.Render()
interactor.Start()
简单说一下,就是给actor穿上了一层衣服。
像画点的时候就说过,想给演员加颜色:
actor.GetProperty().SetColor(0.0,1.0,0.0)
demo里还增添了一步读取照片底色的接口:
bmpReader = vtk.vtkBMPReader() bmpReader.SetFileName("C:\\Users\\wanji\\Desktop\\star.bmp")
路径更改为你自己的路径(把照片下载下来的路径)
texture=vtk.vtkTexture() texture.SetInputConnection(bmpReader.GetOutputPort()) texture.InterpolateOn() actor.SetTexture(texture)
之后这四句话就把照片的底色穿到actor上边
纹理的操作并不止于此,还记得我画线的一篇里,有一个图片是实线了一个高精度地图的道路么?
但是那时候的需求只是简单的把斑马线等画出来,区分实现虚线即可,如果加上纹理,你乐意在道路线之间穿上衣服,形成一个路面,,,,,, (代码保密)
除此之外,代码中还有段注释,是关于介绍vtkProp的,可以结合着画点时的三张关系图理解一下