TiXL RotatedPlaneSDF 运算符详解用中心点与法向量构建任意朝向的有符号距离平面【免费下载链接】t3TiXL is an open source software to create realtime motion graphics.项目地址: https://gitcode.com/GitHub_Trending/t3/t3本篇技术指南围绕 TiXLLib.field.generate.sdf 运算符库中的RotatedPlaneSDF展开讲解如何通过 Center中心点与 Normal法向量两个参数定义一个空间平面并将其作为有符号距离场SDF参与光线步进渲染与场可视化。读完本文你将理解该运算符的数学原理、参数语义、与 PlaneSDF 的取舍关系以及它在 TiXL shader 图中的底层代码生成机制可直接在实战中按需搭建倾斜、旋转的无限平面。一、运算符定位任意朝向的平面 SDF在 TiXL 的 Lib.field.generate.sdf 运算符家族中RotatedPlaneSDF用于生成一个由中心点和法向量共同定义的空间平面场。它与同目录下的 PlaneSDF 功能相似但区别在于PlaneSDF只支持六个轴对齐方向X/−X、Y/−Y、Z/−Z平面始终与坐标轴垂直RotatedPlaneSDF通过归一化的Normal向量表达平面朝向可以构建任意角度倾斜或旋转的平面因此允许更精细的控制finer control正如其在RotatedPlaneSDF.t3ui中的官方描述A plane defined by center and normal vector. This is similar to PlaneSDF but allows finer control.生成的距离场后续可交给 RaymarchField 进行光线步进渲染或用 VisualizeFieldDistance 进行可视化调试与 BoxSDF、SphereSDF、CylinderSDF 等运算符的接入方式一致。二、输入与输出完整参数表RotatedPlaneSDF的接口非常精简仅有两个输入与一个输出。原文档的参数表如下名称相关性与类型描述Center输入Vector3平面上的一个参考点中心点决定平面在空间中的位置Normal输入Vector3平面的法向量决定平面的朝向实现内部会做归一化输出名称类型ResultT3.Core.DataTypes.ShaderGraphNode参数默认值与示例配置根据运算符的序列化定义 RotatedPlaneSDF.t3FormatVersion: 3两个输入的默认值如下Center默认值为(0.0, 0.0, 0.0)即默认平面过世界原点Normal默认值为(0.0, 1.0, 0.0)即默认法向量朝上此时平面退化为水平面等价于 PlaneSDF 的 Y 轴对齐平面。在 TiXL 的图编辑界面中两个输入端口分别位于运算符左侧的(‑200, 0)与(‑200, 75)处Result输出端口位于右侧(0, 0)布局可参考 RotatedPlaneSDF.t3ui。实用参数建议要让平面绕 X 轴倾斜 45°可将Normal设置为(0, 1, 1)内部归一化后自动变为单位向量要让平面垂直并朝向 X 轴方向将Normal设为(1, 0, 0)平面本身是无限延伸的Center只决定它在法线方向上的偏移位置并不会限定平面尺寸由于法向量只关心方向其长度不影响结果——即使传入(0, 10, 0)也会被归一化处理。三、底层实现两行代码的 SDF 数学RotatedPlaneSDF的 C# 实现位于 RotatedPlaneSDF.cs。该类继承自InstanceRotatedPlaneSDF并同时实现了ITransformable与IGraphNodeOp两个接口。其核心距离函数通过GetPreShaderCode方法注入 shader 图public void GetPreShaderCode(CodeAssembleContext c, int inputIndex) { c.AppendCall($ f{c}.w dot(p{c}.xyz - {ShaderNode}Center, normalize({ShaderNode}Normal)); f{c}.xyz p.w 0.5 ? p{c}.xyz : 1; ); }3.1 有符号距离的数学本质空间点到平面(center, n)的有符号距离公式为d dot(p - center, normalize(n))这正是第一行 shader 代码的数学原型用采样点位置p.xyz减去中心点再与归一化后的法向量做点积。结果为正表示点在法向量一侧为负表示在另一侧因此该场是有符号距离场Signed Distance Field两侧的符号信息在后续布尔运算如 SDF 的并集、交集、差集与材质分层中至关重要。值得强调的是TiXL 的 SDF 运算符普遍采用四分量布局约定f.w存储有符号距离值而f.xyz保留采样点的局部空间坐标供后续运算符继续使用。PlaneSDF的实现同样遵循这一约定见 PlaneSDF.cs 中的f{c}.w ...赋值。第二行f{c}.xyz p.w 0.5 ? p{c}.xyz : 1;的作用是保存局部空间——当不处于内部求值上下文时用1填充避免未定义值污染后续计算。3.2 代码如何被组装进最终 shaderc.AppendCall(...)中的CodeAssembleContext定义于 CodeAssembleContext.cs是整个 shader 图代码生成器的核心载体Calls是一个StringBuilderAppendCall负责把每个运算符生成的 HLSL 代码按缩进追加进最终的距离函数主体PushContext/PopContext通过ContextIdStack管理作用域为每个子图引入独立的p{id}、f{id}局部变量保证多个 SDF 运算符串联时不产生命名冲突同一节点被多条路径引用时TryMarkDefinitionsAdded确保实例定义只输出一次。因此RotatedPlaneSDF的这两行代码最终会作为float fX.w dot(...)形式的语句嵌入到光线步进的距离场函数中{c}与{ShaderNode}都是运行时填充的上下文编号与节点参数引用。3.3 生命周期与 Gizmo 支持在构造函数中RotatedPlaneSDF创建了ShaderGraphNode实例并绑定到Result输出每次求值时Update方法依次执行TransformCallback?.Invoke(this, context); // Gizmo 支持 ShaderNode.Update(context); ShaderNode.FlagCodeChanged(); // 标记代码变更以触发重新编译其中ITransformable接口将TranslationInput映射为Center见 Instance.OperatorHelpers.cs 相关接口体系这意味着你在 TiXL 图编辑器中使用移动 Gizmo变换手柄拖拽该运算符时写入的正是 Center 输入平面会随手柄实时移动而法向量则仍需通过参数面板手动调整。四、与 PlaneSDF 的对比何时选择哪个为帮助你快速决策下表对比了同一目录下的两个平面运算符依据 PlaneSDF.cs 与 RotatedPlaneSDF.cs维度PlaneSDFRotatedPlaneSDF朝向控制仅 6 个轴对齐方向X/Y/Z 及各自负方向任意法向量方向可自由旋转核心参数CenterAxis枚举X、Y、Z、NegX、NegY、NegZCenterNormalVector3距离公式±(p.axis − Center.axis)只取单个坐标分量dot(p − Center, normalize(Normal))三轴参与生成方式依据 Axis 枚举切换模板代码FlagCodeChanged触发重编译恒定模板直接拼接 normalize dot适用场景地板、墙面、裁剪平面等标准方位场景斜面、坡道、任意倾斜切割面、需要随朝向动画的场景从源码看PlaneSDF的Update方法在每次求值时都会比较当前Axis枚举值与上次是否一致一旦变化就调用ShaderNode.FlagCodeChanged()重新生成模板而RotatedPlaneSDF的模板是固定的改变Normal无需重编译 shader只是在运行时更新常量参数因此在需要连续动画化平面朝向的场景中更高效、更灵活。五、实战接入渲染与可视化闭环RotatedPlaneSDF的Result是ShaderGraphNode类型与 Lib.field 体系的其余 SDF 运算符保持一致的接入协议。典型的节点链为RotatedPlaneSDF (Result) → 距离场组合/变换运算符 → RaymarchField → 渲染输出 ↘ 或 → VisualizeFieldDistance → 调试可视化RaymarchField.csLib.field.render接收完整的距离场节点图逐像素光线步进求交并着色VisualizeFieldDistance.csLib.field.analyze将距离值映射为颜色梯度便于直观检查平面的方位、距离符号与整体场结构。构建一个无限斜面的示例步骤在算子库Lib.field.generate.sdf下创建RotatedPlaneSDF保持Center (0,0,0)设置Normal (0, 1, 1)获得 45° 倾斜面将Result接入RaymarchField的场输入并把该场输出接到 PBR 材质或直接用于颜色计算若需调试可并行接入VisualizeFieldDistance观察平面两侧的距离分布在视口中拖拽 Gizmo 移动平面位置修改 Center或在参数面板动画化Normal实现平面朝向的实时旋转。六、小结RotatedPlaneSDF用中心点 法向量这一最精简的几何定义为 TiXL 的 SDF 场系统补上了任意朝向平面的能力数学上它等价于dot(p − center, normalize(normal))的有符号距离公式实现上仅需两行 HLSL 代码即可注入距离场工程上它借助CodeAssembleContext完成代码拼装、借助ITransformable获得 Gizmo 交互、借助FlagCodeChanged保证参数变更即时生效。相比轴对齐的PlaneSDF它在动画化朝向、构建斜切面与自由旋转场景中提供了更精细的控制是 TiXL 平面类 SDF 家族中不可或缺的一环。【免费下载链接】t3TiXL is an open source software to create realtime motion graphics.项目地址: https://gitcode.com/GitHub_Trending/t3/t3创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考