CG世界 发表于 2023-8-8 10:55:44

节点可视化编程研发 |中级技巧分享



Hi大家好,好久没分享技术了,今天想根据我的实战开发经验,分享一些对CG技术人比较实用的技术。
现在存在一个现象,面对客户更多的苛刻要求,更少的投资预算,我们不仅要高效率完成项目,还要高质量交付项目。在这种局面下,我们迫切需求技术的革新。这就需要更加专业的工具研发人员,以提升团队的效率和质量。文章标题为工具研发的中级技巧,何之为中级?因为我将其置于节点编程技术的中端水平部位。初级:常规数学计算,线性代数计算,判断、循环和迭代等。中级:节点重载,自定义数据结构等。高级:多维数组,键值对,延迟执行图(Lambda表达式)等。
今天分享是就是中级里的节点重载和自定义数据结构。
在我认知里,CG行业的技术人很少会接触中级和高级以上的技术概念,它们更多存在于c++编程里。今天它们已经进入到可视化编程的世界,我在实际的开发中大量应用了它们,体验到了巨大的优势。其易用性、高性能,已经超越了c++。所以我想借此文章给更多的CG技术人分享。今天要说的对象是一个新兴的编程语言:Bifrost。语言并不就得是文字,也可以是图形。Bifrost纯粹是由节点图形构成,并且是纯函数式编程语言。Bifrost由单独的Autodesk团队开发,Maya自带的一个可视化编程平台。它的目标是实现一个完整的、易用的、高性能的节点可视化开发平台。什么是函数式编程?高中老师讲过,函数的基本特性就是不论输入是什么,相同的变量都只存在唯一的函数值。一个节点就是一个函数,每个节点在相同的输入下只能得到相同的结果。函数式编程还有一个特性是节点只修改数据的副本,不会改变原始值。所以不必担心会破坏原始数据。CG软件里可以做节点可视化编程的软件有很多,像Houdini 的vop模块。但是,它们最多只涉及到了初级的编程技术。至今,我还没见到除Bifrost外可以做到中级以上的节点可视化编程平台。因此,会有很多人对此有质疑的态度。也可能不理解中级以上的可视化编程技术有什么意义和作用。~~节点重载~~
第一个要说的,节点重载。重载在c++里表示在一个函数里,存在多个函数变量,它们的名字相同,但是类型不同,从而实现不同的计算方法。比如,函数A有两个变量,名称a和b。一种情况下ab的类型是浮点类型,另一种情况下是布尔类型。当输入的类型都是浮点类型时,函数的计算方式是a+b;当输入的类型都是布尔类型时,函数的计算方式是a和b的并集。如何在Bifrost里实现上面的函数A呢?第一步,我们创建一个化合物节点(函数),并将其命名为A。


第二步,创建两个变量a和b,并将其设置为浮点型。

第三步,在化合物里,创建加法节点,并将a和b相加。最终这个化合物输出一个浮点型数据。

第一个计算方法实现了,下面是将这个函数A进行重载。首先发布第一个计算方法。

然后将ab改为布尔类型,这时节点会报警,不要慌,因为布尔类型的计算不能是加法。


所以,我们进入函数A里,将运算方式改为布尔并集。并将得到的并集结果转换为浮点类型。最后输出它。


关键的一步来了,如果你直接发布它,会提示已经存在相同名称的节点A。这时,你可以勾选Overloadable。它会重新提示节点A(函数)将会被重载。最后发布它。这时,节点A就已经实现了两个功能。具体取决于输入的ab两个变量的类型。


当a为0,b为1时,节点A得到的0+1=1。


当a为假(0),b为真(1)时,真假的并集是假(0),得到值就是0。

节点重载有非常大的好处,下面通过我开发魔法神器工具的案例来描述它。我在魔法神器里做节点重载有两个目的:实现更灵活的功能,让艺术家更加可控工具。优化计算性能。
魔法神器操作演示https://att.element3ds.com/data/attachment/upload_media/20230808/ho50r0viga2zi5gw.mp4?form=upload_media_10499
魔法神器渲染演https://att.element3ds.com/data/attachment/upload_media/20230808/swwomdnnmooogmo6.mp4?form=upload_media_10500https://att.element3ds.com/data/attachment/upload_media/20230808/gz3szvix3vbvl7fx.mp4?form=upload_media_10501 在魔法神器工具里,我制作了两个重载节点,to_field和is_0_or_is_1。


本来官方有一个to_field节点,但是官方的不能满足我的需求。所以我就重新制作了一个可以支持属性代理的to_field节点。这样艺术家就可以通过模拟物体的属性名字,比如point_size粒子大小属性,以此来控制魔法神器的参数。

第二个 is_0_or_is_1 节点对性能来说非常重要。它极大地优化了工具的计算效率。不必要的计算模块可以通过它跳过。在一个工具里,有的参数默认是0或者1。在这种情况下,这个参数涉及的模块可能不需要计算。在其它的可视化编程软件里,不管这个参数是否对结果有影响,它们都会计算一遍,性能就会大量浪费。
当参数为0时,“远离中心力” 这个模块会跳过不计算。

并且,这个节点有一个判断选项,实现了等于0或者等于1的两种情况下跳过计算。另外它还有两个功能,当普通场为空值时,跳过计算。

当属性代理场为空值时,跳过计算。比如上面,粒子不存在point_size属性时,就跳过轴向力计算模块。


上面是我对节点重载的详细描述,节点重载是一个伟大的软件设计,让节点可视化编程不逊于c++代码式编程语言。
~~自定义数据结构~~下面要说的就是中级技巧里第二大功能,自定义数据结构。什么是数据结构?数据结构和算法是组成软件的两大基石。清晰、强大的数据结构可以让你的算法实现更加简单易行。在其它CG软件里,你可以创建一个属性,并且可以定义它的类型是浮点型还是整型或者布尔型,这都是常见的数据类型。但是,如果你想自定义一个属于自己的数据类型,那就不行了。因为除Bifrost外还没有软件可以这样做。在c++里,可以用"struct"关键字创建自定义数据类型。例如,我们需要一个可以定义学生的数据类型。它需要有学号、姓名、性别、年龄。那么c++自定义数据类型的代码是这样的struct Stu{int id; //学号string name; //姓名string sex; //性别float age; //年龄
}如何在Bifrost里创建上面这个数据结构呢?首先,在工具文件夹下创建一个struct文件夹,并在里面创建一个Stu.json文件。

然后在这个文件里定义你的数据类型。


这就完事了,打开软件验证一下是否成功。你可以发现在自定义数据类型库里已经有Stu这个类型了!



然后,创建一个Stu类型的数据,就可以使用它了。


这个时候,它实际上和普通的数据类型已经没有区别了。你可以用它进行数组操作,比如在一个多边形的点上创建一个Stu类型的数组数据,让每个点都包含一个这种类型的数据。后面你就可以在任何地方使用它。

下面举例我开发 find_path 和 sweep_mesh 工具使用自定义数据类型的案例。
find_path操作演示
https://att.element3ds.com/data/attachment/upload_media/20230808/hwq6gnnf5b3xfv6x.mp4?form=upload_media_10502查找最短路径算法是编程里比较出名的算法,并且有多种方法可以实现。我开发它的目的是让查找路径工具更加灵活,不仅仅可以查找最短的路径,还可以以其它方式查找路径。

这是我在find_path工具里某个地方使用自定义数据类型的用法。如果不使用自定义数据类型,这个工具的开发将会变得非常复杂。并且这些工具的开发还使用了高级技巧里的多维数组,我们先不谈论高级技巧。

另一个案例是我开发的建模工具 sweep_mesh。

sweep_mesh渲染演示,它比Maya自带的sweep插件更快更强大。可以单独控制每根管子的设置。https://att.element3ds.com/data/attachment/upload_media/20230808/p74z443tj9q9h16h.mp4?form=upload_media_10503我在sweep_mesh里使用自定数据结构的目的是简化参数的设置和读取。因为这个工具有大量的参数,我希望将参数封装为多个自定义数据结构。然后在工具的内部调用这些参数。
每个节点都是一个自定义的数据结构。几十个参数端口最终被封装成6个数据端口。大大简化了参数的调用复杂度,并精简了节点连线。


自定义数据类型为艺术家灵活操作数据打开了新的大门,让工具的开发者们更容易实现复杂的算法,并简化了工具的开发过程。
以上就是我对节点可视化编程,中级技巧分享的详细过程。我内心期望我们中国今后可以出现大量的CG工具研发人,让中国的CG技术跻身世界的前端。如果想更多关注,B站,生活的艺术家V。谢谢!
全文完

仰空越梦 发表于 2023-8-8 15:10:37

狠不错i,谢谢分享~

发表于 1970-1-1 08:00:00

qq_萝卜_v7e 发表于 2023-8-9 00:36:04

1

Mis丨畏美 发表于 2023-9-10 10:11:59

{:1_240:}
页: [1]
查看完整版本: 节点可视化编程研发 |中级技巧分享