Parsing 有没有办法解析LSL(林登脚本语言)中错误设置为180度的多个坐标脚本数据?

Parsing 有没有办法解析LSL(林登脚本语言)中错误设置为180度的多个坐标脚本数据?,parsing,linden-scripting-language,Parsing,Linden Scripting Language,我在《第二人生》中使用LSL(林登脚本语言)。我已经导入了一个虚拟(网格)飞机对象,并花了数小时制作了各种部件的动画,如伞蓬和起落架 现在我发现,当所有轴都设置为零时,我应该将对象导入到面向东的方向(我的是面向西的)。现在,我已使用正确的方向重新导入对象,但是,由于主网格对象是我的“根prim”,并且存储每个动画部分的位置的帧都与此相对,因此所有动画部分(子prim)现在正好反转180度 是否有人知道我可以解析脚本数据以查找并自动添加180度修正的方法 我花了几个小时在动画上,有很多页的数据,所

我在《第二人生》中使用LSL(林登脚本语言)。我已经导入了一个虚拟(网格)飞机对象,并花了数小时制作了各种部件的动画,如伞蓬和起落架

现在我发现,当所有轴都设置为零时,我应该将对象导入到面向东的方向(我的是面向西的)。现在,我已使用正确的方向重新导入对象,但是,由于主网格对象是我的“根prim”,并且存储每个动画部分的位置的帧都与此相对,因此所有动画部分(子prim)现在正好反转180度

是否有人知道我可以解析脚本数据以查找并自动添加180度修正的方法

我花了几个小时在动画上,有很多页的数据,所以一个自动化的解决方案将是非常可取的,任何帮助都会得到感激

下面是我需要解析的代码片段:

    link_message(integer n, integer c, string m, key id){
    vector lSize = llList2Vector(llGetLinkPrimitiveParams(1,[7]),0);
    if(m == lAnimName + "|0"){// Frame 0.

        if(lLeg3t)
            llSetLinkPrimitiveParamsFast(lLeg3t,[

                33, <0.245628*lSize.x, -0.183868*lSize.y, -0.184195*lSize.z>, 29, <-0.500000, 0.000000, -0.707107, 0.500000>

            ]);

        if(lWire3t)
            llSetLinkPrimitiveParamsFast(lWire3t,[

                33, <0.259854*lSize.x, -0.187642*lSize.y, -0.196354*lSize.z>, 29, <-0.500000, 0.000000, -0.707107, 0.500000>

            ]);

        if(lWire3b)
            llSetLinkPrimitiveParamsFast(lWire3b,[

                33, <0.244813*lSize.x, -0.194661*lSize.y, -0.171052*lSize.z>, 29, <0.073912, -0.549525, -0.444997, 0.703233>

            ]);

        if(lFoot3)
            llSetLinkPrimitiveParamsFast(lFoot3,[

                33, <0.261851*lSize.x, -0.180508*lSize.y, -0.157508*lSize.z>, 29, <-0.270598, -0.270598, -0.653282, 0.653282>

            ]);

        if(lLeg3b)
            llSetLinkPrimitiveParamsFast(lLeg3b,[

                33, <0.247470*lSize.x, -0.200321*lSize.y, -0.190136*lSize.z>, 29, <0.073912, -0.549525, -0.444997, 0.703233>

            ]);

        if(lSled3)
            llSetLinkPrimitiveParamsFast(lSled3,[

                33, <0.251954*lSize.x, -0.184123*lSize.y, -0.169543*lSize.z>, 29, <0.000000, 0.000000, -0.707107, 0.707107>

            ]);

        if(lWire2t)
            llSetLinkPrimitiveParamsFast(lWire2t,[

                33, <0.268535*lSize.x, 0.190722*lSize.y, -0.196969*lSize.z>, 29, <-0.061628, 0.541675, -0.454520, 0.704416>

            ]);

        if(lLeg2t)
            llSetLinkPrimitiveParamsFast(lLeg2t,[

                33, <0.255244*lSize.x, 0.185132*lSize.y, -0.176223*lSize.z>, 29, <-0.061628, 0.541675, -0.454520, 0.704416>

            ]);

        if(lWire2b)
            llSetLinkPrimitiveParamsFast(lWire2b,[

                33, <0.237334*lSize.x, 0.180499*lSize.y, -0.159385*lSize.z>, 29, <0.517145, -0.024678, -0.706676, 0.482246>

            ]);
link\u消息(整数n、整数c、字符串m、密钥id){
向量lSize=llList2Vector(llgetlinkprimitives参数(1[7]),0);
如果(m==lAnimName+“|0”){//帧0。
如果(lLeg3t)
llSetLinkPrimitiveParamsFast(lLeg3t[
33, 29, 
]);
如果(lWire3t)
llSetLinkPrimitiveParamsFast(lWire3t[
33, 29, 
]);
如果(lWire3b)
llSetLinkPrimitiveParamsFast(lWire3b[
33, 29, 
]);
如果(lFoot3)
llSetLinkPrimitiveParamsFast(lFoot3[
33, 29, 
]);
如果(lLeg3b)
llSetLinkPrimitiveParamsFast(lLeg3b[
33, 29, 
]);
如果(lSled3)
llSetLinkPrimitiveParamsFast(lSled3[
33, 29, 
]);
if(lWire2t)
llSetLinkPrimitiveParamsFast(lWire2t[
33, 29, 
]);
如果(lLeg2t)
llSetLinkPrimitiveParamsFast(lLeg2t[
33, 29, 
]);
如果(lWire2b)
llSetLinkPrimitiveParamsFast(lWire2b[
33, 29, 
]);

我不是编剧,但我想我有点明白发生了什么

尝试此操作-在Blender中导入您的车辆。选择所有零件,确保您的车辆朝向正确的方向。如果没有,请按R,然后按Z,然后按您希望其旋转的度数,然后输入

一旦车辆朝向正确的方向。点击Ctrl-A并在弹出菜单中选择“旋转”。这会将旋转数据全部重置为0。导出对象并上载。重新缩放对象时,您会发现所有零件的旋转现在都设置为0

如果我正确理解您的quandry,那么应该解决子prims的旋转问题


如果不是……看看当编写noob脚本试图提供帮助时会发生什么?=/

我不是脚本编写者,但我想我有点了解发生了什么

尝试此操作-在Blender中导入您的车辆。选择所有零件,确保您的车辆朝向正确的方向。如果没有,请按R,然后按Z,然后按您希望其旋转的度数,然后输入

一旦车辆朝向正确的方向。点击Ctrl-A并在弹出菜单中选择“旋转”。这会将旋转数据全部重置为0。导出对象并上载。重新缩放对象时,您会发现所有零件的旋转现在都设置为0

如果我正确理解您的quandry,那么应该解决子prims的旋转问题


如果没有…看到编写noob脚本试图提供帮助时会发生什么吗?=/

我记得如果在任何一个非零四元数组件上翻转符号,它将翻转旋转180度

所以

if(lLeg3b)
llSetLinkPrimitiveParamsFast(lLeg3b[
33, 29, 
]);
变成:

    if(lLeg3b)
        llSetLinkPrimitiveParamsFast(lLeg3b,[

            33, <0.247470*lSize.x, -0.200321*lSize.y, -0.190136*lSize.z>, 29, <-0.073912, -0.549525, -0.444997, 0.703233>

        ]);
if(lLeg3b)
llSetLinkPrimitiveParamsFast(lLeg3b[
33, 29, 
]);

我记得,如果你在任何一个非零四元数分量上翻转符号,它将翻转旋转180度

所以

if(lLeg3b)
llSetLinkPrimitiveParamsFast(lLeg3b[
33, 29, 
]);
变成:

    if(lLeg3b)
        llSetLinkPrimitiveParamsFast(lLeg3b,[

            33, <0.247470*lSize.x, -0.200321*lSize.y, -0.190136*lSize.z>, 29, <-0.073912, -0.549525, -0.444997, 0.703233>

        ]);
if(lLeg3b)
llSetLinkPrimitiveParamsFast(lLeg3b[
33, 29, 
]);

对于未来,请使用标志名称而不是其值。这会使代码更难阅读(LINK_ROOT、PRIM_SIZE、PRIM_POS_LOCAL和PRIM_ROT_LOCAL),并且不会带来性能成本。对于未来,请使用标志名称而不是其值。这会使代码更难阅读(LINK_ROOT、PRIM_SIZE、PRIM_POS_LOCAL和PRIM_ROT_LOCAL)而且没有性能成本。