本篇要点:
1)锚点属性@condof、@condir(与上一篇略重复,但更直观);
2)@active属性,主动与被动;
3)@animated属性,无点动画;
4)@deforming属性,有点动画;
5)动画和约束同时影响一个物体;
6)@orient 属性,控制旋转;
一、初步熟悉约束/绑定_牛顿摆球
不熟悉约束/绑定的,可以先看看工程文件第2案例:牛顿摆球,
【 tip:s@name = ''; //如果name是空字符,默认约束到世界坐标 】
二、锚点属性@condof、@condir
锚点属性@condof、@condir可用于控制Anchor锚点如何附加到对象。
@condof:控制约束自由度数、点属性、int值-0~3;
@condir:制约束方向、点属性、vector值;
约束类型为position,@condof、@condir不同值含义:
0:自由移动。
1:只允许在垂直于condir值所在平面移动。
2:只允许沿condir值所在直线移动。
3:三个轴向全部被约束,没得移动。
约束类型为rotation,@condof、@condir不同值:
0:自由旋转。
1:只允许围绕垂直于condir值所在平面上旋转。
2:只允许围绕指定的condir值旋转。
3:三个轴向全部被约束,没得旋转。
工程文件第3节案例,
如下图所示,创建模型及基本约束,
使用小球撞击box,不同约束类型下,@condof、@condir具体变现为:
更多组合效果,可以自行尝试。
三、弹珠案例(锚点属性)
工程文件第4案例,主要利用了上面所说的锚点属性@condof、@condir,
四、@active属性,主动与被动
点属性,
active=0,被动物体,它可以影响别人,别人影响不了它,可以简单理解为被固定住了;
active=1,主动物体;
上案例,工程文件第5~6案例。
1、如图,创建基本约束、模型:类似链条的东西,
一般情况下,这链条会掉下来,相当于全都是主动物体(第五案例):
2、对第一个方块设置为被动i@active = 0,其它方块设置为主动i@active=1,结果为,
五、@animated无点动画
(这里的无点动画指,Pack之后,没有其它点属性参与运算/动画)
Pack之后K的动画,使用@animated;@animated解算比@deforming更快,因为Pack之后,把所有的东西当成一个点来运算,所以更快;
正确使用@animated,Houdini才能使用正确的方式去解算(如果K了动画但没设置@animated,Houdini会解算出错)。
1、工程文件第7案例
①先给最后的那个方块K个动画(在Pack之后K的动画),方块动画为,
②对第一和最后的方块设置为被动@active=0, @animated=1(其它方块不写@animated,默认为0 ),结果为,
③还是这个案例,有动画但不设置@animated属性,Houdini解算出错,
2番外、使用SopSolver进行状态切换,
工程文件第8案例,与第7案例差不多,仅在dopnet内添加了sopsolver节点,节点具体在第32帧后,对最后的方块设置 i@active = 1; i@animated = 0,
结果为:在第32帧后,最后的方块掉下来(切换为主动、无动画),
六、@deforming有点动画
Pack之前K的动画,使用@deforming;每个点都会参与运算,所以比@animated慢;实际上使用不是很多,解算也不是很巴适;
工程文件第9案例(使用上面的案例继续进行),
1、不写@defroming属性,结果为:无动画,32帧后状态切换(掉下来),解算失败,
32帧之前为啥不动呢,因为解算时,识别不到K了动画的物体,相当于name属性丢失,即name没有传递过来。
解决办法:加个TiemShift节点,把第一帧属性定下来。
2、写上@deforming属性+tiemShift节点,
结果为,有动画,但并未与约束constraint一起联动,只是点动了,实际物体并没有动,32帧状态切换后,碰撞状态正常(请继续看下一案例)
七、动画和约束同时影响一个物体
Animation动画和Constraint约束同时影响一个物体。
1、原始动画在X-Z平面滑动,
需求:K完的动画后,加个碰撞体/障碍物,碰撞完后又不影响原物体的动画路径。
普遍基本思路:创建两个物体,一个a物体、一个b物体,b与a约束。等于动画给到a,b约束到a,然后用b去碰障碍物,这样动画animation和约束constraint就可以同时影响一个物体。
2、创建两个物体,一个a物体、一个b物体,动画给到a,b与a约束,然后用b去碰障碍物,
3、结果为,(想碰撞得更自然,可慢慢调hardconrel参数)
4番外、换成崎岖的地面,不要障碍物(更改一丢丢,工程文件11案例)
八、@orient 属性
@orient 在约束网络的点上。
通过这个属性,就可以使用约束网络里面的点来控制刚体的旋转。该属性是一个四元数quaternion,四元数不了解可以看看前面的四元数笔记:
工程文件第12案例_模拟机器狗,半节腿,@orient代码示例,
p@orient = quaternion(radians(chf('radians')), set(0, 0, 1)); //quaternion(角度,轴向)
float scale = chf('scale'); // 幅度
float speed = chf('speed'); // 速度、频率
float offset1 = chf('offset1'); // 前后偏移
float offset2 = chf('offset2'); // 上下偏移
具体还是看文件吧,(对角线腿步伐一致),结果 ,
(只是大概动起来了,感兴趣的可以去细调下参数,让其更自然)