[[VEX|返回上层]]
重点
使用[[resample]]的 curveu 属性 去作为一条线的遮罩 传递各种属性反复克隆
#问题 使用[[enumerate]]去生成一个 name 属性 方便 rigattributewrangle 去操作[[localtransform]]矩阵 来制作卷曲动画 最后记得用[[attributedelete]]清除 transform 不然会影响后续操作法线等等的属性
float angle = chf("angle")*chramp("curveu",@curveu);
vector axis = chv("axis");
rotate(4@localtransform, angle,axis);![[Pasted image 20220907024419.png]] #重点 一段非常厉害的生长动画 VEX ^c57c14
拓展 1 点偏移动画
@P = primuv(0,"P",@primnum,@curveu*chf("grow")*chramp("curveu",@curveu));
拓展 2
@P = primuv(1,"P",0,(@curveu+chf("offset"))%1*chf("grow"));
@N = primuv(1,"N",0,(@curveu+chf("offset"))%1*chf("grow"));
float min = chf("min");
float max = chf("max");
float scalex = fit01(rand(@ptnum),min,max);
float scaley = fit01(rand(@ptnum+123),min,max);
vector offsetxy = v@up*scalex + v@N*scaley;
v@P +=offsetxy;![[20240926171611_rec_-convert.gif|300]]
拓展三(gpt 优化版本)
// 确保有curveu属性,如果没有则创建基于ptnum的伪UV
float curve_u = haspointattrib(0, "curveu") ? @curveu : (@ptnum / float(@numpt-1));
// 计算在源prim上的UV位置
float offset = chf("offset");
float grow = chf("grow");
// 正确的UV计算:偏移->循环->缩放(如果需要)
float source_uv = (curve_u + offset) % 1.0;
// 如果grow是用来控制UV范围的
if (grow != 1.0) {
source_uv *= grow;
source_uv = fit(source_uv, 0, grow, 0, 1);
source_uv %= 1.0; // 再次确保在0-1范围内
}
// 从源prim获取位置和法线
int source_prim = @sourceprim; // 确保这个属性存在
if (source_prim >= 0) {
@P = primuv(1, "P", source_prim, set(source_uv, 0, 0));
@N = primuv(1, "N", source_prim, set(source_uv, 0, 0));
// 确保法线是单位向量
@N = normalize(@N);
}
// 生成偏移量
float min_scale = chf("min");
float max_scale = chf("max");
// 使用更稳定的随机数生成
int seed = chi("fixed_seed") ? 123 : @ptnum;
float rand1 = fit01(rand(seed), min_scale, max_scale);
float rand2 = fit01(rand(seed + 456), min_scale, max_scale);
// 确保有up向量,如果没有则创建一个
if (!haspointattrib(0, "up")) {
// 创建垂直于法线的up向量
vector tangent = normalize(cross(@N, {0, 1, 0}));
if (length(tangent) < 0.01) {
tangent = normalize(cross(@N, {0, 0, 1}));
}
v@up = normalize(cross(@N, tangent));
} else {
v@up = normalize(v@up);
}
// 确保up和N是垂直的(至少近似)
v@up = normalize(v@up - dot(v@up, @N) * @N);
// 应用偏移
vector offset_xy = v@up * rand1 + @N * rand2;
@P += offset_xy;#重点 找到了一个更方便的替代节点[[carve]]
原理解析 curveu 代表每个点的插值使用 primuv 去查找这条线上每一个地方的位置属性 使用 grow 去做一个偏移 还可以使用父级的 curveu 去影响偏移那部分要生长哪部分不要生长 ![[Pasted image 20220907025008.png]]
[[attributerandom]]有一个模式是 inside sphere 可以指定沿着法线方向去偏移 ![[Pasted image 20220907025305.png]]
<center>沿着法线打开12度</center>
![[Pasted image 20220907025332.png]]
<center>沿着法线打开38度</center>
使用 chopnetwork 传递进去 geometry 使用 jiggle 去制作延迟效果器的样式 模式记得改为 animated
之后使用 channel 再把属性传递回去 模式记得改为 animated #问题 这里不知道为什么一直在运算 可能是电脑不太行的原因 也可能是操作导致之前某个地方在重复运算
最终效果
记得用各种噪波去随机 pscale 还有法线方向 ![[Pasted image 20220907025618.png]] ![[fur.hip]]