Core VItem
Caution
ai 生成,可能叙事逻辑和表述并不是很好,仅供参考。
矢量图元的渲染表示,定义于 ranim_core::core_item::vitem。注意点是三维的
(世界空间),「共面」只是渲染时的假设(见下文「平面投影渲染」)。
pub struct VItem {
/// 投影目标平面的法向;None 时由渲染器从点推导
pub normal: Option<Vec3>,
/// 世界空间点列;(x, y, z, is_closed)
pub points: Vec<Vec4>,
pub fill_rgbas: Vec<Rgba>,
pub stroke_rgbas: Vec<Rgba>,
pub stroke_widths: Vec<Width>,
}
点列语义
points 由用户层 VItem 的 vpoints 展开而来:二次贝塞尔路径的 anchor 与
handle 交替排列,每个 Vec4 的 w 分量是该点是否闭合路径(closepath)的
标记。颜色与线宽数组按路径段对齐(段数 = 点数 / 2 向上取整),默认描边
宽度为 DEFAULT_STROKE_WIDTH = 0.02。
平面投影渲染
渲染 core VItem 时,Ranim 假设所有点共面以计算深度,实际渲染的是它在某个
平面上的投影:
- 投影平面的初始基为
(X, Y)、法向为Z,且包含点列的第一个点; normal为Some时使用指定的投影平面;normal为None时由vitem_normal_from_points在渲染时推导:先对 anchor 点做 Newell 法(鞋带公式的 3D 形式)求面积法向;面积退化(如单段曲线)时 扫描全部点寻找非共线三元组;点共线时取一个包含该直线的确定性平面;所有点 重合时回退到Z轴。
因此正常使用应保证一个 core VItem 的点共面(此时投影即其本身);故意打破
共面则得到的是投影效果。