RenderVItem
[!caution]ai 生成,可能叙事逻辑和表述并不是很好,仅供参考。
矢量图元的渲染组件,需要 items 的 render feature,定义于 ranim_items::vitem::render。注意点是三维的(局部空间),transform 给出局部到世界的变换。「共面」是渲染时的假设(见下文「平面投影渲染」)。
点列语义
points 由用户层 VItem 的 vpoints 展开而来:二次贝塞尔路径的 anchor 与handle 交替排列,每个 Vec4 的 w 分量是该点是否闭合路径(closepath)的标记。颜色与线宽数组按路径段对齐(段数 = 点数 / 2 向上取整),默认描边宽度为 DEFAULT_STROKE_WIDTH = 0.02。
通常由逻辑 VItem 的值级 Extract 生成该组件,并将ExtractContext 累积的父变换与已有 transform 组合,写入 render world;GPU在平面基重建之后应用矩阵。ranim_items::vitem::VItemPlugin 安装裸逻辑VItem(及 Vec<VItem>、几何、SVG、文字输入)的提取与 GPU 管线;默认渲染配置已包含它,自定义 RenderSetup 时经 RanimItemsPlugin 或单独安装。变换wrapper 或未被覆盖的容器另注册实际完整类型的ExtractPlugin<T>。同一输入重复渲染不会修改帧中的点或矩阵。
平面投影渲染
渲染 RenderVItem 时,Ranim 假设所有点共面以计算深度,实际渲染的是它在某个平面上的投影:
投影平面的初始基为
(X, Y)、法向为Z,且包含点列的第一个点;normal为Some时使用指定的投影平面;normal为None时由vitem_normal_from_points在渲染时推导:先对 anchor点做 Newell 法(鞋带公式的 3D 形式)求面积法向;面积退化(如单段曲线)时扫描全部点寻找非共线三元组;点共线时取一个包含该直线的确定性平面;所有点重合时回退到Z轴。
因此正常使用应保证一个 RenderVItem 的点共面(此时投影即其本身);故意打破共面则得到的是投影效果。