【引言】
好久没有写XPRESSO文章了,是因为天气太热的缘故。
这几天下雨,天气凉爽,心情也好了,接着写一篇有关《控制曲线》的文章。
对于一条曲线,如何更好地控制它,有好多办法。下面列举三种方法,一种是XPRESSO实现的;另一种是用“运动图形-追踪对象“实现的;还有一种是用骨骼喽。
也许你可能问:对曲线的控制方法有什么用?
用处大着呢?比如:IK spline 是用样条控制骨骼吧?涉及到样条的控制吧?
再如上面的机械手的那根红色导线,如何跟随“机械手”来回移动?(有人说,这个用样条动力学和约束不可以吗?回答:很难控制!)
【研究】
第一部分:基本原理:
1、在场景,用线性工具绘制、建立一条直线,如下:
2、打开构造,可以看到这条线是由5个点构成,以及每个点得坐标。
3、样条线从白色到蓝色,白色的第一个点,序号(索引号)为0开始,依次类推。
4、建立一个空白,右键添加XPRESSO标签。
5、再建立一个空白对象,改名字为1,设置如下:(空白在此取其空间位置,显示为球体,不能渲染)
6、把空白1和样条拖进XPRESSO编辑面板。
7、添加点节点,做如下连接。
8、点节点简单讲解:
左侧输入端:
1、对象:连接的对象,线条和几何体等,告诉点节点,要处理那个物体上的点;2、点索引:被处理物体标记的点的位置(从0开始);3、点的位置:输入该点得坐标位置,由该节点控制空间这个点,移到输入的坐标位置上。
右侧输出端:
1、点的数量:该物体的点的总数;2、点的位置:输出的是该索引标号点的坐标;3、点法线:垂直改点的法线。(由于该例子是一条曲线,所以这条曲线的点,没有平面,就没有点法线,不能输出。)
9、点索引没有输入,默认为0。所以,样条线上的第一个点的坐标就和空白1的坐标相同,而且样条的第一个点始终跟随着空白1移动。
10、如下图所示。
11、样条的第一个点(索引值为0的点)始终跟随空白1移动。
这就是实现对曲线控制的基本原理。
12、选择“点节点”,更改点索引为1时(第二个点),你会发现没有反应。点击场景控制点,移动一个位置,你就会发现,控制1的确跑到曲线的第二个点上了。
13、以此类推。
14、为什么要移动一下空白1的坐标呢?因为点索引从2改为3的时候,样条的第四个点(索引3)和样条第三个点(索引2)的空间坐标重合,都等与空白1的坐标。当你移动空白1的时候,只有第四个点(索引3)跟着空白1移动,样条的第3点和第4点就分开了。真费劲,可累死我了
。
第二部分:各点控制
这个实例中,样条曲线共有五个点(索引值从0-4),那么该如何完整地控制这条曲线呢?
1、复制空白1,更改空白为“控制点”,然后把1-5个空白作为其子集。
2、在场景中,一次调整1-5的坐标位置如下:
3、如何能实现空间的控制点1-5对样条的各个点控制呢?基本原理还是按照上面的,只不过做一个循环控制而已。
在XPRESSO编辑器重,如下所示:
在XPRESSO中迭代器这一组中的节点,此节点可以模拟程序循环。直至达到最大值的数值增加步长为1 。然后该值被减小到其最小值并开始循环一次。一个完整的循环是每个动画帧进行。
4、“层级节点”属性:
A.参考:选择目标对象,这个起点,从何处开始。
B.参考模式:一是相对参考,二是绝对参考,这与相对路径和绝对路径是一样的。绝对参考你必须从根上告诉它如何寻找,而相对参考,你只要告诉它一个起点,然后,只要告诉它,向上一层,或向下一层,即可,非常方便,建议用默认的相对参考.
C.起始位置[ -2147483648..2147483647 ]
这定义了参考模式设置为使用开始位置的起始位置。该设置是相对于拥有该标签的XpressO对象。例如,如果你设置起始位置到第一个在这个层面上,该节点引用在同一层次级别拥有该标记对象的第一个元素。
这对象:拥有该标签的对象。
在层次结构:选择的第一个对象上一级的层次结构。
倒在层次结构:跳转到第一个对象下一级的层次结构。
继任者在这个层面上:选择在同一层级的下一个对象。
前任在这个层面上:跳转到同一层级上一个对象。
首先在这个层面上:选择在同一层级的第一个元素。
最后在这个层面上:参考在同一层级的最后一个元素。
首先在场景:选择第一个场景中的物体。
最后在场景:跳转到场景的最后一个元素
D.启动距离[ 1..2147483647 ]
对于某些开始位置的模式,你可能想跳几个步骤在层次结构中一气呵成。在这种情况下,使用起始距离作为乘数的起始位置。例如,要引用一个对象,它是三个位置拥有该标签的XpressO ,设置起始位置到继任者在这个层面上,并设置起始距离为3的对象之后。
E.开始路径:
Uup one hierarchical level U代表向上一层,往上寻找
Ddown one hierarchical level D 代表向下一层,往下寻找
Pprevious object on current hierarchical level P 在当前层的前一个物体对象
Nnext object on current hierarchical level N是当前层的下一个物体对象
Ffirst object on hierarchical level F 是的第一个对象
Llas object on hierarchical level L是最后一个对象
F.迭代路径:
层次不断迭代重复这条道路。例如N将导致该节点到输出都在同一水平上一个接一个的所有对象。
层次迭代器继续输出对象,直到出现以下情况:
有在由开始的路径和(重复)迭代路径定义的等级地位没有更多的对象。
由最大迭代输入端口定义的迭代次数已经达到了。
层级节点然后是指由参考路径定义并启动路径再次的对象。在下一次节点被调用时,迭代路径将被重复一遍。
看完以上,你是否要昏过去了。你把它想象它是一个容器,你的指针这项那个层,并告诉它在这个层中,是向前还是向后,那么它会不对地循环一个个在端口输出对象的。
5、层级节点的输入输出参数:还是很简单的。
左侧输入:最大迭代:告诉循环次数,;开启:启用。
右侧输出:对象:输出对象端口;数量:包含对象的数量。
6、采用默认设置,把控制点拖入参考中。开始路径为D,意思是在开始循环的位置是控制点“下”的各个物体;N循环方向是下一个,那就是1,2,3,4,5这个循序进行。
7、现在层级节点已经完成。但是你不能直接从层级节点往外去对象,必须用一个“对象索引”节点来完成。
为什么对象索引ObjectIndex节点存在的原因?是因为当你使用迭代器,你不能直接查出的对象,即在该环路的一部分迭代器当前位置。在迭代循环中挑出一个特定的元素。
右键--新建节点--XPRESSO-常规--对象索引节点。
8、做如下链接。
这个必须解释,否则你糊涂。层级对象依次输出五个空白控制点(1-5)的对象ID,把这个空白点ID传给对象索引节点。对象索引节点接到这个对象的名称,通过实例输出端口传给了空白1对象。(虽然1这个节点是空白1,但是,由于输入端对象的更改,那么他也可能变成2或345等对象),对象索引同时把索引号传给点节点的输入端点索引。
这样就完成了循环的“绑定”。如:层级输出“空白2”对象,对象索引从实例对端口输出的对象“空白2”,索引输出是1,1那个节点,此时变成了空白2,它输出给点接点是空白2位置的坐标,电接点的索引值是1,就是样条线的第二个点,从而实现了空白2和样条线第二个点的“绑定”。
真费劲,不知道你懂否?
9、看看场景,样条线的各个点与空白1-5个点一一对应。
10、移动空白点,样条各个点也跟随移动,实现了对样条的控制。
11、如果你感觉样条线太硬,点击更改类型为“阿基玛”。
12、添加多边形为截面,添加扫描对象,点击样条做如下优化。
13、场景中出现了一个多边形物体。这个物体的形状是由样条曲线控制的,这个样条曲线是由这五个控制点控制的。
14、通过调整五个控制点的位置,从而控制这个多边形。
如果实现这个控制,你必须用骨骼来实现吗?我开这个方法就不错!
【后记】
1、伴随着窗外的雨声,用了1个小时,一气呵成,写完了这篇。这一篇内容太难理解了,所以不再写往下写了。
下一篇研究用“扫描对象”实现对曲线的控制,再举一个有趣的例子吧,这篇太枯燥!
2、如果你仍然不明白原理,那你就记住下面的图。以后,我讲解用《骨骼控制曲线》的时候,还要用到它。