P87~P98的学习记录

书的 P87~P98这部分粗略的介绍了如何用script来控制物体的移动,旋转,缩放,生成动画,以及最后的小部分3D音效。

(一)代码主要涉及的是item类。
(二)Torque定义了重力因素,我们自行添加的物体都受到重力影响,所以要物体静止就需要考虑力平衡。
(三)物体的移动,旋转,缩放,生成动画,在script上大同小异,容易理解。
(四)书上的这部分其实尚未进入正式的script教学。

下面是学习记录

摘抄一下移动的script

datablock ItemData(TestShape){
      shapefile="~/data/shapes/items/heart.dts";
      mass=1;
      friction=1;
};

function InsertTestShape(){
      %shape=new Item(){
            datablock=Testshape;
            rotation="0 0 1 0";
      }
      MissionCleanup.add(%shape);
      %shape.setTransform("-90 -2 20 0 0 1 0");
      echo("inserting shape "@%shape);
      return %shape;
}

function MoveShape(%shape,%dist){
      %xfrm=%shape.gettransform();
      %lx=getword(%xfrm,0);
      %ly=getword(%xfrm,1);
      %lz=getword(%xfrm,2);
      %lx+=%dist;
      %shape.settransform(%lx SPC %ly SPC %lz SPC "0 0 1 0");
}

function MoveTest(){
      %ms=InsertShape();
      MoveShape(%ms,15);
}

   
那么现在逐行来看

   
首先第一个是数据块部分,什么是数据块,它本身是一个对象,用于组织其他对象的特征。书上的描述还是比较抽象的……后面还没仔细看,所以尚未理解深刻。显 然,ItemData就是这个数据块的名字,也可以理解为我们所写函数的函数名(当然还是有区别的……)。在代码的格式上我发现,datablock在写完之后的大括号外面有分号,而普通的函数(functioin)并没有,当然函数最后本来就是没有的--b这应该是书写格式的注意点。
   
那么看里面,shapefile由名知意,显然是模型地址,而后面的两个变量的赋值就是对质量和摩擦力的赋值,在现阶段看来似乎是程式性的东西,我还没有试过更改它们的大小,估计会比较有趣……

   
数据块结束,下面是3个函数,我发觉本书的印刷似乎有小小的问题,譬如InsertShape函数中一些大括号的额匹配有点乱,不直观。

   
三个函数都是可以在控制台里直接输入函数名执行的,以后的例子应该也是这样的吧。

   
先看第一个函数InsertShape,首先是调用new方法来创建一个静态形状实例,以testshape为数据块,然后设置旋转角度,为什么要设置角度?书上描述是使之有意义,是否是使之符合物理?另外,"0 0 1 0"的格式我也尚未理解,这也同时牵涉到后面几个方法的参数设置,我印象里这在3Dmax中似乎也有,看来得请教美工组的同志。 后是这句MissionCleanup.add(%shape);我理解是垃圾回收处理机制,对任务完成之后无用的形状句柄进行Cleanup。具体细节 书上尚未介绍。我的猜想是这相当与或者内部机制是一个队列,现在生成的这个形状被置于这个队列尾,missioin end时进行清除。哦,注意一下,上面new方法创建实例后已经把句柄保存到%shape中了,下面一直在调用这个变量。然后% shape.setTransform("-90 -2 20 0 0 1 0");调用形状的setTransform方法来设置位置,参数同样是我不明白,需要请教的那类。echo就是print了,不多说了。函数最后返回已 生成形状的句柄。

   
然后是MoveShape函数,它有两个参数,显然一个是形状句柄,一个是距离变量,distance……没拼错吧……第一句是取得位置,是个方法,下面的getword方法不怎么理解 不过书后面应该会介绍到。getword的第一个参数是%xfrm,即第一句得到的位置,我猜想这个变量值是一个字符串,如同-90 -2 20 0 0 1 0此类。getword作用是在这个字符串内选取特定部分,而第二个参数不明白,不过应该和定位有关。然后,书上描述目的只是在x轴移动,即%lx+=% dist;这句作用,猜想%lx值就是x轴上的位置参数。最后设置位置,那么参数里的SPC是什么意思?

    最后一个函数DoMoveTest讲上面的函数结合了起来,如果没有这个函数其实你也可以手动在控制台控制……当然它的作用是自动整合运行了,某个程度上相当于main函数(当然区别是很大的)。



   
移动完了,旋转,缩放是类似的,有InsertTestShape函数和ItemData,只是动作不一样,参数换一下而已,总体上很好理解,但其中还有一点小问题。如下:


function TurnShape(%shape,%angle){
      %xfrm=%shape.gettransform();
      %lx=getword(%xfrm,0);
      %ly=getword(%xfrm,1);
      %lz=getword(%xfrm,2);
      %rx=getword(%xfrm,3);
      %ry=getword(%xfrm,4);
      %rz=getword(%xfrm,5);
      %angle+=1.0;
     
%rd=%angle;
      %shape.settransform(xxxxxxxx);
}

上面的代码是旋转部分的代码相当于上例中的MoveShape函数。疑问就是,其中%angle+=1.0;这句是什么作用?比如说我要它旋转60度,它为什么要事先加上1度?

   
缩放就省略了,几乎相同。

   
下面是使上面几个动作能连贯自动完成的动画部分。
   
其中有个关键函数schedule(),然而书上暂时尚未详细介绍。

   
里面有一个AnimShape函数,参数是%shape,%dist,%angle,%scale,显然,这个函数包含了三个动作,哟动,旋转,缩放。那么如何使之以动画形式完成?我猜关键就是schedule()函数,时间表,字面意思这么理解,看下它的参数组成:
   
scheduel(200,0,AnimShape,%shape,%dist,%angle,%scale);
   
头两个参数我尚未理解,后面的意思是调用哪个函数和参数,完成哪些动作吧……具体内部机制要理解了scheduel函数的内部过程才能理解……
   
另外,AnimShape函数中还有一个判断形状大小的if函数,用全局变量grow判断,用处是使形状在规定的范围内缩放,蛮有趣的。
   
    3D
音频部分,有很多特定参数,在后面应该会详细介绍。

暂时先写到这边……

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值