python vtk 高程.tif 生成三维模型并导出为带颜色的obj模型

做了一个用vtk生成三维模型并在上面贴插值图的功能

import rasterio
import vtk
from pyproj import Transformer

# 1. 使用 rasterio 读取 TIFF 文件
with rasterio.open(r'D:\data\projects\202533\demtaiyuan1.tif') as src:
    elevation_data = src.read(1)  # 读取第一个波段的数据
    transform = src.transform  # 获取地理变换信息

# 2. 创建坐标转换器,从源坐标系(例如 EPSG:4326)转换为 EPSG:3857
transformer = Transformer.from_crs("EPSG:4326", "EPSG:3857", always_xy=True)

# 3. 将高程数据转换为 VTK 可以处理的格式
rows, cols = elevation_data.shape
points = vtk.vtkPoints()
texture_coords = vtk.vtkFloatArray()
texture_coords.SetNumberOfComponents(2)  # 每个顶点有两个纹理坐标 (u, v)

for i in range(rows):
    for j in range(cols):
        z = elevation_data[i, j]
        if z > 0:
            # 将像素坐标 (j, i) 转换为地理坐标 (x, y)
            x, y = transform * (j, i)
            # 将地理坐标 (x, y) 转换为 EPSG:3857 坐标
            x_3857, y_3857 = transformer.transform(x, y)
            points.InsertNextPoint(x_3857, y_3857, z*4)  # 将点添加到 VTK 点集
            # 计算纹理坐标 (u, v)
            u = j / (cols - 1)  # 水平方向,从 0 到 1
            v = 1 - (i / (rows - 1))  # 垂直方向,从 1 到 0(翻转)
            texture_coords.InsertNextTuple((u, v))

# 4. 创建多边形数据
polydata = vtk.vtkPolyData()
polydata.SetPoints(points)

# 5. 使用 vtkDelaunay2D 生成三角网格
delaunay = vtk.vtkDelaunay2D()
delaunay.SetInputData(polydata)
delaunay.SetAlpha(4000)
delaunay.Update()

# 6. 将纹理坐标添加到多边形数据
output_polydata = delaunay.GetOutput()
output_polydata.GetPointData().SetTCoords(texture_coords)

# 7. 创建映射器
mapper = vtk.vtkPolyDataMapper()
mapper.SetInputData(output_polydata)

# 8. 创建演员
actor = vtk.vtkActor()
actor.SetMapper(mapper)

# 9. 读取纹理图片
texture_reader = vtk.vtkPNGReader()
texture_reader.SetFileName(r'D:\data\projects\202533\Ca_kriging11.png')
texture_reader.Update()

# 10. 创建纹理
texture = vtk.vtkTexture()
texture.SetInputConnection(texture_reader.GetOutputPort())

# 11. 将纹理应用到演员
actor.SetTexture(texture)

# 12. 创建渲染器和窗口
renderer = vtk.vtkRenderer()
render_window = vtk.vtkRenderWindow()
render_window.AddRenderer(renderer)
render_window_interactor = vtk.vtkRenderWindowInteractor()
render_window_interactor.SetInteractorStyle(vtk.vtkInteractorStyleTrackballCamera())
render_window_interactor.SetRenderWindow(render_window)

# 13. 添加演员到渲染器
renderer.AddActor(actor)

# 14. 设置背景颜色
renderer.SetBackground(0.1, 0.2, 0.4)

# 15. 启动交互
render_window.Render()
glb_exporter = vtk.vtkOBJExporter()
glb_exporter.SetRenderWindow(render_window)
glb_exporter.SetFilePrefix(r'D:\data\projects\202533\model\name.obj')
glb_exporter.Write()
glb_exporter.Update()
render_window_interactor.Start()

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值