news 2026/9/20 1:21:57

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
TiXL 网格 UV 变换实战:深入解析 TransformMeshUVs 算子的平移、旋转、缩放与顶点选择机制
  • 音视频
  • 图形学
  • 桌面应用

【免费下载链接】t3

TiXL is an open source software to create realtime motion graphics.

项目地址:https://gitcode.com/GitHub_Trending/t3/t3
点击查看免费下载

TransformMeshUVs 是 TiXL(tooll3)开源实时动态图形软件中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,用平面映射方式重投影,应使用 MeshProjectUV(Overwrites the existing UV coordinates with planar mapping);
    • 若要基于其他数据源(如渲染后的内容)重新生成 UV 并用于后续采样,可参考 ReprojectToUV(Render 库中的重投影算子)。

三者可组成一条典型流水线:先用 MeshProjectUV 生成一套 UV,再用 TransformMeshUVs 对这套 UV 做动画化调整,最后交给 DrawMesh 显示。

输入参数详解

官方文档定义了 8 个输入参数,下表完整列出(保留原文档字段与说明,并补充仓库源码确认的类型与行为):

名称(相关性 & 类型)说明
InputMesh(MeshBuffers,必填)输入网格缓冲,内含顶点位置、法线、UV 等属性。在 TransformMeshUVs.cs 中以InputSlot<MeshBuffers>声明
Translate(Vector3)线性平移 UV 坐标,即沿 U / V 方向整体移动纹理
Rotate(Vector3)旋转 UV 坐标,围绕 Pivot 定义的旋转中心旋转纹理
Stretch(Vector3)按轴非均匀缩放 UV 坐标(U、V 两个轴方向分别缩放)
Uniformscale(Single/float)对 UV 坐标做整体均匀缩放
UseVertexSelection(Boolean)决定是否只影响被选中的顶点(与 SelectVertices 类算子配合使用)
Pivot(Vector3)旋转或缩放时的操作中心点,默认位于 UV 空间的中心 (0.5, 0.5)
TexCoord2(Boolean)是否将变换应用到第二套 UV 坐标(TexCoord2)而非主 UV

参数默认值(来自组合图定义)

从算子实例的定义文件 TransformMeshUVs.t3 中可以确认每个参数的默认值:

参数默认值
Translate(0, 0, 0)
Rotate(0, 0, 0)
Stretch(1, 1, 1)
Uniformscale1.0
Pivot(0.5, 0.5, 0.5)
UseVertexSelectiontrue
TexCoord2false
InputMeshnull(需外部连接)

这些默认值意味着:算子开箱即用时不会改变 UV(平移为 0、缩放为 1、旋转为 0),只有在你显式驱动这些参数(例如用曲线或时间驱动 Translate / Rotate / Uniformscale)时纹理才会产生动画。

输出说明

官方文档定义的唯一输出如下:

名称类型
ResultT3.Core.DataTypes.MeshBuffers

在源码中,输出以[Output(Guid = "1030db1a-...")] public readonly Slot<MeshBuffers> Result声明(见 TransformMeshUVs.cs),可直接接入 DrawMesh 等下游算子。注意:由于修改的是 UV 而非顶点位置,网格形状完全不变,只有贴图采样发生改变,因此非常适合做不改变几何的纹理动画。

运行原理:从算子图到 GPU 计算着色器

C# 侧的定义

该算子在 C# 层是一个轻量级Instance<TransformMeshUVs>容器(见 TransformMeshUVs.cs),本身不包含逐顶点运算逻辑,而是通过组合图(graph)把输入参数连接到内部的变换矩阵计算、缓冲组装与计算着色器执行等子节点上。从 TransformMeshUVs.t3 的子节点列表可以看出其内部结构:

  • TransformMatrix:把 Translate、Rotate、Stretch、Uniformscale、Pivot 组合成 4×4 变换矩阵;
  • ComputeShader:加载着色器资源Lib:shaders/3d/mesh/mesh-TransformUVs.hlsl(见 TransformMeshUVs.t3);
  • ComputeShaderStage:以线程组 (64, 1, 1) 派发计算任务;
  • GetBufferComponents / GetSRVProperties / _AssembleMeshBuffers / ExecuteBufferUpdate:负责读取输入 MeshBuffers 的缓冲区视图、执行更新并把结果重新组装为 MeshBuffers;
  • BoolToFloat:把两个布尔输入(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; }

几个值得注意的实现细节:

  1. 选择因子的软过渡:当UseVertexSelection开启时,每个顶点的Selected属性(由 SelectVertices 等算子写入)被当作插值系数s,在"原始 UV"与"变换后 UV"之间做lerp。因此Selected并非简单的 0/1 硬开关——若选择值在 0~1 之间连续渐变,UV 变换也会呈现渐变过渡效果。
  2. UV 以齐次坐标参与变换:UV 被扩展为(u, v, 0, 1)后乘以 4×4 的TransformMatrix,再取结果的 xy 写回,从而统一支持平移、旋转、缩放等仿射变换。
  3. 两套 UV 通道可选TexCoord2为真时改写TexCoord2通道,为假时改写主TexCoord通道;未选中的通道保持原值。
  4. GPU 并行:每个线程独立处理一个顶点,GetDimensions保证越界线程直接返回,线程组规模 64 与算子图内CalcDispatchCount节点计算出的调度数量匹配。

与之对照,MeshProjectUV.hlsl 的实现是直接把顶点对象空间位置经变换矩阵投影为 UV(mul(float4(posInObject.xyz,1), Transform).xy + float2(1,1)),并同样支持TexCoord2通道切换——这正是"覆盖 UV(project)"与"修改已有 UV(transform)"两种语义的底层区别。

典型使用流程

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 空间(0~1 范围之外的 UV 同样合法,会按纹理的采样/平铺设置显示),因此平移大数值可能让纹理超出单次平铺范围;
  • 该算子不改变顶点位置与法线,不会影响光照几何,只影响纹理采样坐标;
  • 如需重算因其他变形算子改变的法线,可再接 RecomputeNormals。

参考资料(仓库内)

  • 官方算子文档:TransformMeshUVs.md、所属目录索引 modify/README.md
  • C# 实例定义:TransformMeshUVs.cs
  • 组合图与默认值:TransformMeshUVs.t3
  • 核心着色器:mesh-TransformUVs.hlsl
  • 兄弟算子:MeshProjectUV.md、MeshProjectUV.hlsl
  • 绘制算子:DrawMesh.md
  • 选择类算子:SelectVertices.md、SelectVerticesWithSDF.md
  • 音视频
  • 图形学
  • 桌面应用

【免费下载链接】t3

TiXL is an open source software to create realtime motion graphics.

项目地址:https://gitcode.com/GitHub_Trending/t3/t3
点击查看免费下载

相关推荐

上一篇:wechat-assistant-pro技能中心详解:从土味情话到垃圾分类的趣味玩法
下一篇:tech.ml.dataset社区生态:相关项目和扩展库的完整介绍

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/20 1:20:09

Python 3.13安装实战:避坑指南与ARM64/GIL移除适配

1. 这不是普通升级&#xff1a;Python 3.13安装背后的真实需求与现实陷阱你搜“python3.13安装教程”&#xff0c;点开一堆图文&#xff0c;结果发现全是Python 3.12甚至3.11的截图改个标题——这事儿我去年在三个技术群亲眼见过。真正想装3.13的人&#xff0c;90%不是为了尝鲜…

作者头像 李华
网站建设 2026/9/20 1:19:54

信息系统工程的项目管理

信息系统工程的项目管理&#xff0c;重点还是项目管理&#xff0c;但是专注的领域是信息系统。信息系统领域如何管理项目&#xff0c;项目经理是关键&#xff01;根据PMI的的观点&#xff0c;项目经理应该重点关注三个关键技能&#xff1a;1 技术项目管理。与项目、项目集和项目…

作者头像 李华
网站建设 2026/9/20 1:19:45

HFSM 与动画状态机解耦:通过事件总线同步行为与动作表现

HFSM 与动画状态机解耦&#xff1a;通过事件总线同步行为与动作表现在游戏客户端角色控制器的开发中&#xff0c;最普遍的架构恶疾是将 AI 决策状态机&#xff08;HFSM/BT&#xff09;与动画状态机&#xff08;如 Unity Animator / Unreal AnimGraph&#xff09;深度强绑定。例…

作者头像 李华
网站建设 2026/9/20 1:18:03

数值优化(Numerical Optimization)学习系列-01-线搜索方法(LineSearch)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/20 1:15:03

生产与运作管理试题库:制造业信息化系统的算法基石

简介&#xff1a;面向高校经管类专业学生的《生产与运作管理》复习备考资料&#xff0c;内置试题库与试卷A答案解析&#xff0c;覆盖JIT生产、ISO9000、敏捷制造、精益生产、MRP、ABC控制法、全面质量管理等核心模块&#xff0c;并配套选择题、判断题、简述题、计算题和论述题&…

作者头像 李华