Houdini 属性非均匀扩散简易模型

很久以前看巫妖王之怒开场动画的时候就一直在想那把剑上的魔法是怎样做的,最近做了一个类似的实验完成了一个简易的属性传递模型,这个方法能够适用于热量传递,腐蚀或者蔓延的效果。

         

模型的原理是使用点云中的pcfilter()函数来将目标属性是进行类似模糊的扩散,同时使用sop中的solver来将模糊值进行累加,并定义如果该值累加超过一定阈值之后便不会再继续增加,这样就产生了扩散的这个效果。本人在之前Gray Scott Reaction-Diffusion 文章中也提到了扩散的一个方法,不过那个方法更适用于一定总和的值在点之间均匀的摊开,而现在的这个方法是入侵式的扩散。

在做好扩散的方法后就是定义非均匀的方法,这个能够增加更多的趣味性,也让扩散显得更加自然。方法是给每个点通过noise定义不一样的扩散速率。然后用这个扩散速率在累加过程中乘以扩散值。noise图案的不同能够产生多种不一样的侵袭扩散效果。

在传入solver之前,我在每个点上定义了 float heat(传递属性), float factor(传递速率), int edge(判定扩散边缘)这三个属性,并提前设定了属性扩散开始的点和factor的值。

下面是在solver下point wrangle里面用到的核心代码:

//search the pre frame point cloud,
//point number will affect the sensitivity of diffusion
int handle = pcopen(1, "P", P, 99, 8);
//get the global speed
float speed = chf("speed");
//get the loacl speed of each point
float factor = [email protected];

float threshold = 1.0;

//excute diffusion fuction if the attribute is less than the threshold
if ([email protected] < threshold){
        float influence = pcfilter(handle, "heat");
        [email protected] += influence * speed * factor;
        //the attribute value cannot be bigger than threshold
        if([email protected] > threshold){
            [email protected] = threshold;
        }
        // define the edge area
        if([email protected] < threshold && [email protected] > 0.03){
            [email protected]edge = 1;
        }else{
            [email protected]edge = 0;
        }
}
pcclose(handle);

@Cd = set([email protected],0,0);

代码其实除开注释,基本上就十行左右,简单但是效率和效果都非常的好。这里主要是利用好的pcfilter这个函数。

时间: 2024-11-03 05:44:30

Houdini 属性非均匀扩散简易模型的相关文章

非均匀阵线阵前后向平滑仿真

1.天线阵形 应用在一维阵列的空间平滑算法,要求在天线阵所在的一维空间内,存在两个以上完全相同的子阵,子阵的数量决定阵列能够解决的相参(干)信号源的数目,阵列共能对子阵阵元数-1个信号进行测向. 相对于均匀阵列,非均匀阵具有较大的测向范围,较优的最大基线,且能够降低阵元间隔大于信号最小半波长所引起的谱峰模糊,因此本方案拟采取非均匀线阵作为目标子阵,并对三种低阵元数,包含两个对称子阵的阵列进行了仿真分析. 按空间平滑算法的排布要求,非均匀阵列仅可共用一个阵元,同时两子阵的距离远远大于信号的半波长,

非均匀B样条拟合MATLAB程序

直接上代码,多的不再说了. %------------------非均匀B样条拟合MATLAB程序----------------- clear k=3; x=load('data.txt'); [n,m]=size(x); %-----------弦长参数化-------------------------------------- u(k+n)=0; for i=1:n-1 u(k+i+1)=u(k+i)+sqrt((x(i+1,1)-x(i,1))^2+(x(i+1,2)-x(i,2))^

非均匀缩放,剪切效应

非均匀缩放与其子级相比,父级的缩放和旋转不均匀可能会导致 剪切效应. 虽然父子关系支持这种做法,但是当父级被清除后,剪切将会丢失,因为它不能用位置,缩放和旋转. 如果 清除并保持变换结果 移动物体,则非均匀缩放是最可能的原因 我的理解: 剪切效应: 均匀的缩放 可以相加, 然后用一个统一的和表示. 但是非均匀缩放 不能统一表示,必须分段进行.但是当父子断裂的时候,只能强行用不准确的数值抵消, 不可能一步一步再倒回去. 因为这内存记录消耗太大,内存只记录总和. 完美 原文地址:https://ww

参数化(四):处理非均匀数据分布

前面我们了解了参数嗅探可能是好的也可能是坏的.当数列的分布不均匀的时候参数嗅探就是不好的事情.例如,考虑“Status”列在Orders表中有总共10M行.该列有7个不同的值,如下分布: Status Number of Rows Open 314 Pending Approval 561 Approved 28,990 Paid 17,610 Shipped 817,197 Closed 7,922,834 Cancelled 1,032,886 如果查询status是“Open”的数据时使用

原子属性与非原子属性,互斥锁与自旋锁介绍

nonatomic 非原子属性 非线程安全,适合内存小的移动设备(手机,平板...) atomic 原子属性(线程安全,但需要消耗大量资源)针对多线程设计的,为默认值,保证同一时间只有一个线程能够写入;本身就是一把自旋锁;单写多读,单个线程写入,多个线程读取 注意:当重写属性的get与set方法时需要在@implementation后添加:@synthesiae 属性名 = _属性名; 互斥锁与自旋锁对比 互斥锁:如果发现其他线程正在执行锁定代码,线程会进入休眠(就绪状态),等其他线程时间到打开

Java类静态属性、静态块、非静态属性、非静态块、构造函数在初始化时的执行顺序

前言 今天在看Android ContentProvider实现的时候,突然想到了Java类在new的过程中,静态域.静态块.非静态域.非静态块.构造函数的执行顺序问题.其实这是一个很经典的问题,非常考察对Java基础知识的掌握程度.很多面试过程中相信也有这样的问题,趁着周末有时间复习一下. 结论 这里先把整理好的结论抛给大家,然后我在写个程序来验证我们的结论.在Java类被new的过程中,执行顺序如下: 实现自身的静态属性和静态代码块.(根据代码出现的顺序决定谁先执行) 实现自身的非静态属性和

[Effective JavaScript 笔记]第29条:避免使用非标准的栈检查属性

许多js环境都提供检查调用栈的功能.调用栈是指当前正在执行的活动函数链.在某些旧的宿主环境中,每个arguments对象含有两个额外的属性:arguments.callee和arguments.caller.前者指向使用该arguments对象被调用的函数.后者指向调用该arguments对象被调用的函数的函数.许多环境支持arguments.callee,但它除了允许匿名函数递归地引用自身之外,没有更多的用途了.(高3中认为使用arguments.callee可以解除函数体内的代码和函数名之间

Ognl中根元素与非根元素的关系

Ognl中根元素与非根元素的关系 根元素:可以理解为全局变量 非根元素:局部变量 从两者获取其属性的方式看: Object obj = Ognl.parseExpression(“[1]”); [1]根元素:不用写#号,填写属性 非根元素:用写#号,填写对象名字 注:从填写内容能看出全局和局部了 返回得到的obj就是在全文中从上到下搜索到的[1],比如说全局和局部名称一致了,你填写属性那肯定就是全局,都没到局部那个地方就搜索到了. OgnlContext 这就是上下文.上下文干啥的,可以理解下英

实例变量(instance var)与属性(@property)的关系

实例变量(instance var)与属性(@property)的关系 Objective-C 2.0之后,声明一个@property name自动产生一个实例变量,名为_name,因此省去实例变量和属性重复输入的麻烦.而使用@synthesize可以改变_name名称.@property和@synthesize不必成对出现. @property name:指示编译器自动合成setter和getter方法,setter方法名即setName,而getter方法名即name.@property后面