vtk中的纹理贴图详解

vtk中的纹理贴图要用 vtkTextureMapToPlane vtkTextureMapToSphere  vtkTextureMapToCylinder与 vtkTransformTextureCoords 配合使用才能达到最好的效果。

目前vtk只支持2维纹理,3维纹理似乎并不支持。

那么vtk的纹理是如何工作的呢??

那么我们通过自己的一段代码来解释一下:

我们用vtk的tcl来解释代码了。

首先定义一个面 这是一个竖直的面
vtkPoints points
    points InsertPoint 0 0 0 0
    points InsertPoint 1 100 100 0
    points InsertPoint 2 100 100 11
    points InsertPoint 3 0 0 11

定义这个面顶点索引
vtkCellArray lines
    lines InsertNextCell 4;#number of points
    lines InsertCellPoint 0
    lines InsertCellPoint 1
    lines InsertCellPoint 2
    lines InsertCellPoint 3

将点和多边形加入polydata。

vtkPolyData profile
    profile SetPoints points
    profile SetPolys lines

计算多边形的发向量。
vtkPolyDataNormals normal
    normal SetInput profile

设置多边形的纹理映射模式
设置为plane模式
vtkTextureMapToPlane tmapper
  tmapper SetInputConnection [normal GetOutputPort]

设置纹理st坐标系的顶点坐标 和两点坐标,定义了st坐标系
  tmapper SetOrigin  0 0 0
  tmapper SetPoint1  100 100 0
  tmapper SetPoint2  0 0 11

对纹理映射进行计算
vtkTransformTextureCoords xform
  xform SetInputConnection [tmapper GetOutputPort]
设置贴图重复比例 第一项是指s 第二项是指t 第三项是指r 一般是1
14:1是根据上面点坐标的数据估算出来的。如果将t坐标定义为1,那么就将纹理向s方向贴14格,也就是说,纹理在这个面片上横着14张
  xform SetScale 14 1 1

读取纹理图像
vtkBMPReader bmpReader
  bmpReader SetFileName "c://masonry.bmp"
vtkTexture atext
  atext SetInputConnection [bmpReader GetOutputPort]
  atext InterpolateOn

将数据放入polydata
vtkPolyDataMapper weightedTransMapper
    weightedTransMapper SetInputConnection [xform GetOutputPort]

将数据放入actor
vtkActor weightedTransActor
    weightedTransActor SetMapper weightedTransMapper


进行显示
 vtkRenderer ren1
vtkRenderWindow renWin
    renWin AddRenderer ren1
vtkRenderWindowInteractor iren
    iren SetRenderWindow renWin

ren1 AddActor weightedTransActor
ren1 SetBackground 0.1 0.2 0.5
renWin SetSize 300 300

ren1 ResetCamera
[ren1 GetActiveCamera] Azimuth 0
[ren1 GetActiveCamera] Dolly 1
# Get handles to some useful objects
#
iren AddObserver UserEvent {wm deiconify .vtkInteract}
renWin Render

# prevent the tk window from showing up then start the event loop

proc cmd {s} {
    rotated Identity
    rotated RotateX $s
    renWin Render
}
wm withdraw .
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
使用VTK导入stl纹理贴图的方法如下: 1. 首先,确保你已经安装了VTK并且设置好了工程。 2. 在代码引入必要的头文件: ``` #include <vtkSmartPointer.h> #include <vtkSTLReader.h> #include <vtkTexture.h> ``` 3. 创建一个vtkSTLReader对象,并设置要加载的stl文件路径: ``` vtkSmartPointer<vtkSTLReader> reader = vtkSmartPointer<vtkSTLReader>::New(); reader->SetFileName("path/to/stl/file.stl"); ``` 4. 创建一个vtkTexture对象,并设置要加载的纹理图片路径: ``` vtkSmartPointer<vtkTexture> texture = vtkSmartPointer<vtkTexture>::New(); texture->SetFileName("path/to/texture/image.jpg"); ``` 5. 将纹理对象应用到STL模型上: ``` vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New(); mapper->SetInputConnection(reader->GetOutputPort()); mapper->Update(); vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New(); actor->SetMapper(mapper); actor->SetTexture(texture); ``` 6. 创建一个vtkRenderer对象和一个vtkRenderWindow对象,并将actor添加到渲染器: ``` vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New(); renderer->AddActor(actor); vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New(); renderWindow->AddRenderer(renderer); ``` 7. 创建一个vtkRenderWindowInteractor对象,并启动交互: ``` vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New(); renderWindowInteractor->SetRenderWindow(renderWindow); renderWindowInteractor->Initialize(); renderWindowInteractor->Start(); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值