Linden scripting language 是时候使用linden脚本语言为second life创建一个机器人了?

Linden scripting language 是时候使用linden脚本语言为second life创建一个机器人了?,linden-scripting-language,Linden Scripting Language,使用Linden脚本语言在second life中创建一个简单的舞蹈表演机器人需要多少时间,我之前没有lsl方面的知识,但我知道各种面向对象和事件驱动的编程语言。好吧,给阿凡达制作动画非常简单:你需要一个舞蹈动画(很容易找到,或者你可以),把它放在prim中(这是SL中的基本构建对象),然后创建一个简单的脚本,该脚本首先请求对所需化身进行动画制作的许可: llRequestPermissions(agent_key, PERMISSION_TRIGGER_ANIMATION); 您在运行时权限

使用Linden脚本语言在second life中创建一个简单的舞蹈表演机器人需要多少时间,我之前没有lsl方面的知识,但我知道各种面向对象和事件驱动的编程语言。

好吧,给阿凡达制作动画非常简单:你需要一个舞蹈动画(很容易找到,或者你可以),把它放在prim中(这是SL中的基本构建对象),然后创建一个简单的脚本,该脚本首先请求对所需化身进行动画制作的许可:

llRequestPermissions(agent_key, PERMISSION_TRIGGER_ANIMATION);
您在运行时权限事件中收到响应,并按名称触发动画:

run_time_permissions(integer param) 
{
    llStartAnimation("my animation");
}
这些是基本要素;当一个化身触碰你的对象时,你可能会想要请求权限,并在第二次触碰时停止动画。。。或者,您可以为特定范围内的每个化身请求权限

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


可以找到官方的LSL门户,不过我更喜欢稍微过时的。

轻微的语言不匹配:让一个对象表演舞蹈在SecondLife环境中目前被称为“木偶戏”。术语“bot”目前指通过外部脚本api控制化身

无论如何,有一次,我花了大约两个小时来写,几周前我为一只泰迪熊做了一个,但那是在从拆开一些旧的玩具熊中学到了很多东西之后,我一直没有完成舞蹈,它只是摆动腿或用手臂拥抱,但是,不管你能在内存中填充多少步骤和部分,脚本都是有能力的

在过去的十年里,木偶艺术并没有多大的进步。它受到移动更新速率和脚本限制的高度限制。在服务器负载下,移动通常会延迟,并且客户端并不总是获得更新,这会产生不同程度的暂停和跳过。脚本的最大大小为64k,这应该足够了,但实际上,由于lsl中需要进行卷积,所以运行速度很快。移动对象中的每个链接prim时,需要在每个prim中分别使用一个脚本,直到引入新功能以按linknumber应用属性,仍然有许多对象使用可能永远不会更新的旧脚本。拉格木偶是一个可怜的表演,但大多数用户不知道如何识别一个好的木偶剧本

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

从头开始编写脚本时,活动流需要进入一个计时器事件,其中没有其他内容。如果等待时需要计时器,则使用不同的状态设置动画,因为这是一项繁重的活动,并且不需要更多的“如果”或“但是”

最关键的任务是创建一个循环,将链接编号、位置和旋转列表中的参数构建到参数列表中。是的,这就是他们所说的,因为它是一个基于列表的函数,你可以在World中称它为SLPPF,但在脚本中不能。由于SLPPF要求调用为每个参数设置某些常量,因此每个步骤的参数列表需要包括动画步骤中每个链接零件的
PRIM_LINK_目标、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 );
列出参数;
整数指数;
而(索引<总数){//每个列表中的元素总数
参数+=[
初始链接目标,llList2Integer(当前步骤,索引),
PRIM_POS,llList2Vector(当前步长,索引+1),
PRIM_ROT,LLLIST2旋转(当前步骤,索引+2)
];
指数+=3;
}
llSetLinkPrimitiveParamsFast(0,参数);
如何创建currentstep列表是另一个问题,但只有在脚本不移动列表的情况下,才能在许多链接部分上进行最平滑的移动。因此,如果以0.2秒的速度运行计时器与0.3秒相比没有任何改进,那是因为您告诉lsl要处理太多的列表。如果天气好的话,这个包含三个列表调用的循环可以在0.1秒内处理大约20个链接


这实际上是最糟糕的,如果一次将太多步骤列表塞进内存,请小心内存。哦,如果你的物体完全消失了,它将在
附近徘徊,因为
1
降落在
PRIM\u LINK\u TARGET
孔中

谢谢你的回复,很清楚。但我不能在某个网站上托管我的机器人,因为它本质上只是一个脚本。我如何才能从另一个化身向我的机器人发出命令,从键入到本地聊天的特定频道??例如:我想在特定的本地聊天频道发出“sit”命令时激活sit功能。机器人需要连接到SL;你可以通过网站拥有机器人接口,但机器人本身是一段代码,必须在某处运行。谷歌搜索更多细节,我没有用过,所以我不能提供太多的建议。至于发出命令,在SL客户端的聊天中键入“/1 sit”将在通道1上显示“sit”。频道0是附近的头像听到的聊天频道,所以说“/0废话”就等于说“废话”。这个答案被接受了,但这可能是因为八年前很少有人回答lsl问题。最初的问题是关于让一个物体跳舞,这是不能用外部物体来完成的