书的 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音频部分,有很多特定参数,在后面应该会详细介绍。
暂时先写到这边……