
RealFlow翻译教程07——露珠项链.doc
23页word 小蜘蛛长的很难看,八条腿,还有六只眼睛,皮肤灰灰的,上面还有细长的毛毛在这个草丛里,大家都看不起它就连它自己也觉得自己太丑了它不敢跟有着红色黑点外套漂亮的瓢虫小姐,还有会唱歌的纺织娘小姐一起玩就连和毛毛虫一起,也不敢,至少人家以后会变成好看的蝴蝶呢,自己会变成什么呢?,还是丑陋的八脚小怪物小蜘蛛,只能偷偷的的躲在角落里织网,一圈又一圈 因为小蜘蛛这么长时间练习和它那种坚韧的精神,它的网到是织的很漂亮整整齐齐,又细又有弹性,还能很容易就粘到很多像蚊子,苍蝇这样的坏家伙虽然小蜘蛛的网织的已经这么好了,可从来没人夸奖过它,它得到的只有嘲笑 一天早上小蜘蛛,又向往常一样,看自己织好的网哇,上面挂了好多露珠,晶晶亮,好漂亮小蜘蛛心想,赶紧把收起来吧,不然太阳出来,露珠就飞走了嘿,到了晚上,在阴凉处的露珠真的还在小蜘蛛小心的碰了碰,叮的,弹一下没有掉下去原来经过一天的时间,没有晒到太阳的露珠,已经变成真的珍珠一样的东西,永远不会飞走了小蜘蛛可高兴了,它想这要是戴在身上多好看啊!它小心的拿了一串挂在自己身上,真的很好看可小蜘蛛想,这么好看的东西戴在我身上真是可惜了 对,送给瓢虫小姐和纺织娘小姐她们吧。
两们小姐,收到这个礼物后,可高兴了还抱着小蜘蛛亲了一下,小蜘蛛也很开心可是,啊呀,因为一共就做了三串,两串给了,瓢虫小姐和纺织娘小姐,还有一串不小心被自己弄丢了毛毛虫就没有了小蜘蛛答应了毛毛虫,一定会在它变成好看的蝴蝶时,把那一串做好的 恩,学习了下面内容,你就可以帮助小蜘蛛喽!路径转换〔Path Converter〕器 这个免费的工具,可以把一个模型的动画路径转换成序列粒子你可以把粒子调·节成稠密的或稀疏的在这路径上粒子路径就是物体运动轨迹另一个应用是模拟生长效果,例如根的生长当然,路径转换器,需要动画路径,但不管这路径是在RealFlow或其它三维软件创建都是可以的这个脚本支持多项选择,你可以用来同时模拟多个结点你可以选择整个坐标〔XYZ〕或只是用一个轴〔x,y或z〕路径转换器脚本的用户界面快捷直观,并能返回消息还可以自动重命名教程里还附有帮助手册这个脚本根本思想是:动画曲线中的分量值〔如,Y值〕转换成RealFlow 粒子位移〔Position〕.这种转换可用于可视化运动轨迹,创建抽像图案或模拟生长效果,例如根的生长请注意这个脚本需要一定编程语言知识,如果你想理解每步思路,你需要熟悉Python根本概念。
这个教程不是Python入门,但您可以在RealFlow 5手册中第 20 和 21 章 找到用许多实例的指导〔也可以等待后续译者翻译的关于RealFlow Python的书更新〕动画曲线在计算机图形学中,有三种根本方法做动画2.动力学〔解算〕动画第一种方法在确定时间点记录关键帧,软件会进展插值你可以根据需要加很多关键帧,然后进展Baking(烘焙〕Baking就是,在每一帧给一个或更多参数加上关键帧因此最后的关键帧数目取决于调整的帧速率动力学动画,也称为解算动画,不需要key关键帧,因为全部动画都是自动计算这个方法局限性是如果你要播放,就要全部再解算一遍想绕开这一问题,程序就要记录物体位移输出到外部文件,使它可以重复播放另外可以bake动力学模拟出的动画,重新创建关键帧动画图1:该脚本将很复杂的动画转换成粒子RealFlow也支持第三种方法:表达式利用公式和计算出的值给对像创建动画从表达式创建出的动画也能bake成动画曲线无论使用哪种方法,你都需要动画帧,否如此不能提取位移值key和曲线发挥重要作用,RealFlow中曲线编辑器很容易编辑修改它们你也能用类似或更先进的方法在三维软件中操作。
路径转换器脚本,我们用曲线和key来创建根本粒子,表示对像的动画路径输出单个帧,用Python是很容易的,但如果曲线是基于很少的帧生成,就会得到很粗糙的分辨率要增加分辨率,我们需要更多数量点,最好的方法是设置一个可定义参数分析动画曲线第一步就是分析动画曲线,然后找出适宜的Pyhon函数访问所有这些信息如上所述,曲线基于关键帧,程序自动插值对这个任务,动画程序有不同插值方法,像 TCB,Bezier,linear或step.这些方法决定了曲线的光滑度,还用来创建加速或减速效果如果你想知道更多关于Realflow的插值方法,请看用户手册,17章 “The Curve Editor Tool Bar〞(g.Node Type).而对我们的目的来说,插值方法是不重要的Python获取动画曲线函数是:getParameterCurve(property name)“property name〞一定要替换成适宜的参数,例如 rotation或position,但也能用别的参数,例如viscosity 或speed.在我们例子中它是position相比于speed属性,position值是所谓的矢量,总是用x,y和z三个分量组成。
三个分量合在一起就是对像在三维空间位置所以为了完整描述对像的位置,我需要三条曲线为了完整描述,脚本还得知道是哪个对像使用的,例如:animatedObject = scene.getObject(object name)“object name〞是在你的场景中所有有动画的对像节点名有动画的参数是显示成橘黄色如果对像是“Sphere01〞,你就要这样写:animatedObject = scene.getObject("Sphere01")完整代码是:positionCurveX = animatedObject.getParameterCurve("Position.X")positionCurveY = animatedObject.getParameterCurve("Position.Y")positionCurveZ = animatedObject.getParameterCurve("Position.Z")图2.在RealFlow曲线编辑器里的x,y轴动画关键帧getKeys()上面这个函数不是取决于x,y或z,仅是追加在“getParameterCurve()〞语句后我们得到一个所有曲线关键帧〔 key〕的列表(list)keyListX = positionCurveX.getKeys()keyListY = positionCurveY.getKeys()keyListZ = positionCurveZ.getKeys()到目前为止,我们只有特定时间的点,想要连续的曲线,我们需要更多的采样点。
幸运的是,RealFlow的Python接口提供了一个函数,可输出一条曲线每一个点的值此函数已被用到position曲线:currentPosX = positionCurveX.evaluate(time)currentPosY = positionCurveY.evaluate(time)currentPosZ = positionCurveZ.evaluate(time)“time〞,实际上是当前处理的曲线的位置,当我们有足够的时间步骤,我们可以创建一个可定制插值率的粒子表示形式问题是我们为什么仍然要key,尽管我们有方法可以找出曲线上任何一点的值?答案是,key决定了动画开始完毕时间这意味着转换将只能执行每个position动画曲线起始和完毕点之间这个脚本总是需要三个position曲线,如果条件不满足就会终止你可以创建一个动画曲线,只简单的加一个点所有与position相关的操作都要有x,y,z,下面的例子说明只是针对x轴的操作模式现在我们有动画曲线,可以继续key因为有三条曲线x,y,z我们得找出单个关键帧给每条曲线,这个功能的函数是: 查找开始和完毕值为了得到开始和完毕值,我们要找出key的时间,列出下表:timeListX = []timeList Y = ...for keyX in keyListX: timeX = keyX.getTime() timeListX.append(timeX)for keyY in ...然后我们列出:timeListX.sort()最低的值是入口,出口是最高的值:startTimeX = timeListX[0]stopTimeX = timeListX[len(timeListX) - 1]从开始和完毕值我们再一次找出输入的最小和最大值,这决定了了动画最大X围。
要做到这一点,我们已经把所有的最大值和最小值追加到一个新的列表中,并加以比拟:minStartTime = 0maxStartTime = 0for startTime in startList: if (startTime <= minStartTime): minStartTime = startTimefor stopTime in stopList: if (stopTime >= maxStartTime): maxStartTime = stopTime所有的动画仅是这两个值的不同:maxAnimationLength = maxStartTime - minStartTime创建一个可定制的分辨率现在,我们已经计算整个长度可以很容易地划分为一个采样点曲线:numberOfSamplePoints = int(maxAnimationLength * (1 / interval) + 1)这个变量“numberOfSamplePoints〞将用作终止值循环当循环运行时,我们用“evaluate()〞语句,在给出的时间找出position值:posListX = []posListY = ...for i in range(0, numberOfSamplePoints): currentPosX = positionCurveX.evaluate(minStartTime + i * interval) posListX.append(currentPosX) posListY.append ...组合position向量最后我们要组合position矢量,从我们计算的值中,然后画出粒子。
因此我们需要另一个循环:nullVeloctiy = Vector.new(0, 0, 0)for j in range(0, numberOfSamplePoints): posX = posListX[j] posY = ... posVector = Vector.new(posX, posY, posZ) emitter.addParticle(posVector, nullVelocity)这些操作得计算x,y和z矢量“nullVelocity〞是必须的,因为粒子总是需要两个参数:position和velocity.因为我们不想粒子移动,速度必须是0.下面你会看到一个mesh好的例子最终脚本上面收集到的这些信息,可以创建一个工作用的脚本了创建一个批处理〔batch〕脚本或事件脚本,直接执行计算目前batch脚本是不错的你可以用在别的三维软件做的动画,导出。
