通过实例学习Virtools脚本语言VSL - 将物体排列于圆周上

简介: 该系统演示了怎样用VSL来操纵三维实体及复制物体。 开始一个新作品并在3D Layout工作区添加一些随机的物体(或创建一些三维帧 - 3D Frame)。创建一个组(Group)并将所有物体添加到该组中。

该系统演示了怎样用VSL来操纵三维实体及复制物体。

  1. 开始一个新作品并在3D Layout工作区添加一些随机的物体(或创建一些三维帧 - 3D Frame)。创建一个组(Group)并将所有物体添加到该组中。

    注意:如果你用的是3D Frame,请确保你在3D Layout - Rendering preferences 面板中的播放器模式(Player Mode)处勾选了"Show All Frames"框,以便在播放模式下能看到那些3D Frame。
  2. 在层级(Level)下创建一个脚本并添加一个Run VSL BB。在VSL Script Manager中,添加两个pIn参数:第一个叫做"objGroup"且为Group类型,第二个叫做"radius"且为float类型。
  3. 讲以下代码复制到代码视图,并编译VSL脚本:
    void main()
    {
    // Get number of objects
    int nbObject = objGroup.GetObjectCount();

    // Calculate angle betwen each objets
    float angle = 2*pi/nbObject;

    Vector pos(0,0,0);

    // Place each object on the circle
    for (int i = 0; i < nbObject; ++i)
    {
    // We get the nth object and cast it in Entity3D
    Entity3D obj = Entity3D.Cast(objGroup.GetObject(i));

    // If cast failed obj is null so we skip process...
    if (!obj)
    continue;

    // Compute object position
    pos.x = radius*sin(i*angle);
    pos.z = radius*cos(i*angle);

    // Place object
    obj.SetPosition(pos, null, true);
    }
    }
  4. 在Schematic工作区,按如下方式编辑你的Run VSL BB的参数:
    • objGroup = Group1 (或者是你自己给那个组 - group所选的名字)
    • radius = 10
  5. 运行该VSL脚本。你就会看到3D Layout工作区中所有物体都均匀分布在圆周上。

    可以对这个脚本进行一个有趣的修改:使用单个物体,在运行时将它复制几遍,即不是在起始时就有几个物体。

  6. 在VSL Script Manager工作区中,移除那个代表组的pIn参数并再添加两个pIn:一个叫做"originalObject"且类型为Entity3D,另一个叫做"nbOject"且类型为int。然后按以下内容修改你的代码:
    void main()
    {
    // Calculate angle betwen each objets
    float angle = 2*pi/nbObject;

    Vector Pos(0,0,0);

    // Place each object on the circle
    for (int i = 0; i < nbObject; ++i)
    {
    // We copy a nth object and cast it in Entity3D
    Entity3D obj = Entity3D.Cast(bc.Copy(originalObject, true, true));

    //If cast failed obj is null so we skip process...
    if (!obj)
    continue;

    // Compute object position
    pos.x = radius*sin(i*angle);
    pos.z = radius*cos(i*angle);

    // Place object
    obj.SetPosition(pos, null, true);
    }
    }
  7. 编辑你的pIn参数,编译VSL脚本然后运行它。

    你会看到你的原始对象按指定的次数被复制,并且所有对象被均匀分布在圆周上。注意:那些复制出来的物体是以动态方式创建的(由bc对象 的"Copy"方法中的第二个参数控制)。所以如果你按了Reset键,你所有动态创建的物体会被销毁。
目录
相关文章
|
8月前
|
存储 算法
算法编程(二十六):判断路径是否相交
算法编程(二十六):判断路径是否相交
73 0
Altium Designer中元件重叠放置时,如何消除报错
Altium Designer中元件重叠放置时,如何消除报错
652 0
|
7月前
|
定位技术 图形学
【Unity实战】零代码实现物理2d绳子和绳桥效果——Hinge Joint 2D的使用
【Unity实战】零代码实现物理2d绳子和绳桥效果——Hinge Joint 2D的使用
397 0
|
8月前
|
网络协议 算法 安全
【专栏】RIP是一种古老的内部网关协议,使用距离矢量算法,基于跳数更新路由表,最古老的距离矢量协议
【4月更文挑战第28天】RIP是一种古老的内部网关协议,使用距离矢量算法,基于跳数更新路由表。其工作原理包括周期性更新、度量标准、路由表更新和防止计数到无穷问题的技术。RIP简单易用,适合小规模网络,但在大规模网络中效率低且有限制。随着OSPF和EIGRP等协议的发展,RIP在大型网络中的应用减少,但在中小型网络和遗留系统中仍有其地位。RIPv2的改进提高了安全性与灵活性。尽管逐渐被替代,RIP在理解路由协议基本概念和历史中仍具价值。
252 1
|
8月前
|
存储 编译器 C语言
【指针一:穿越编程边界的超能力】
【指针一:穿越编程边界的超能力】
|
8月前
|
存储
【指针二:穿越编程边界的超能力】
【指针二:穿越编程边界的超能力】
|
8月前
|
存储 C++
【指针三:穿越编程边界的超能力】(下)
【指针三:穿越编程边界的超能力】
|
8月前
【指针三:穿越编程边界的超能力】(上)
【指针三:穿越编程边界的超能力】
|
8月前
|
存储 算法 Serverless
连线消除游戏的原理和实现
连线消除游戏的原理和实现
113 0
|
前端开发 芯片
【芯片前端】保持代码手感——不重叠序列检测
【芯片前端】保持代码手感——不重叠序列检测