[Houdini] [UE] 甜甜圈效果

最终效果:

https://vimeo.com/820751652?share=copy

准备素材

首先甜甜圈是根据一个圆环的法向量分布的一片一片的方块, 所以我的思路是首先从一个圆环获得各个定点然后在每个定点处生成一个对应的长方体

但是每一个定点的方体再被复制过去的时候会根据normal旋转, 所以需要定义每个定点normal的up vector. 除此之外, 长方形的宽高需要根据圆环的大小来改变, 所以我在这边找到每个定点最近点的距离来计算每个定点应该对应的短边.

然后根据pivotpainter的文档, 准备好的素材每个geometry对应需要一个point, point和geometry需要有一个共同的attribute叫做name, 这样才能知道哪个pivot对应哪一个geometry. 接下来就是在每个点创建好name属性之后一次复制给顶点上的geometry.

顶点动画

首先需要区分开这个物体外侧的颜色和内部的颜色, 这一个区分可以通过看每个面的normal和物体pivotpoint的normal是否是相同方向(同方向是外面,反方向是里面). 这里可以通过dot product实现: a dot b > 0: two vectors are pointing the same way, < 0 then opposite.

其次就是关于顶点动画的解析: 这边每个平面是根据它的normal方向在旋转, 类似于一根筷子插在了一块豆腐上然后在转这个筷子, 但是豆腐本身没有在旋转. 所以这里可以用旋转normal的方式来达到表面旋转的效果.

想要让物体normal先有一些偏移, 然后在随着时间沿着normal方向画圆运动. 这里首先就要获得两个垂直于normal的向量a, b, 计算出圆周运动offset为sin(time) * a + cos(time) * b, 然后让axis等于原本normal加上这个新的offset就可以.

就是: f(time) => axis = normalize(normal + sin(time) * a + cos(time) * b)

所以这里先用cross product找到这两个向量a, b然后再根据时间计算即可. 不过为了让物体的每一层有一些不一样的的旋转样子, 可以用pivotpoint的z值修改time的offset从而让整体看起来从下到上依次旋转.

最后是根据相机距离pivotpoint的距离来放大缩小所有的物体. 这边的思路就是使用一个0-1的值来代表物体整体的缩放比例, 0的时候物体集中在pivotpoint, 1的时候所有顶点都在原地. 这里就需要用到从每个顶点到pivotpoint的向量v, 所有顶点在变化的同时也要同时也要加上v * normalized_camera_distance(0~1) 这个值. 但是有问题是因为之前做的动画导致了顶点可能不在原点, 这样缩小到0的时候可能会留一小块消不掉. 所以normalized_camera_distance为0的时候也同时要把其他参数也都归零(rotation_speed, z_bias, rotation_angle). 这样才能让每个方块正着消失.

最终的material:

一些整活

在做的过程中出现了很多奇奇怪怪的bug, 但是这个看起来很好玩所以就记录一下

附上material. 我认为应该是 *1.1那个地方把旋转中心整体偏移了, 然后就做成了打散-构成的一种好玩的效果. 如果调的更高就有点飞散重构的效果了.

references:

https://docs.unrealengine.com/4.27/zh-CN/Resources/SampleGames/

https://docs.unrealengine.com/4.26/en-US/AnimatingObjects/PivotPainter/PivotPainter1/

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注