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()
相关推荐
投图匠8 小时前
十种不同风格的 CTP接口 框架
开发语言·python
2601_9679801110 小时前
深入理解词向量算法及其在Python中的实践
python·word2vec·glove·fasttext·词向量
129Lab10 小时前
电池循环测试数据自动化分析:用Python+AI工具构建一键式寿命评估流水线
python·数据分析·电池测试·数据自动化·寿命评估
treasure14010 小时前
【复古】浅尝Django前后端不分离
前端·css·python·django·bootstrap·html·web
Dmz丶11 小时前
前端转 AI 100 天 Day 44:前端集成实战——用 React 给 Agent 做个正式界面
python
jay神11 小时前
基于 YOLOv8 的手势识别系统(Web 版)
前端·人工智能·python·深度学习·yolo·计算机视觉·计算机毕业设计
DeepVisionary11 小时前
阿里云上线旗舰多模态新模型,不公布跑分且限时14天退役
python·自动化
东莞市云毅网络有限公司11 小时前
FAQ 覆盖度打分:TF-IDF 与向量嵌入双路召回的 Python 实现
python·数据清洗·rag·企业知识库·文档解析
爱笑的k1112 小时前
nano-vllm 源码剖析:千行 Python 手写离线推理引擎的调度、显存与并行时序
开发语言·python·vllm
用户83562907805112 小时前
使用 Python 控制 Excel 工作表的分页位置
后端·python