TiXL 网格 UV 变换实战:深入解析 TransformMeshUVs 算子的平移、旋转、缩放与顶点选择机制

发布时间:2026/9/20 1:22:08
TiXL 网格 UV 变换实战:深入解析 TransformMeshUVs 算子的平移、旋转、缩放与顶点选择机制 音视频图形学桌面应用【免费下载链接】t3TiXL is an open source software to create realtime motion graphics.项目地址https://gitcode.com/GitHub_Trending/t3/t3点击查看免费下载TransformMeshUVs 是 TiXLtooll3开源实时动态图形软件中Lib.mesh.modify模块提供的一个网格 UV 处理算子它直接操作网格已存在的 UV 坐标实现对纹理映射的平移、旋转、非均匀缩放与整体缩放并可选择只影响部分顶点。本文以官方算子文档为主体骨架结合仓库中该算子的 C# 实例定义、组合图.t3默认配置与底层 HLSL 计算着色器实现完整讲解其输入参数、输出类型、运行原理与在真实项目中的搭配用法帮助你在实时可视化、投影映射与材质调试中精准控制纹理贴图。算子定位Lib.mesh.modify 家族中的 UV 编辑器TransformMeshUVs 属于 Lib.mesh.modify 系列算子该系列负责对网格几何与属性进行就地修改式处理包括顶点混合BlendMeshVertices、法线重算RecomputeNormals、变形DeformMesh等。与同目录下的其他算子不同TransformMeshUVs 不改变网格的顶点位置而是只改写每个顶点的 UV纹理坐标数据从源头改变后续着色阶段的纹理采样结果。在官方文档中它的定位非常明确核心功能Manipulates the existing UV coordinates of a mesh to change the mapping of textures.操作网格已有的 UV 坐标从而改变纹理的映射方式可见性变换结果通过 DrawMesh 一类的网格绘制算子最终呈现在画布上Becomes visible with DrawMesh。与兄弟算子的分工若要从零覆盖UV用平面映射方式重投影应使用 MeshProjectUVOverwrites the existing UV coordinates with planar mapping若要基于其他数据源如渲染后的内容重新生成 UV 并用于后续采样可参考 ReprojectToUVRender 库中的重投影算子。三者可组成一条典型流水线先用 MeshProjectUV 生成一套 UV再用 TransformMeshUVs 对这套 UV 做动画化调整最后交给 DrawMesh 显示。输入参数详解官方文档定义了 8 个输入参数下表完整列出保留原文档字段与说明并补充仓库源码确认的类型与行为名称相关性 类型说明InputMeshMeshBuffers必填输入网格缓冲内含顶点位置、法线、UV 等属性。在 TransformMeshUVs.cs 中以InputSlotMeshBuffers声明TranslateVector3线性平移 UV 坐标即沿 U / V 方向整体移动纹理RotateVector3旋转 UV 坐标围绕 Pivot 定义的旋转中心旋转纹理StretchVector3按轴非均匀缩放 UV 坐标U、V 两个轴方向分别缩放UniformscaleSingle/float对 UV 坐标做整体均匀缩放UseVertexSelectionBoolean决定是否只影响被选中的顶点与 SelectVertices 类算子配合使用PivotVector3旋转或缩放时的操作中心点默认位于 UV 空间的中心 (0.5, 0.5)TexCoord2Boolean是否将变换应用到第二套 UV 坐标TexCoord2而非主 UV参数默认值来自组合图定义从算子实例的定义文件 TransformMeshUVs.t3 中可以确认每个参数的默认值参数默认值Translate(0, 0, 0)Rotate(0, 0, 0)Stretch(1, 1, 1)Uniformscale1.0Pivot(0.5, 0.5, 0.5)UseVertexSelectiontrueTexCoord2falseInputMeshnull需外部连接这些默认值意味着算子开箱即用时不会改变 UV平移为 0、缩放为 1、旋转为 0只有在你显式驱动这些参数例如用曲线或时间驱动 Translate / Rotate / Uniformscale时纹理才会产生动画。输出说明官方文档定义的唯一输出如下名称类型ResultT3.Core.DataTypes.MeshBuffers在源码中输出以[Output(Guid 1030db1a-...)] public readonly SlotMeshBuffers Result声明见 TransformMeshUVs.cs可直接接入 DrawMesh 等下游算子。注意由于修改的是 UV 而非顶点位置网格形状完全不变只有贴图采样发生改变因此非常适合做不改变几何的纹理动画。运行原理从算子图到 GPU 计算着色器C# 侧的定义该算子在 C# 层是一个轻量级InstanceTransformMeshUVs容器见 TransformMeshUVs.cs本身不包含逐顶点运算逻辑而是通过组合图graph把输入参数连接到内部的变换矩阵计算、缓冲组装与计算着色器执行等子节点上。从 TransformMeshUVs.t3 的子节点列表可以看出其内部结构TransformMatrix把 Translate、Rotate、Stretch、Uniformscale、Pivot 组合成 4×4 变换矩阵ComputeShader加载着色器资源Lib:shaders/3d/mesh/mesh-TransformUVs.hlsl见 TransformMeshUVs.t3ComputeShaderStage以线程组 (64, 1, 1) 派发计算任务GetBufferComponents / GetSRVProperties / _AssembleMeshBuffers / ExecuteBufferUpdate负责读取输入 MeshBuffers 的缓冲区视图、执行更新并把结果重新组装为 MeshBuffersBoolToFloat把两个布尔输入UseVertexSelection、TexCoord2转换为着色器可读的 float 标志。也就是说TiXL 把算子实现为可组合的节点子图C# 实例只负责声明输入输出槽位每个槽位带独立 GUID实际计算完全交给 HLSL 计算着色器在 GPU 上并行完成。HLSL 着色器核心逻辑核心计算位于 mesh-TransformUVs.hlsl。其常量缓冲区和执行流程如下cbuffer Params : register(b0) { float4x4 TransformMatrix; // 由 Translate/Rotate/Stretch/Uniformscale/Pivot 组合而成 float UseVertexSelection; // 0 或 1 float ToTexCoord2; // 0 或 1 }逐线程每线程处理一个顶点的核心逻辑float s UseVertexSelection 0.5 ? SourceVerts[i.x].Selected : 1; // 顶点选择因子 float3 pos float3(SourceVerts[i.x].TexCoord, 0); // 读取主 UV float3 pos2 float3(SourceVerts[i.x].TexCoord2, 0); // 读取第二套 UV ResultVerts[i.x] SourceVerts[i.x]; if((bool)ToTexCoord2 true){ ResultVerts[i.x].TexCoord2 lerp(pos2, mul(float4(pos2,1), TransformMatrix).xyz, s).xy; } else{ ResultVerts[i.x].TexCoord lerp(pos, mul(float4(pos,1), TransformMatrix).xyz, s).xy; }几个值得注意的实现细节选择因子的软过渡当UseVertexSelection开启时每个顶点的Selected属性由 SelectVertices 等算子写入被当作插值系数s在原始 UV与变换后 UV之间做lerp。因此Selected并非简单的 0/1 硬开关——若选择值在 01 之间连续渐变UV 变换也会呈现渐变过渡效果。UV 以齐次坐标参与变换UV 被扩展为(u, v, 0, 1)后乘以 4×4 的TransformMatrix再取结果的 xy 写回从而统一支持平移、旋转、缩放等仿射变换。两套 UV 通道可选TexCoord2为真时改写TexCoord2通道为假时改写主TexCoord通道未选中的通道保持原值。GPU 并行每个线程独立处理一个顶点GetDimensions保证越界线程直接返回线程组规模 64 与算子图内CalcDispatchCount节点计算出的调度数量匹配。与之对照MeshProjectUV.hlsl 的实现是直接把顶点对象空间位置经变换矩阵投影为 UVmul(float4(posInObject.xyz,1), Transform).xy float2(1,1)并同样支持TexCoord2通道切换——这正是覆盖 UVproject与修改已有 UVtransform两种语义的底层区别。典型使用流程1. 基础连接[网格来源] -- InputMesh (TransformMeshUVs) [纹理/参数控制] -- Translate / Rotate / Stretch / Uniformscale / Pivot TransformMeshUVs.Result -- DrawMesh将任意网格缓冲例如程序化生成或导入的模型接入InputMesh把算子输出接到 DrawMesh再对变换参数做动画即可看到纹理在模型表面移动、旋转或缩放。2. 仅影响部分顶点先用 SelectVertices或 SelectVerticesWithSDF给网格顶点写入选择值然后保持UseVertexSelection true默认值。此时只有被选择的顶点区域参与 UV 变换可用于制作局部贴图滑动/拉伸效果例如只让某个面片的贴图滚动。3. 纹理滚动与缩放动画纹理无限滚动让Translate的 X 或 Y 分量随时间线性增长注意 UV 是周期性的平移量等于整数倍时会回到相同采样位置纹理放大/缩小调节Uniformscale整体或Stretch分轴配合Pivot (0.5, 0.5)使缩放围绕 UV 中心进行避免纹理向角落漂移纹理旋转驱动Rotate的 Z 分量围绕Pivot旋转纹理。4. 与投影类算子的搭配若输入网格本身没有可用 UV可先用 MeshProjectUV 生成平面映射 UV再接 TransformMeshUVs 做后续动画若希望把渲染画面重投影到网格表面再采样可参考 ReprojectToUV 与示例工程ReprojectToUvExample见 ReprojectToUvExample.t3的组合方式。注意事项InputMesh为必填输入且类型必须是MeshBuffers未连接时算子无输出UseVertexSelection依赖网格顶点携带选择数据若输入网格未经过任何选择算子Selected属性可能为默认值建议在使用局部变换前先用 SelectVertices 明确写入选择范围变换作用于 UV 空间01 范围之外的 UV 同样合法会按纹理的采样/平铺设置显示因此平移大数值可能让纹理超出单次平铺范围该算子不改变顶点位置与法线不会影响光照几何只影响纹理采样坐标如需重算因其他变形算子改变的法线可再接 RecomputeNormals。参考资料仓库内官方算子文档TransformMeshUVs.md、所属目录索引 modify/README.mdC# 实例定义TransformMeshUVs.cs组合图与默认值TransformMeshUVs.t3核心着色器mesh-TransformUVs.hlsl兄弟算子MeshProjectUV.md、MeshProjectUV.hlsl绘制算子DrawMesh.md选择类算子SelectVertices.md、SelectVerticesWithSDF.md赞分享音视频图形学桌面应用【免费下载链接】t3TiXL is an open source software to create realtime motion graphics.项目地址https://gitcode.com/GitHub_Trending/t3/t3点击查看免费下载相关推荐TiXL TransformMesh 算子深度解析网格顶点的平移、旋转、缩放与顶点选择TiXL TransformMesh 算子深度解析网格顶点的平移、旋转、缩放与顶点选择 本指南基于 TiXLt3开源实时动态图形软件中 Lib.mesh.音视频图形学桌面应用TiXL TransformField 算子详解三维空间中的场变换、旋转、缩放与错切TiXL TransformField 算子详解三维空间中的场变换、旋转、缩放与错切 本篇指南以 TiXL开源实时动态图形工具 Lib.field.spa音视频图形学桌面应用TiXL 网格修改操作符Lib.mesh.modify完全指南顶点变形、位移与 UV 处理实战TiXL 网格修改操作符Lib.mesh.modify完全指南顶点变形、位移与 UV 处理实战 本指南系统讲解 TiXL开源实时动态图形工具中 Lib音视频图形学桌面应用上一篇wechat-assistant-pro技能中心详解从土味情话到垃圾分类的趣味玩法下一篇tech.ml.dataset社区生态相关项目和扩展库的完整介绍创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考