资讯动态

TiXL 场空间算子 RotateAxis 深度指南:在 3D 空间中旋转 SDF 场

发布时间:2026/9/19 1:49:45 来源:尧图企业网站定制
TiXL 场空间算子 RotateAxis 深度指南在 3D 空间中旋转 SDF 场【免费下载链接】t3TiXL is an open source software to create realtime motion graphics.项目地址: https://gitcode.com/GitHub_Trending/t3/t3本文是 TiXLt3场算子库中RotateAxis的完整技术指南。RotateAxis是 Lib.field.space 空间变换家族中用于“在 3D 空间中旋转传入场”的专用算子它接收一个由 SDF 图构建出的场如 BoxSDF、FractalSDF绕指定坐标轴旋转后继续向下游传递。读完本文你将掌握RotateAxis的参数语义、默认值与底层 HLSL 生成原理并能在 RaymarchField 渲染管线中实际搭建一条可运行的 SDF 旋转链路。RotateAxis 是什么RotateAxis是 TiXL 开源项目用于创建实时动态图形的软件位于仓库根目录 README.md中一个轻量级的场空间操作算子。官方文档 RotateAxis.md 对其定位描述如下核心功能在 3D 空间中旋转传入的场Rotates the incoming field in 3D space。功能定位与提供更多选项的 TransformField 属于同类节点当只需要“绕单个轴旋转”时RotateAxis是更简洁的选择。使用前提需要接收一个传入的场例如BoxSDF、ChainLinkSDF、FractalSDF等 SDF 生成算子作为输入。下游渲染旋转后的场可以被 RaymarchField 渲染也可以使用VisualizeFieldDistance进行可视化调试。同族节点文档还提到它与RepeatWithMirror、PolarRepeat、TwistField 等同属场空间变换家族可组合实现镜像、极坐标重复、扭曲等效果。从功能上看RotateAxis本质上是“绕坐标轴旋转”这一单一变换的专用封装适合作为复杂 SDF 表达式链中的基础空间变换环节。输入参数与输出原文档以表格形式给出了RotateAxis的完整参数接口。下表在继承原文档的基础上结合算子定义源码 RotateAxis.cs 与序列化定义 RotateAxis.t3 补充了默认值与底层类型映射输入参数名称关联度与类型说明InputFieldShaderGraphNode输入场被旋转的场节点由 SDF 生成算子BoxSDF、ChainLinkSDF、FractalSDF 等接入.t3文件中默认值为null即必须手动连接上游。RotationSingle旋转角度旋转角度单位为度degrees。.t3文件中的默认值为0.0。底层生成代码会按Rotation / 180 * 3.141578转换为弧度后注入着色器。AxisInt32旋转轴选择绕哪个坐标轴旋转。该参数在源码中被映射为AxisTypes枚举X、Y、Z见 RotateAxis.cs.t3文件中默认值为2即默认绕Z 轴旋转。输出名称类型ResultT3.Core.DataTypes.ShaderGraphNodeShaderGraph 节点可继续接入下游空间变换或渲染算子与 TransformField 的参数对比同为空间变换算子TransformField 提供了更全面的控制能力其输入包括Translation沿 X/Y/Z 平移、Rotation绕 X 水平轴、Y 垂直轴、Z 前向轴旋转、Scale宽/高/深缩放、UniformScale、Shear、Pivot枢轴点以及RotateFieldVecs。而RotateAxis只有InputField、Rotation、Axis三个输入属于“单轴旋转专用”的最小化算子。实际使用时可按需选择只需要绕单轴旋转时用RotateAxis需要复合变换平移 旋转 缩放 枢轴时用TransformField。底层实现源码级原理剖析RotateAxis的实现源码位于 Operators/Lib/Symbols/field/space/RotateAxis.cs它继承自InstanceRotateAxis并实现了IGraphNodeOp接口是一个标准的场图ShaderGraph节点操作算子。下面拆解其关键实现细节。1. 节点与输入的声明方式算子使用[Guid(7d9e1b37-5b44-40a3-bd81-281397e76e1a)]标识身份.t3文件RotateAxis.t3中的Id与之对应采用FormatVersion: 3的序列化格式。输出Result为SlotShaderGraphNode类型Guid为b1730fd1-...。三个输入分别通过[Input]特性声明InputField为InputSlotShaderGraphNodeRotation为InputSlotfloat并标记[GraphParam]表明该参数直接参与图代码参数化Axis为InputSlotint且通过MappedType typeof(AxisTypes)映射到枚举下拉见 RotateAxis.cs。2. 轴的枚举映射与代码重建Axis参数在运行时通过Axis.GetEnumValueAxisTypes(context)解析为X / Y / Z枚举RotateAxis.cs。当枚举值与当前缓存的_axis不一致时节点会调用ShaderNode.FlagCodeChanged()触发着色器代码重建RotateAxis.cs——这意味着切换旋转轴会触发一次着色器重新编译而Rotation作为[GraphParam]参数则可以在不重编译的情况下实时变化。3. 生成的 HLSL 代码算子通过IGraphNodeOp.AddDefinitions注入一个通用的二维平面旋转工具函数RotateAxis.cs// Rotate around a coordinate axis (i.e. in a plane perpendicular to that axis) by angle a. // Read like this: R(p.xz, a) rotates x towards z. // This is fast if a is a compile-time constant and slower (but still practical) if not. void pRotateAxis(inout float2 p, float a) { p cos(a)*p sin(a) * float2(p.y, -p.x); }随后在GetPreShaderCode中为每个采样点生成旋转调用RotateAxis.cspRotateAxis(p.plane, Rotation / 180 * 3.141578);其中plane由所选轴决定_axisCodes0数组见 RotateAxis.csAxis 枚举旋转平面作用于的 float2 分量旋转语义Xzy在垂直于 X 轴的 yz 平面内旋转即把 y 旋向 zYzx在垂直于 Y 轴的 zx 平面内旋转Zyx在垂直于 Z 轴的 xy 平面内旋转默认值这段代码也解释了文档中“Rotates the incoming field in 3D space”的精确含义围绕坐标轴旋转等价于在与该轴垂直的二维平面内做旋转变换。同时注意角度换算系数使用的是3.141578一个略小于真实 π 的近似常量而非标准的3.14159265这是该算子在实现层面的一个值得留意的细节。实战搭建一条“SDF → 旋转 → 渲染”链路RotateAxis的典型用法是串接在 SDF 场生成算子与渲染算子之间。参考官方文档的建议以及 RaymarchField 的接口一个完整的链路如下BoxSDF / ChainLinkSDF / FractalSDF │ ▼ RotateAxis ← Rotation 设旋转角度Axis 选旋转轴 │ ▼ RaymarchField ← 渲染最终场输出 DrawCommand / ShaderCode操作步骤生成场创建BoxSDF、ChainLinkSDF或FractalSDF等 SDF 算子作为场源。接入输入将场的输出连接到RotateAxis的InputField输入该输入在.t3中默认值为null必须显式连接。设置旋转Rotation以度为单位输入旋转角例如90、45、-30等角度会按角度 / 180 × π转换为弧度。Axis在X / Y / Z中选择旋转轴默认值为2Z 轴。切换轴会触发着色器代码重建这是正常现象。渲染输出将RotateAxis的ResultShaderGraphNode连接到 RaymarchField 的SdfField输入。调试渲染质量若旋转后的场出现锯齿或边缘瑕疵可参考RaymarchField的参数说明调整MaxSteps步数常规范围 50150对质量与性能影响最大、MinDistance完成判定阈值、MaxDistance中止阈值与StepSize初始缩放因子可用于降低由 Lipschitz 连续性不佳引入的伪影如需要贴图还可通过SetMaterial定义材质并用TextureScale、UVMapping控制 UV 生成方式。提示如果希望得到更直观的调试反馈也可以使用VisualizeFieldDistance将旋转后的场以距离场可视化形式查看便于确认旋转轴与角度是否符合预期。动态旋转技巧由于Rotation被声明为[GraphParam]它可以直接与动画、时间或 MIDI 等驱动源连接实现实时的动态旋转效果而无需等待着色器重新编译。相比之下Axis的切换成本更高触发FlagCodeChanged重建代码因此动态变化优先驱动 Rotation静态配置优先固定 Axis是更高效的使用方式。同族算子速览与选型RotateAxis属于 Lib.field.space 空间变换算子组。文档中提到的同族节点可快速对比如下TransformField集平移、旋转、缩放、切变、枢轴于一体的“瑞士军刀”旋转之外还支持Translation、Scale、UniformScale、Shear、Pivot需要复合空间变换时选用。TwistField沿指定轴扭转场Amount控制扭转量Axis选择扭转轴另有StepFactor可减小步长以避免光线步进伪影对单位范围内的较小源体积效果最佳。RepeatPolar绕中心轴镜像并重复指定次数Repetitions控制重复数、Offset绕自身轴旋转、Mirror开启镜像。RepeatWithMirror/PolarRepeat文档中提到的其他相关重复/镜像算子可组合出图案化场。选型建议单轴旋转 → RotateAxis多轴复合变换 → TransformField扭曲变形 → TwistField径向阵列 → RepeatPolar。若需要进一步查看这些算子的参数细节可直接阅读 Lib.field.space 目录下的对应文档并对照 Operators/Lib/Symbols/field/space 目录下的源码实现每个符号算子均配有.cs源码、.t3图定义与.t3ui界面定义三件套。小结RotateAxis是 TiXL 场空间中一个简洁而重要的基础算子三个输入、一个ShaderGraphNode输出底层通过在垂直于所选坐标轴的二维平面上执行pRotateAxis旋转变换实现。理解其“轴 → 旋转平面”的映射关系、度到弧度的换算方式/ 180 * 3.141578以及Rotation可实时驱动、Axis切换触发代码重建的行为差异能帮助你在构建 SDF 场景时更精准、更高效地运用这个节点。【免费下载链接】t3TiXL is an open source software to create realtime motion graphics.项目地址: https://gitcode.com/GitHub_Trending/t3/t3创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价