案例 —— 怪物出水

17 篇文章 0 订阅

一,Ocean Setup

设置海洋Surface Grid(使用Large Ocean工具架)

  • 调节默认Grid的大小尺寸及细分(使用非常小尺寸来测试);
  • 调整频谱输入点的多少,频谱Grid Size,波浪方向,速度,起伏大小等等,以确定surface形态及动态;

 

按离相机远近细分Grid以展现足够细节,并删除相机额外的部分;

  • TriDivide
//转化为相机坐标
@P = fromNDC('/obj/camera', @P);

将频谱分为低频和高频(particle fluid mask)

  • 高频用于渲染;

二,Water Setup

使用预设的Tank设置,并根据角色轨迹,绘制交互范围;

 

模拟解算前,调整相关参数
  • 添加vorticity、id属性;
  • 设置粒子间隔为0.2,解算器最大子步为1(默认2);
    • 由于是大尺寸镜头,可稍微降低体素精度Grid Scale为2.2(默认为2);
  • 设置为FLIP(Swirly)模式;
  • Velocity Smoothing(0.01),以更加飞溅;

添加并设置碰撞体
  • 关闭Surface Collide(贵);
  • 使用Move Outside Collidion;
  • 缓存以增加解算效率(16bit),Cache Frames预加载一帧以加速解算;

        由于ocean surface是有波浪变形的,而解算时的水面时未变形平静的,最后水面变形会与碰撞体不匹配的,解决方法有:

  • Guide Simulation,引入引导的surface和vel,会非常的慢;
  • 对于比较平静的海面,可使用海洋频谱反向变形碰撞体,最后还原碰撞体;

注,可缩小模拟范围,以快速模拟测试;

模拟解算设置
  • 删除空中飞溅的大小块,通过体素内粒子密度判断;
    • volume rasterize particles
  • 添加阻力POP Drag(0.15);
    • 对分离的低密度粒子使用更高的阻力;
  • 添加些噪波POP Force;
    • 针对水面以上的粒子,低密度粒子或碰撞体周围的粒子;
  • 添加最大速度限制POP Speed Limit;

注,Gas Project Non Divergent Adaptive节点Error Tolerance默认非常慢,改为0.01;

压缩以减少缓存大小
  • Fluid Compress,压缩粒子及volume;

针对粒子压缩:

  • 如相机相对稳定,也可删除相机外的粒子;
  • 如pscale值一样,可转化为detail属性;
  • 压缩属性值为16bit(attribute cast),如v、vorticity;
  • 删除不必要的属性;
  • Convert VDB Points,使用vdb存储点,以压缩数据;

 

针对volume压缩:

  • vel场可不用完全的精度,如降低2倍(VDB Resample);
  • 降低surface场激活体素(VDB Active SDF);

 

三,Meshing Setup

  • 注意避免水花和边界碰撞;
  • 控制flip解算精度,避免添加过多的细节;大部分细节来自于whitwater;

注,取小范围解算粒子,以快速测试mesh;

Meshing
  • 先对解包vdb点,在还原pscale属性;
  • Particle Fluid Surface,Spherical模式会快很多;
    • 可降低voxel scale以提高精度;
    • 提高adaptivity自适应;
    • 勾选过滤,以控制表面凹凸不平;

 

注,如空中mesh大块大块,可调节pscale属性;还可根据粒子相对密度,来控制pscale属性;

//向下掉落时,越来越小
@pscale *= fit(@P.y,2,30,1,0.4) * fit(@v.y,-1,-13,1,0.6) * fit(@ptdensity,2,16,0.4,1);

  

注,通过v,对凹凸不平的表面模糊平滑(blur,deltamush);

剔除外围边界mesh
  • 根据绘制的边界曲线,压平y轴;
  • 根据边界框和相机,剔除外围边界mesh;
  • 控制边界v、vorticity;
float dist = xyzdist(1, @P);
float depth = volumesample(2,0,@P);
float multi = fit(dist,2,12,0,1);
if(depth < -1) i@group_keep=1;
@P.y *= multi;
@v *= multi;
@vorticity *= multi;

应用低频频谱并添加变形速度
  • 在blast剔除前应用;
  • 将频谱变形的速度,添加到解算速度上;

为whitewater创建自定义的surface、vel

  • 对变形后的mesh操作生成surface、vel(vdb from polygon);
  • 降低vel场的精度vdb resample(降低2倍),调整激活范围vdb activate;
  • 将这两个场存储为16位(primitive);
  • 分开缓存mesh,和surface、vel(白水最关心此两个场);
    • 由于此两个缓存有许多共同的节点,单独缓存会重复计算;

//缓存water_surface节点时,先缓存water_fields
fieldsNode = hou.node('/obj/water_sim/water_fields/render')
fieldsNode.render(frame_range=(hou.frame(), hou.frame()))

四,Whitewater Source Setup

  • 对缓存的surface/vel场,Cache Frames预加载一帧以加速解算;

模拟对白水影响的空气场
  • 以角色作为发射源,生成烟雾;
  • 使用水体surface场、角色,作为碰撞场;
    • 应用于force_output接口;
  • 使用Gas Vortex Confinement添加更多的涡旋;
  • Cache Frames预加载一帧以加速解算;
  • 限制最大速度;
float speed = length(v@vel);
v@vel = v@vel/speed * min(speed, 20);
白水发射源粒子
  • 使用已经变形后的mesh,定义发射源区域(通过mesh的curvature,vorticity,v);
    • 使用默认whitewater source节点(使用解算后的压缩粒子)生成emission volume,不理想;
  • 在发射区域scatter撒点,并删除不必要的属性(保留emission、v);
    • 对emission压缩属性值为16bit(attribute cast);
    • 并转化为vdb存储点Convert VDB Points,以压缩数据;
  • 缓存此发射源粒子;
//控制发射区域
int pts[] = pcfind(0, "P", @P, ch("radius"), chi("maxpts"));

float curature = 0;
foreach(int pt; pts){
    vector closeP = point(0, "P", pt);
    vector Pdiff = normalize(@P - closeP);
    curature += max(0, dot(Pdiff, @N));
}

@emission = fit(curature, 0.1, 1, 0, 1) * fit(@vorticity, 0.5, 2, 0, 1) * fit(length2(@v), 8, 100, 0, 1);

增加白水发射源粒子并添加更多细节

  • 解包发射源粒子vdb点;
  • 对速度属性v,添加noise;
    • anti-aliased noise,只改变方向,不改变大小;
    • random,随机速度大小(0.9~1);
  • 添加粒子数量,point replicate;
    • 通过属性控制复制的量;
  • 略微向速度方向移动下粒子,避免粒子太靠近surface;
  • 由于解算的飞溅粒子,相对成块,在对位置添加些noise(attribute noise);
  • 为更像水花的结构,可在添加平滑(attribute blur);
  • 在使用point replicate增加粒子数量;

五,Whitewater Setup

解算控制
  • 使用默认的whitewater solver节点,不会有很好的控制(air场);
  • 直接使用POP solver节点,以获取更多控制;
    • 添加重力POP Force;
    • 删除水面过低不必要的粒子POP Kill;
    • 在DOP外设置life;
    • 邻近的粒子间速度会大致相同(通过张力等),通过转化的速度场实现;
    • 使用空气场驱动粒子,并通过粒子密度控制airresistance;
    • 通过粒子密度控制重力;
    • 降低高密度区的点数,避免粒子过渡聚集;
    • 对高密度区速度引入noise,以破开形态;
    • 与水面交互,将内部的粒子推出到表面并附加水面速度(pop advect by volumes);
    • 与水面和角色交互,角色相对高精度,将内部的粒子推出到表面;
      • 反弹速度reflvel的切线速度,并融合些角色碰撞速度;

wedding缓存
  • 为避免内存溢出,可分割发射源分开缓存(使用wedge);
  • 删除角色背后的粒子,以优化缓存(VDB Occlusion Mask);
  • 删除不必要的属性和组;

六,Solaris Render

  • File Merge,可将wedding后缓存一起加载;

Solaris

  • Reference导入对应的usd模型;
  • 参加demelight,并添加环境贴图hdr;
  • 默认karma渲染可能非常模糊,关闭Enable Depth of Field;
  • 通过Correction Toolbar,设置ACES;

 

ocean surface 

  • 将surface分为远近两部分,并创建相应材质;

  • 20
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值