使用Linden脚本语言在第二人生中创建一个简单的舞蹈表演机器人需要多长时间? ,我对lsl没有先验知识,但我知道各种面向对象和事件驱动的编程语言。
答案 0 :(得分:0)
嗯,动画化身很简单:你需要一个舞蹈动画(很容易找到,或者你可以create your own),把它放在一个普通的(这是SL中的基本建筑物) ),然后创建一个简单的脚本,首先请求允许动画所需的头像:
llRequestPermissions(agent_key, PERMISSION_TRIGGER_ANIMATION);
您在run_time_permissions事件中收到回复并按名称触发动画:
run_time_permissions(integer param)
{
llStartAnimation("my animation");
}
这些是必需品;您可能想要在头像触摸您的对象时请求权限,并在第二次触摸时停止动画...或者您可以请求每个头像在一定范围内的权限。
至于“bot”部分,Second Life查看器代码是开源的;如果您不想自己构建它,可以使用几个可自定义的机器人。或者您可以简单地运行官方SL查看器并将其保留;有一种方法可以同时run several instances of SL viewer。这一切都取决于你究竟需要它。
答案 1 :(得分:0)
轻微的语言不匹配:在SecondLife上下文中,当前使物体跳舞的方法称为“木偶” 。术语“机器人” 当前表示由外部脚本api控制头像。
无论如何,几周前当我为一只泰迪熊做一个玩具时,我花了大约两个小时的时间,但这是在从拆开一些旧玩具中学到很多东西之后,我才做完了跳舞,它只是摇晃腿或用胳膊拥抱,但是脚本可以执行很多步骤和部分,您可以在内存中进行弹跳。
在过去十年中,对象的伪造没有太大改善。它受到动作更新率和脚本限制的高度限制。移动通常会在服务器负载下延迟,并且客户端不会总是获得更新,从而会以不同的方式产生暂停和跳过。脚本的最大大小为64k,应该足够大,但实际上它会因lsl中必需的卷积而很快用完。将每个链接的prim移到一个单独需要每个prim的脚本的对象中,直到引入新功能以按linknumber来应用属性为止,仍有许多对象使用可能永远不会更新的旧脚本。笨拙的木偶戏很可怜,但大多数用户不知道如何识别好的木偶剧本。
开始制作人偶脚本的流行方法是在线查找较旧的开源人偶脚本,然后将其更新为可从一个脚本中使用。某些奥秘版本以“ master”和“ slave”脚本的形式提供,需要将它们合并以将从属动作作为一个函数放入主控,并更改函数名llMessageLinked( )
。其他人为每个素数使用相同的脚本。我说过流行,不是最简单也不是最简单,永远不会是最好的。
从头开始编写脚本,活动流需要进入计时器事件,而没有其他任何事件。在等待时是否需要使用计时器,请使用其他状态进行动画处理,因为这是一项繁重的活动,并且您不再需要ifs或buts。
最关键的任务是创建一个循环,以从链接号,位置和旋转的列表构建参数到llSetLinkPrimitiveParamsFast( )
之前的参数列表中。是的,这就是他们所说的,因为它是一个基于列表的繁重函数,您可能只是在世界中称它为SLPPF,而在脚本中却没有。因为SLPPF要求调用的每个参数都具有某些常数,所以每个步骤的参数列表都需要为动画步骤中的每个链接部分包括PRIM_LINK_TARGET, linknumber, PRIM_POS, position, PRIM_ROT, rotation
。
这里是将一个木偶步骤列表放入SLPPF的示例。
list parameters;
integer index;
while ( index < total ) { // total number of elements in each list
parameters += [
PRIM_LINK_TARGET, llList2Integer( currentstep, index ),
PRIM_POS, llList2Vector( currentstep, index+1 ),
PRIM_ROT, llList2Rotation( currentstep, index+2 )
];
index += 3;
}
llSetLinkPrimitiveParamsFast( 0, parameters );
如何创建当前步骤列表是另一回事,但是,如果脚本没有移动列表,则只有在许多链接的部分上才能实现最平滑的移动。因此,如果以0.2秒运行计时器没有对0.3进行任何改进,那是因为您已告诉lsl铲除太多列表。如果天气好的话,这个包含三个列表调用的循环可以在0.1秒内处理大约20个链接。
这实际上是最糟糕的情况,如果立即将太多步骤列表塞入内存,请小心存储。哦,如果您的物体完全消失了,它会在<0,0,0>
附近徘徊,因为1
落在了PRIM_LINK_TARGET
孔中。