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

<div dir="ltr">
<p>该系统演示了怎样用VSL来操纵三维实体及复制物体。</p>
<ol>
<li>开始一个新作品并在3D Layout工作区添加一些随机的物体(或创建一些三维帧 - 3D Frame)。创建一个组(Group)并将所有物体添加到该组中。<br><br>
    注意:如果你用的是3D Frame,请确保你在<a href="https://sites.google.com/site/x3dofcn/ui/1_menu_bar/4_options_menu/general_preferences/prefs_3d_layout-rendering.html">3D
    Layout - Rendering preferences</a>
面板中的播放器模式(Player Mode)处勾选了"Show All Frames"框,以便在播放模式下能看到那些3D Frame。<br>
</li>
<li>在层级(Level)下创建一个脚本并添加一个Run VSL BB。在VSL Script Manager中,添加两个pIn参数:第一个叫做"objGroup"且为Group类型,第二个叫做"radius"且为float类型。<br>
</li>
<li> 讲以下代码复制到代码视图,并编译VSL脚本:<br><pre>void main()<br>
{<br><span>// Get number of objects</span>
<br>
int nbObject = objGroup.GetObjectCount();<br><br><span>// Calculate angle betwen each objets</span>
<br>
float angle = 2*pi/nbObject;<br><br>
Vector pos(0,0,0);<br><br><span>// Place each object on the circle</span>
<br>
for (int i = 0; i &lt; nbObject; ++i)<br>
{<br><span>// We get the nth object and cast it in Entity3D</span>
<br>
Entity3D obj = Entity3D.Cast(objGroup.GetObject(i));<br><br><span>// If cast failed obj is null so we skip process...</span>
<br>
if (!obj)<br>
continue;<br><br>
/<span>/ Compute object position</span>
<br>
pos.x = radius*sin(i*angle);<br>
pos.z = radius*cos(i*angle);<br><br><span>// Place object</span>
<br>
obj.SetPosition(pos, null, true);<br>
}<br>
}<br></pre>
</li>
<li>在Schematic工作区,按如下方式编辑你的Run VSL BB的参数:<br><ul>
<li>objGroup = Group1 (或者是你自己给那个组 - group所选的名字)
      </li>
<li>radius = 10
    </li>
</ul>
</li>
<li>运行该VSL脚本。你就会看到3D Layout工作区中所有物体都均匀分布在圆周上。
<p>可以对这个脚本进行一个有趣的修改:使用单个物体,在运行时将它复制几遍,即不是在起始时就有几个物体。<br></p>
</li>
<li>在VSL Script Manager工作区中,移除那个代表组的pIn参数并再添加两个pIn:一个叫做"originalObject"且类型为Entity3D,另一个叫做"nbOject"且类型为int。然后按以下内容修改你的代码:<br><pre>void main()<br>
{<br><span>// Calculate angle betwen each objets</span>
<br>
float angle = 2*pi/nbObject;<br><br>
Vector Pos(0,0,0);<br><br><span>// Place each object on the circle</span>
<br>
for (int i = 0; i &lt; nbObject; ++i)<br>
{<br><span>// We copy a nth object and cast it in Entity3D</span>
<br>
Entity3D obj = Entity3D.Cast(bc.Copy(originalObject, true, true));<br><br><span>//If cast failed obj is null so we skip process...</span>
<br>
if (!obj)<br>
continue;<br><br><span>// Compute object position</span>
<br>
pos.x = radius*sin(i*angle);<br>
pos.z = radius*cos(i*angle);<br><br><span>// Place object</span>
<br>
obj.SetPosition(pos, null, true);<br>
}<br>
}<br></pre>
</li>
<li>编辑你的pIn参数,编译VSL脚本然后运行它。<br><br>
    你会看到你的原始对象按指定的次数被复制,并且所有对象被均匀分布在圆周上。注意:那些复制出来的物体是以动态方式创建的(由<a href="https://sites.google.com/site/x3dofcn/vsl-virtools/bc">bc对象</a>
的"Copy"方法中的第二个参数控制)。所以如果你按了Reset键,你所有动态创建的物体会被销毁。</li>
</ol>
</div>

你可能感兴趣的:(tools)