1

在第二人生中使用 Linden 脚本语言创建一个简单的舞蹈表演机器人需要多少时间?,我没有 LSL 的先验知识,但我知道各种面向对象和事件驱动的编程语言。

4

2 回答 2

0

好吧,动画化身很简单:你需要一个舞蹈动画(这些很容易找到,或者你可以创建自己的),把它放在一个 prim 中(这是 SL 中的基本建筑对象),然后创建一个简单的脚本,它首先请求为所需头像设置动画的权限:

llRequestPermissions(agent_key, PERMISSION_TRIGGER_ANIMATION);

您在 run_time_permissions 事件中收到响应并按名称触发您的动画:

run_time_permissions(integer param) 
{
    llStartAnimation("my animation");
}

这些是必需品;您可能希望在头像触摸您的对象时请求权限,并在第二次触摸时停止动画......或者您可以为特定范围内的每个头像请求权限。

至于“bot”部分,Second Life 查看器代码是开源的;如果您不想自己构建它,可以使用几个可定制的机器人。或者您可以简单地运行一个官方的 SL 查看器并保持打开状态;有一种方法可以同时运行多个 SL 查看器实例。这一切都取决于你到底需要什么。

官方 LSL 门户可以在这里找到,虽然我更喜欢稍微过时的LSL wiki

于 2010-10-14T18:54:23.850 回答
0

轻微的语言不匹配:让对象表演舞蹈目前在 SecondLife 上下文中被称为“木偶戏” 。术语“机器人”目前是指通过外部脚本 api 控制头像。

无论如何,在一个例子中,我花了大约两个小时来写,几周前我为一只泰迪熊写了一个,但那是在拆开一些旧的之后学到了很多东西,我从来没有完成过舞蹈,它只是摇摆腿或用手臂拥抱,但脚本可以用于您可以在记忆中填充的任何步骤和部分。

在过去的十年中,物体的木偶戏并没有太大的进步。它受到移动更新率和脚本限制的高度限制。移动通常在服务器负载下延迟,并且客户端并不总是得到更新,这会产生不同程度的暂停和跳过。脚本的最大大小为 64k,这应该足够了,但实际上由于 lsl 中所需的卷积很快就会耗尽。在一个单独的对象中移动每个链接的 prim 需要在每个 prim 中添加一个脚本,直到引入了新功能以通过链接编号应用属性,仍然有许多对象使用可能永远不会更新的旧脚本。迟钝的木偶制作了一个可怜的节目,但大多数用户不知道如何识别一个好的木偶脚本。

开始制作 puppet 脚本的流行方法是在线查找较旧的开源 puppet 脚本,并将其更新为使用一个脚本工作。一些 Archane 版本以“主”和“从”脚本的形式给出,它们需要合并,将从属操作作为函数放入主脚本,更改llMessageLinked( )函数名称。其他人对每个 prim 使用相同的脚本。我说流行,不是最简单最容易的,也永远不会是最好的。

从头开始编写脚本,活动流需要进入一个计时器事件,其中没有其他内容。如果在等待时需要计时器,请使用不同的状态进行动画处理,因为这是一项繁重的活动,您不再需要 if 或 buts。

最关键的任务是创建一个循环,将参数从链接编号、位置和旋转列表构建到llSetLinkPrimitiveParamsFast( ). 是的,这就是他们所说的,因为它是一个基于列表的繁重函数,您可以将其称为 SLPPF inworld 而不是在脚本中。因为 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洞里。

于 2019-04-20T07:20:16.640 回答