TextureCutQuadric 利用3D隐式函数(Quadrics)来生成2D纹理坐标

一:主要的知识点

1、说明

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

2、知识点纪要

本段代码主要涉及的有①vtkBooleanTexture通过函数生成纹理图案

二:代码及注释

python 复制代码
import vtkmodules.vtkInteractionStyle
import vtkmodules.vtkRenderingOpenGL2
from vtkmodules.vtkCommonColor import vtkNamedColors
from vtkmodules.vtkRenderingCore import vtkRenderer, vtkRenderWindow, vtkRenderWindowInteractor, vtkActor, vtkDataSetMapper,vtkTexture
from vtkmodules.vtkCommonDataModel import vtkQuadric
from vtkmodules.vtkFiltersSources import vtkSphereSource
from vtkmodules.vtkFiltersTexture import vtkImplicitTextureCoords
from vtkmodules.vtkImagingHybrid import vtkBooleanTexture


def MakeBooleanTexture(caseNumber, resolution, thickness):
    """
    vtkBooleanTexture 不依赖图片,而是通过逻辑函数(Boolean)自动生成黑白纹理图案
    继承自 vtkImageAlgorithm,输出的其实是一张 vtkImageData
    解决了想要简单的图案纹理,如网格格子,条纹等,而加载图片太麻烦,就直接用内存生成这些图案
    工作原理:
        这个类使用两个维度 (x, y)(或者 (x, y, z))来计算布尔函数值,逻辑上,它是基于两个周期性的方波信号(A, B)的布尔组合结果
    方法                    | 说明
    SetXSize(float)    | 控制纹理在 X 方向上的波长(控制条纹宽度)
    SetYSize(float)     | 控制纹理在 Y 方向上的波长
    SetThickness(float) | 控制每条条纹的厚度(方波宽度比例)
    SetOperation(int)   | 设置布尔运算类型(详见下表)
    SetInValue(value)   | 逻辑为真时的颜色值(通常为白)
    SetOutValue(value)  | 逻辑为假时的颜色值(通常为黑)

    vtkBooleanTexture 将3D空间中所有可能的点相对于两个隐式函数F1和F2的关系,划分为9种逻辑区域。
    对于每个隐式函数F例如 F1=quadric1
    空间中的点有三种状态:
    In (Inside): F < 0(点在曲面内)
    Out (Outside): F > 0(点在曲面外)
    On (On the surface): F 约等于 0(点在曲面上或靠近曲面)
    由于有两个隐式函数F1和 F2,总共有 9 种组合,每种组合都可以设置一个颜色(或纹理值)
    """
    solid = [255, 255]
    clear = [255, 0]
    edge = [0, 255]
    booleanTexture = vtkBooleanTexture()
    booleanTexture.SetXSize(resolution)
    booleanTexture.SetYSize(resolution)
    booleanTexture.SetThickness(thickness)
    if caseNumber == 0:
        booleanTexture.SetInIn(solid)  # 当一个点同时处于函数F1和F2的内部,被赋予solid的颜色
        booleanTexture.SetOutIn(solid)
        booleanTexture.SetInOut(solid)
        booleanTexture.SetOutOut(solid)
        booleanTexture.SetOnOn(solid)
        booleanTexture.SetOnIn(solid)
        booleanTexture.SetOnOut(solid)
        booleanTexture.SetInOn(solid)
        booleanTexture.SetOutOn(solid)
    elif caseNumber == 1:  # cut inside 1
        booleanTexture.SetInIn(clear)
        booleanTexture.SetOutIn(solid)
        booleanTexture.SetInOut(solid)
        booleanTexture.SetOutOut(solid)
        booleanTexture.SetOnOn(edge)
        booleanTexture.SetOnIn(edge)
        booleanTexture.SetOnOut(solid)
        booleanTexture.SetInOn(edge)
        booleanTexture.SetOutOn(solid)
    elif caseNumber == 2:  # cut outside 1
        booleanTexture.SetInIn(solid)
        booleanTexture.SetOutIn(clear)
        booleanTexture.SetInOut(solid)
        booleanTexture.SetOutOut(solid)
        booleanTexture.SetOnOn(edge)
        booleanTexture.SetOnIn(edge)
        booleanTexture.SetOnOut(solid)
        booleanTexture.SetInOn(solid)
        booleanTexture.SetOutOn(edge)
    elif caseNumber == 3:  # cut all 1
        booleanTexture.SetInIn(clear)
        booleanTexture.SetOutIn(clear)
        booleanTexture.SetInOut(solid)
        booleanTexture.SetOutOut(solid)
        booleanTexture.SetOnOn(edge)
        booleanTexture.SetOnIn(clear)
        booleanTexture.SetOnOut(solid)
        booleanTexture.SetInOn(edge)
        booleanTexture.SetOutOn(edge)
    elif caseNumber == 4:
        booleanTexture.SetInIn(solid)
        booleanTexture.SetOutIn(solid)
        booleanTexture.SetInOut(clear)
        booleanTexture.SetOutOut(solid)
        booleanTexture.SetOnOn(edge)
        booleanTexture.SetOnIn(solid)
        booleanTexture.SetOnOut(edge)
        booleanTexture.SetInOn(edge)
        booleanTexture.SetOutOn(solid)
    elif caseNumber == 5:
        booleanTexture.SetInIn(clear)
        booleanTexture.SetOutIn(solid)
        booleanTexture.SetInOut(clear)
        booleanTexture.SetOutOut(solid)
        booleanTexture.SetOnOn(edge)
        booleanTexture.SetOnIn(edge)
        booleanTexture.SetOnOut(edge)
        booleanTexture.SetInOn(clear)
        booleanTexture.SetOutOn(solid)
    elif caseNumber == 6:
        booleanTexture.SetInIn(solid)
        booleanTexture.SetOutIn(clear)
        booleanTexture.SetInOut(clear)
        booleanTexture.SetOutOut(solid)
        booleanTexture.SetOnOn(edge)
        booleanTexture.SetOnIn(edge)
        booleanTexture.SetOnOut(edge)
        booleanTexture.SetInOn(edge)
        booleanTexture.SetOutOn(edge)
    elif caseNumber == 7:
        booleanTexture.SetInIn(clear)
        booleanTexture.SetOutIn(clear)
        booleanTexture.SetInOut(clear)
        booleanTexture.SetOutOut(solid)
        booleanTexture.SetOnOn(edge)
        booleanTexture.SetOnIn(clear)
        booleanTexture.SetOnOut(edge)
        booleanTexture.SetInOn(clear)
        booleanTexture.SetOutOn(edge)
    elif caseNumber == 8:
        booleanTexture.SetInIn(solid)
        booleanTexture.SetOutIn(solid)
        booleanTexture.SetInOut(solid)
        booleanTexture.SetOutOut(clear)
        booleanTexture.SetOnOn(edge)
        booleanTexture.SetOnIn(solid)
        booleanTexture.SetOnOut(edge)
        booleanTexture.SetInOn(solid)
        booleanTexture.SetOutOn(edge)
    elif caseNumber == 9:
        booleanTexture.SetInIn(clear)
        booleanTexture.SetInOut(solid)
        booleanTexture.SetOutIn(solid)
        booleanTexture.SetOutOut(clear)
        booleanTexture.SetOnOn(edge)
        booleanTexture.SetOnIn(edge)
        booleanTexture.SetOnOut(edge)
        booleanTexture.SetInOn(edge)
        booleanTexture.SetOutOn(edge)
    elif caseNumber == 10:
        booleanTexture.SetInIn(solid)
        booleanTexture.SetInOut(solid)
        booleanTexture.SetOutIn(clear)
        booleanTexture.SetOutOut(clear)
        booleanTexture.SetOnOn(edge)
        booleanTexture.SetOnIn(edge)
        booleanTexture.SetOnOut(edge)
        booleanTexture.SetInOn(solid)
        booleanTexture.SetOutOn(clear)
    elif caseNumber == 11:
        booleanTexture.SetInIn(clear)
        booleanTexture.SetInOut(solid)
        booleanTexture.SetOutIn(clear)
        booleanTexture.SetOutOut(clear)
        booleanTexture.SetOnOn(edge)
        booleanTexture.SetOnIn(clear)
        booleanTexture.SetOnOut(edge)
        booleanTexture.SetInOn(edge)
        booleanTexture.SetOutOn(clear)
    elif caseNumber == 12:
        booleanTexture.SetInIn(solid)
        booleanTexture.SetInOut(clear)
        booleanTexture.SetOutIn(solid)
        booleanTexture.SetOutOut(clear)
        booleanTexture.SetOnOn(edge)
        booleanTexture.SetOnIn(solid)
        booleanTexture.SetOnOut(clear)
        booleanTexture.SetInOn(edge)
        booleanTexture.SetOutOn(edge)
    elif caseNumber == 13:
        booleanTexture.SetInIn(clear)
        booleanTexture.SetInOut(clear)
        booleanTexture.SetOutIn(solid)
        booleanTexture.SetOutOut(clear)
        booleanTexture.SetOnOn(edge)
        booleanTexture.SetOnIn(edge)
        booleanTexture.SetOnOut(clear)
        booleanTexture.SetInOn(clear)
        booleanTexture.SetOutOn(edge)
    elif caseNumber == 14:
        booleanTexture.SetInIn(solid)
        booleanTexture.SetInOut(clear)
        booleanTexture.SetOutIn(clear)
        booleanTexture.SetOutOut(clear)
        booleanTexture.SetOnOn(edge)
        booleanTexture.SetOnIn(edge)
        booleanTexture.SetOnOut(clear)
        booleanTexture.SetInOn(edge)
        booleanTexture.SetOutOn(clear)
    else:  # caseNumber ==  15:
        booleanTexture.SetInIn(clear)
        booleanTexture.SetInOut(clear)
        booleanTexture.SetOutIn(clear)
        booleanTexture.SetOutOut(clear)
        booleanTexture.SetOnOn(clear)
        booleanTexture.SetOnIn(clear)
        booleanTexture.SetOnOut(clear)
        booleanTexture.SetInOn(clear)
        booleanTexture.SetOutOn(clear)
    return booleanTexture

def main():
    positions = [
        [-4, 4, 0], [-2, 4, 0], [0, 4, 0], [2, 4, 0],
        [-4, 2, 0], [-2, 2, 0], [0, 2, 0], [2, 2, 0],
        [-4, 0, 0], [-2, 0, 0], [0, 0, 0], [2, 0, 0],
        [-4, -2, 0], [-2, -2, 0], [0, -2, 0], [2, -2, 0]
    ]

    colors = vtkNamedColors()

    renWin = vtkRenderWindow()

    iren = vtkRenderWindowInteractor()
    iren.SetRenderWindow(renWin)
    aren = vtkRenderer()

    quadric1 = vtkQuadric()  # 隐函数,可定义多种二次曲面,球体,椭球体,圆锥体,抛物面,双曲面
    quadric1.SetCoefficients(1, 2, 0, 0, 0, 0, 0, 0, 0, -.07)

    quadric2 = vtkQuadric()
    quadric2.SetCoefficients(2, 1, 0, 0, 0, 0, 0, 0, 0, -.07)

    aSphere = vtkSphereSource()
    aSphere.SetPhiResolution(21)
    aSphere.SetThetaResolution(21)

    """
    vtkImplicitTextureCoords  用一个 隐函数(Implicit Function) 来自动生成纹理坐标
    作用是为输入几何数据(vtkDataSet)生成纹理坐标,而这些坐标是根据一个**隐函数(implicit function)**自动计算出来的
    """
    tcoords = vtkImplicitTextureCoords()
    tcoords.SetInputConnection(aSphere.GetOutputPort())  # 输入几何数据
    tcoords.SetRFunction(quadric1)  # 设置生成纹理坐标的 R 分量函数, 对应传统纹理坐标中的U
    tcoords.SetSFunction(quadric2)  # 设置生成纹理坐标的 S 分量函数, 对应传统纹理坐标中的V

    aMapper = vtkDataSetMapper()
    aMapper.SetInputConnection(tcoords.GetOutputPort())

    for i in range(0, 16):
        aBoolean = MakeBooleanTexture(i, 64, 0)

        aTexture2 = vtkTexture()
        aTexture2.SetInputConnection(aBoolean.GetOutputPort())
        aTexture2.InterpolateOff()
        aTexture2.RepeatOff()

        anActor2 = vtkActor()
        anActor2.SetMapper(aMapper)
        anActor2.SetTexture(aTexture2)
        anActor2.SetPosition(positions[i])
        anActor2.SetScale(2.0, 2.0, 2.0)
        anActor2.GetProperty().SetColor(colors.GetColor3d('MistyRose'))
        aren.AddActor(anActor2)

    aren.SetBackground(colors.GetColor3d('SlateGray'))
    renWin.SetSize(500, 500)
    renWin.AddRenderer(aren)
    renWin.SetWindowName('TextureCutQuadric')

    # Interact with the data.
    renWin.Render()

    iren.Start()

if __name__ == '__main__':
    main()
相关推荐
程序员小孔.3 小时前
基于 SpringBoot + UniApp + Vue 的家政服务系统设计与实现
前端·数据库·spring boot·python·docker·微信小程序
程序猿乐锅3 小时前
【从0-1学习Python | 第六篇】 Python 函数:定义、参数与返回值
开发语言·python·学习
MasonYyp5 小时前
声音转文字的模型
python
信誓旦旦的程序猿12 小时前
【Python量化实战宝典 #08】可转债与债券接口手册:转股价·溢价率·纯债价值(Python 可跑)
java·python·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
砚底藏山河12 小时前
python量化:行情数据回溯
java·开发语言·python·金融·maven
今年下半年12 小时前
AI智能体项目实战记录(02):初始化 Python 项目
开发语言·人工智能·python·fastapi
Williamtym12 小时前
PickGo Lab实践:用浏览器、Python和MCP串起机器人搬运仿真
开发语言·python·机器人
CS创新实验室13 小时前
Python 对象“死“了之后去了哪?——引用计数与分代垃圾回收
开发语言·jvm·python
CCblandy13 小时前
雪花 ID 四个边界实测:时钟回拨重号 500 个,前端 JSON.parse 直接丢精度
后端·python·算法·性能优化·架构
quantdash_cc13 小时前
Pandas 处理分钟级股票行情:从原始数据清洗到 K 线聚合
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash