教程 · 入门

obsidian测试

test羽毛


[[VEX|返回上层]]


# 重点


---


使用[[resample]]的 curveu 属性 去作为一条线的遮罩 传递各种属性反复克隆


#问题 使用[[enumerate]]去生成一个 name 属性 方便 rigattributewrangle 去操作[[localtransform]]矩阵 来制作卷曲动画 最后记得用[[attributedelete]]清除 transform 不然会影响后续操作法线等等的属性


```c++


float angle = chf("angle")*chramp("curveu",@curveu);

vector axis = chv("axis");


rotate(4@localtransform, angle,axis);

```


![[Pasted image 20220907024419.png]] #重点 一段非常厉害的生长动画 VEX ^c57c14

#### 拓展 1 点偏移动画

```c++

@P = primuv(0,"P",@primnum,@curveu*chf("grow")*chramp("curveu",@curveu));


```

### 拓展 2

```c++

@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 优化版本)

```C++

// 确保有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]]