十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

TiXL 中 InvertSDF 运算器详解:翻转有向距离场实现挖空与负空间雕刻

TiXL 中 InvertSDF 运算器详解:翻转有向距离场实现挖空与负空间雕刻 TiXL 中 InvertSDF 运算器详解翻转有向距离场实现挖空与负空间雕刻【免费下载链接】t3TiXL is an open source software to create realtime motion graphics.项目地址: https://gitcode.com/GitHub_Trending/t3/t3导读InvertSDF 是 TiXL 开源实时图形系统Lib.field.adjust字段调整库中的基础运算器它通过把有向距离场Signed Distance FieldSDF的距离值取反实现实体与空腔的互换。本指南将以 InvertSDF.md 文档为主体结合仓库源码逐层拆解其工作原理、着色器代码生成细节以及与 CombineSDF 等运算器配合实现布尔挖空CutOut的完整实战链路。InvertSDF 是什么一场关于正负的空间互换TiXL 中的 SDF 字段用带符号的距离值描述空间距离值为负表示该点位于物体内部为正表示位于物体外部零值则落在物体表面。InvertSDF 的核心操作就是把这个符号完全翻转——把内部变外部、外部变内部。原文档给出的例子非常直观A cube in infinite empty space thus becomes a cut-out space in infinite matter.一个悬浮在无限空旷空间中的立方体经 InvertSDF 反转后就变成了无限实体物质中被挖出的一个立方体空洞。也就是说原本实心的立方体被翻转为立方体形状的负空间从而可以用它来雕刻、打孔、掏空其他实体对象。在 Lib.field.adjust 分组中InvertSDF 与 AbsoluteSDF取距离绝对值、PushPullSDF整体加厚/减薄表面、SpatialDisplaceSDF空间扭曲、TranslateUV平移 UV 坐标等同属字段调整工具族专门对 SDF 场的数值或空间属性做后处理变换。节点结构与数据类型根据原文档InvertSDF 仅有一个输出名称类型ResultT3.Core.DataTypes.ShaderGraphNode从源码看该节点实际上包含两个关键槽位InvertSDF.cs输入InputField类型为InputSlotShaderGraphNode接收上游任意 SDF 生成器如 SphereSDF、BoxSDF 等输出的着色器图节点输出Result类型为SlotShaderGraphNode把经过反转处理后的字段继续传递给下游节点如 CombineSDF、RaymarchField 等。整个节点的类型体系非常统一所有Lib.field下的运算器都通过ShaderGraphNode在 CPU 端拼接一段字段描述图最终由RaymarchField或Render2dField等渲染器将其编译为可执行的着色器代码见 RaymarchField.cs 中的SdfField输入。InvertSDF 并不直接参与逐像素的光线步进循环而是作为字段图中的一个纯变换节点存在。底层原理一行着色器代码背后的 SDF 语义InvertSDF 的实质实现极其精简其GetPostShaderCode只生成一行代码InvertSDF.csf{c}.w * -1;理解这行代码需要先弄清 TiXL SDF 字段的数据布局。以 SphereSDF.cs 为例球体生成器的预着色器代码为f{c}.w length(p{c}.xyz - {n}Center) - {n}Radius;可见字段变量f的.w分量专门存放带符号的距离值.xyz则用于携带法线、局部坐标等辅助信息球体把局部空间存入.xyz以便后续处理。因此f{c}.w * -1就是对该采样点的距离值做精确的符号取反原本距离为d 0的外部点反转后变为-d 0即从外部翻转为内部原本距离为d 0的内部点反转后变为-d 0即从内部翻转为外部表面上的d 0点保持不变因此物体表面轮廓的位置不变只是实体与空腔的归属被整体对调。由于 SDF 的距离场天然满足 Lipschitz 连续性逐点取反后依然是一个合法的有向距离场反转后的字段仍然可以放心地交给光线步进Raymarching做等值面求交——这正是 InvertSDF 能与其他字段运算器无缝级联的数学前提。典型案例用 InvertSDF 雕刻负空间基本链球体 → 反转 → 光线步进最小可用链路如下SphereSDF ──Result──▶ InvertSDF ──Result──▶ RaymarchField其中RaymarchField的SdfField输入接收反转后的字段DrawCommand输出用于渲染。渲染结果是从球的表面看场景变成了无限空间中存在一个球形空洞配合MaxSteps、MinDistance、MaxDistance等参数可控制步进精度见 RaymarchField.cs。进阶链反转 并集 挖洞原文档特别提示了 InvertSDF 的黄金搭档CombineSDF。BoxSDF ──Result──▶ InvertSDF ──┐ ├──▶ CombineSDF ──▶ RaymarchField SphereSDF ──Result──────────────┘这样组合的本质是用 CSG 布尔运算雕刻先用 InvertSDF 把某个形状翻转为负空间再通过 CombineSDF 将其与其他实体做并集等效于从后者中挖出前者的形状。有趣的是从 CombineSDF.cs 的源码看CutOut差集模式本身就是用取反实现的f{contextId}.w max(f{contextId}.w, -f{subContextId}.w);也就是说CombineSDF 的差集运算在内部等价于对第二个字段取反后再做交集——InvertSDF 的*.w * -1与 CombineSDF 差集路径中的-f{subContextId}.w完全同源。当你需要显式、独立地把一个字段翻转为负空间再复用时InvertSDF 就是那个可组合的显式算子。CombineSDF 还提供了 Union、Intersect、UnionSmooth、CutOutRound、Engrave、Pipe 等十余种组合模式CombineSDF.cs与 InvertSDF 配合可以构建复杂的雕刻与布尔造型管线。交互式验证SDFToColor 可视化在调试阶段可以把 InvertSDF 的输出接入Lib.field.use分组下的 SDFToColor将距离值映射为颜色梯度进行可视化直观确认反转前后内外区域是否正确对调也可接入VisualizeFieldDistanceVisualizeFieldDistance.cs观察距离场的分布。与同组运算器的对比与协同InvertSDF 经常与Lib.field.adjust中的其他调整器串联使用AbsoluteSDFf{c}.w abs(f{c}.w)AbsoluteSDF.cs把负距离全部归零/取正消除内部概念常用来把空腔转回实体边界与 InvertSDF 联用可对负空间做二次修正。PushPullSDF通过f{c}.w {n}AmountPushPullSDF.cs整体加厚或减薄表面先反转再 Push/Pull可以对挖出的空腔壁做厚度调节。SpatialDisplaceSDF / NoiseDisplaceSDF对距离值或空间坐标施加噪声位移让反转后的空洞边缘产生有机的侵蚀感。这些调整器都遵循同一套IGraphNodeOp接口与ShaderGraphNode数据协议因此可以按任意顺序自由串联构成丰富的字段造型表达式。典型使用场景小结负空间雕刻在无限场中制造空洞、隧道、内腔CSG 差集替代显式反转后与 CombineSDF 配合或直接使用 CombineSDF 的 CutOut 模式双面渲染辅助反转后再用 AbsoluteSDF 还原可得到仅保留空腔内表面的效果材质/颜色翻转与 SetSDFMaterial 配合为反转后的空腔注入独立的颜色提供者。参考与延伸阅读原文档InvertSDF.md同组索引Lib.field.adjust README节点实现InvertSDF.cs、定义文件 InvertSDF.t3组合运算器CombineSDF.cs字段生成示例SphereSDF.cs、BoxSDF.cs渲染端RaymarchField.cs、Render2dField.cs【免费下载链接】t3TiXL is an open source software to create realtime motion graphics.项目地址: https://gitcode.com/GitHub_Trending/t3/t3创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表