浅谈固定重联电力机车B车电弓动画的修正问题
本帖最后由 风雨 于 2013-1-6 17:11 编辑浅谈固定重联电力机车B车电弓动画的修正问题
本帖最后由 风雨 于 2013-1-6 17:11 编辑
一、问题的提出:
固定重联电力机车,例如SS4G等,在MSTS中的B车,即二号车,在作者没有单独制作升弓动画的情况下,在游戏中存在以下不足之处:
1,如果在编组时,采用A车的Flip方式,即在编组时右键单击使之调头成为B车,但是这种方式下,B车通过道岔时,转向架的旋转方向与轨道方向相反,造成视觉脱轨,如图1所示。
2,为了解决第一个问题,一个有效的方法是在SFM中使用Reverse命令,但是这样做虽然解决了轮对问题,但是副作用很明显,就是电弓动画也被反向了,向上升起的电弓变为向下升起,如图2所示。
要同时解决这两个问题,只有在制作模型之初就将B车模型反向,然后生成.S文件,这对于作者是很容易的事情,但是其他玩家是不具备这样的条件的,因此只能通过修改.S文件的方法实现电弓动画的后期修正。
二、旋转类动画的理论基础:
学过“CAD/CAM”或者“计算机图形学”及其他类似课程的人,一定知道图形变换矩阵,对于电弓而言,其动画只是纯粹的三维旋转,简单而言,其变换矩阵的数学表达式可以写作:
1,绕X轴旋转角度A:
| CosA, SinA, 0, 0|
|-SinA, CosA, 0, 0|
|0, 0, 1, 0|
|0, 0, 0, 1|
2,绕Y轴旋转角度B:
| 1,0, 0, 0|
| 0, CosB, SinB, 0|
| 0,-SinB, CosB, 0|
| 0, 0, 0, 1|
3,绕Z轴旋转角度C:
|CosC, 0, -SinC, 0|
| 0, 1, 0, 0|
|SinC, 0,CosC, 0|
| 0, 0, 0, 1|
当物体做顺时针方向旋转时,角度取负值;
当物体做逆时针方向旋转时,角度取正值;
由于这部分内容具有一定的理论深度,所以就不再展开了,好在电弓的动画为绕X轴的纯旋转运动,所以也不涉及更深的数学运算。
注意,在MSTS中的坐标定义这里不再赘述。 三、电弓动画的问题分析
利用SFM做Reverse操作以后,可以发现模型的坐标向量全部反向,即原来的正X方向变为负X方向,Y、Z轴亦是如此。因此升弓动画中的角度正、余弦函数值如果不做变化,也就造成了原绕X轴顺时针旋转的物体,变为逆时针旋转。由此造成原本升弓的,现在变成电弓下降钻进车子内部去了。
四、解决问题的方法:
根据第二节中的旋转矩阵,只要将旋转角度的负值代入,修正三角函数值,就可以解决问题。由Sin函数的性质所知:
Sin(-A)=-SinA;
Cos(-A)=CosA;
因此只需要将电弓动画的旋转矩阵Sin对应的数字取相反数即可。 五、实际操作示例:
打开.S文件,找到动画定义段:
anim_node PANTOGRAPHBOTTOM1A (
controllers ( 2
tcb_rot ( 3
tcb_key ( 0 0 -0.999936 -0.0113444 0 0 0 0 0 0 )
tcb_key ( 1 0 -0.991042 0.133554 0 0 0 0 0 0 )
tcb_key ( 2 0 -0.962455 0.27144 0 0 0 0 0 0 )
)
linear_pos ( 3
linear_key ( 0 0 0.363506 -0.1302 )
linear_key ( 1 0 0.363506 -0.1302 )
linear_key ( 2 0 0.363506 -0.1302 )
)
)
)
anim_node PANTOGRAPHMIDDLE1A (
controllers ( 2
tcb_rot ( 3
tcb_key ( 0 -0.0375158 0 0 0.999296 0 0 0 0 0 )
tcb_key ( 1 0.186953 0 0 0.982369 0 0 0 0 0 )
tcb_key ( 2 0.419452 0 0 0.907777 0 0 0 0 0 )
)
linear_pos ( 3
linear_key ( 0 0 -0.00255395 -1.47258 )
linear_key ( 1 0 -0.00255428 -1.47258 )
linear_key ( 2 0 -0.00255441 -1.47258 )
)
)
)
anim_node PANTOGRAPHTOP1 (
controllers ( 2
tcb_rot ( 3
tcb_key ( 0 0.0270493 0 0 0.999634 0 0 0 0 0 )
tcb_key ( 1 -0.0527718 0 0 0.998607 0 0 0 0 0 )
tcb_key ( 2 -0.157296 0 0 0.987551 0 0 0 0 0 )
)
linear_pos ( 3
linear_key ( 0 0 0.261794 2.03101 )
linear_key ( 1 0 0.261793 2.03101 )
linear_key ( 2 0 0.261794 2.03101 )
)
)
)
anim_node PANTOGRAPHMIDDLE1B (
controllers ( 2
tcb_rot ( 3
tcb_key ( 0 -0.0314108 0 0 0.999507 0 0 0 0 0 )
tcb_key ( 1 0.0710622 0 0 0.997472 0 0 0 0 0 )
tcb_key ( 2 0.181377 0 0 0.983414 0 0 0 0 0 )
)
linear_pos ( 3
linear_key ( 0 -0.0300005 -0.129405 0 )
linear_key ( 1 -0.0300005 -0.129405 0 )
linear_key ( 2 -0.0300005 -0.129405 0 )
)
)
)
anim_node PANTOGRAPHBOTTOM1B (
controllers ( 2
tcb_rot ( 3
tcb_key ( 0 0.0392598 0 0 0.999229 0 0 0 0 0 )
tcb_key ( 1 -0.172789 0 0 0.984959 0 0 0 0 0 )
tcb_key ( 2 -0.392337 0 0 0.919822 0 0 0 0 0 )
)
linear_pos ( 3
linear_key ( 0 0 0.120251 0.106305 )
linear_key ( 1 0 0.12025 0.106305 )
linear_key ( 2 0 0.12025 0.106305 )
)
)
)
anim_node PANTOGRAPHBOTTOM1C (
controllers ( 2
tcb_rot ( 3
tcb_key ( 0 0 0.00959917 -0.999954 0 0 0 0 0 0 )
tcb_key ( 1 0 -0.129661 -0.991558 0 0 0 0 0 0 )
tcb_key ( 2 0 -0.267238 -0.96363 0 0 0 0 0 0 )
)
linear_pos ( 3
linear_key ( 0 -0.490001 0.12424 -0.0365776 )
linear_key ( 1 -0.490001 0.12424 -0.0365778 )
linear_key ( 2 -0.49 0.12424 -0.0365777 )
)
)
)
anim_node TOPEQUIP (
controllers ( 0 )
)
)
)
)
)
其中tcb_Key就是旋转矩阵的表达式。第一位是动画帧序号,依次递增,不需修改。第二个非零数就是旋转角度的Sin函数值,最后一个非零数就是旋转角度的Cos函数值。中间的零决定了其绕X、Y、Z中哪一根轴旋转,但是这里的X、Y、Y轴定义取决于模型,而不是游戏中的坐标定义。将上述代码修改为:
anim_node PANTOGRAPHBOTTOM1A (
controllers ( 2
tcb_rot ( 3
tcb_key ( 0 0 -0.999936 -0.0113444 0 0 0 0 0 0 )
tcb_key ( 1 0 0.991042 0.133554 0 0 0 0 0 0 )
tcb_key ( 2 0 0.962455 0.27144 0 0 0 0 0 0 )
)
linear_pos ( 3
linear_key ( 0 0 0.363506 0.1302 )
linear_key ( 1 0 0.363506 0.1302 )
linear_key ( 2 0 0.363506 0.1302 )
)
)
)
anim_node PANTOGRAPHMIDDLE1A (
controllers ( 2
tcb_rot ( 3
tcb_key ( 0 -0.0375158 0 0 0.999296 0 0 0 0 0 )
tcb_key ( 1 -0.186953 0 0 0.982369 0 0 0 0 0 )
tcb_key ( 2 -0.419452 0 0 0.907777 0 0 0 0 0 )
)
linear_pos ( 3
linear_key ( 0 0 -0.002554 1.47258 )
linear_key ( 1 0 -0.002554 1.47258 )
linear_key ( 2 0 -0.002554 1.47258 )
)
)
)
anim_node PANTOGRAPHTOP1 (
controllers ( 2
tcb_rot ( 3
tcb_key ( 0 0.0270493 0 0 0.999634 0 0 0 0 0 )
tcb_key ( 1 0.0527718 0 0 0.998607 0 0 0 0 0 )
tcb_key ( 2 0.157296 0 0 0.987551 0 0 0 0 0 )
)
linear_pos ( 3
linear_key ( 0 0 0.261794 -2.03101 )
linear_key ( 1 0 0.261793 -2.03101 )
linear_key ( 2 0 0.261794 -2.03101 )
)
)
)
anim_node PANTOGRAPHMIDDLE1B (
controllers ( 2
tcb_rot ( 3
tcb_key ( 0 -0.0314108 0 0 0.999507 0 0 0 0 0 )
tcb_key ( 1 -0.0710622 0 0 0.997472 0 0 0 0 0 )
tcb_key ( 2 -0.181377 0 0 0.983414 0 0 0 0 0 )
)
linear_pos ( 3
linear_key ( 0 0.030001 -0.129405 0 )
linear_key ( 1 0.030001 -0.129405 0 )
linear_key ( 2 0.030001 -0.129405 0 )
)
)
)
anim_node PANTOGRAPHBOTTOM1B (
controllers ( 2
tcb_rot ( 3
tcb_key ( 0 0.0392598 0 0 0.999229 0 0 0 0 0 )
tcb_key ( 1 0.172789 0 0 0.984959 0 0 0 0 0 )
tcb_key ( 2 0.392337 0 0 0.919822 0 0 0 0 0 )
)
linear_pos ( 3
linear_key ( 0 0 0.120251 -0.106305 )
linear_key ( 1 0 0.12025 -0.106305 )
linear_key ( 2 0 0.12025 -0.106305 )
)
)
)
anim_node PANTOGRAPHBOTTOM1C (
controllers ( 2
tcb_rot ( 3
tcb_key ( 0 0 0.00959917 -0.999954 0 0 0 0 0 0 )
tcb_key ( 1 0 0.129661 -0.991558 0 0 0 0 0 0 )
tcb_key ( 2 0 0.267238 -0.96363 0 0 0 0 0 0 )
)
linear_pos ( 3
linear_key ( 0 0.490001 0.12424 0.036578 )
linear_key ( 1 0.490001 0.12424 0.036578 )
linear_key ( 2 0.49 0.12424 0.036578 )
)
)
)
anim_node TOPEQUIP (
controllers ( 0 )
)
)
)
)
)
值得注意的是,对于序号为0的第一行关键帧,不需要修改,因为这行只是决定了电弓的初始旋转角度,跟动画没有关系。我们所做的只要将后两行的第一个非零小数取相反数就行了,就这么简单,呵呵!最终效果如图3所示。
[ 本帖最后由 quangg 于 2007-4-30 21:45 编辑 ] 这个修改方法可以衍生应用在其他动画上面,例如雨刷器,只不过游戏中,雨刷是绕Z轴旋转的而已。关于电弓高度的修改,其实
也是一样的道理,将不同角度的Sin和Cos值代入对应位置就可以了。当然,最根本的解决方法还在于模型作者,毕竟修改模型是最
方便的,也不需要理论。全文完,谢谢! 显然先抢个19T!
显然你又回来了~~~~~~~~~~~~~~~~
显然顶 原帖由 quangg 于 2007-4-30 21:37 发表 http://bbs.hasea.com/images/common/back.gif
浅谈固定重联电力机车B车电弓动画的修正问题
OMG.... 好久没看见熊了,其实这个东西很久以前就有了,澳大利亚的那个模拟火车站上就有教程,只不过他那个是教你改变导电弓架的高度,其实跟这个原理还是差不多的,呵呵! 呵呵显然老一辈的都出来活动了 顶 歪嘴能周拴的见解,很值得我们学习啊 顶 原帖由 陈志 于 2007-4-30 23:45 发表 http://bbs.hasea.com/images/common/back.gif
OMG....
幽灵复活了?? 原帖由 陈磊 于 2007-5-1 18:15 发表 http://bbs.hasea.com/images/common/back.gif
幽灵复活了??
其实人家一直在的,只不过用马甲回贴而已~呵呵 原帖由 火车喵喵 于 2007-5-1 00:24 发表 http://bbs.hasea.com/images/common/back.gif
好久没看见熊了,其实这个东西很久以前就有了,澳大利亚的那个模拟火车站上就有教程,只不过他那个是教你改变导电弓架的高度,其实跟这个原理还是差不多的,呵呵!
那篇文章我见过,后来还有人翻译了,是不是你啊?
那个文章缺乏理论性,不是我的风格,我喜欢从根本上分析问题,解决问题,就跟刘博士一样~哈哈 ding 原帖由 quangg 于 2007-5-1 19:38 发表 http://bbs.hasea.com/images/common/back.gif
那篇文章我见过,后来还有人翻译了,是不是你啊?
那个文章缺乏理论性,不是我的风格,我喜欢从根本上分析问题,解决问题,就跟刘博士一样~哈哈
恩,是我,哈哈,还是全哥行,什么出来再见见面,商量以前你说的搞批车的问题,你现在还玩MSTS吗??
页:
[1]
2