海子铁路网

 找回密码
 注册进站

QQ登录

只需一步,快速开始

查看: 7801|回复: 20

浅谈固定重联电力机车B车电弓动画的修正问题

 关闭 [复制链接]
发表于 2007-4-30 21:37:47 | 显示全部楼层 |阅读模式
本帖最后由 风雨 于 2013-1-6 17:11 编辑

浅谈固定重联电力机车B车电弓动画的修正问题

 楼主| 发表于 2007-4-30 21:38:43 | 显示全部楼层
本帖最后由 风雨 于 2013-1-6 17:11 编辑

一、问题的提出:
固定重联电力机车,例如SS4G等,在MSTS中的B车,即二号车,在作者没有单独制作升弓动画的情况下,在游戏中存在以下不足之处:
1,如果在编组时,采用A车的Flip方式,即在编组时右键单击使之调头成为B车,但是这种方式下,B车通过道岔时,转向架的旋转方向与轨道方向相反,造成视觉脱轨,如图1所示。
2,为了解决第一个问题,一个有效的方法是在SFM中使用Reverse命令,但是这样做虽然解决了轮对问题,但是副作用很明显,就是电弓动画也被反向了,向上升起的电弓变为向下升起,如图2所示。
要同时解决这两个问题,只有在制作模型之初就将B车模型反向,然后生成.S文件,这对于作者是很容易的事情,但是其他玩家是不具备这样的条件的,因此只能通过修改.S文件的方法实现电弓动画的后期修正。











图1

图1

图2

图2
 楼主| 发表于 2007-4-30 21:39:36 | 显示全部楼层
二、旋转类动画的理论基础:
学过“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中的坐标定义这里不再赘述。
 楼主| 发表于 2007-4-30 21:40:09 | 显示全部楼层
三、电弓动画的问题分析
利用SFM做Reverse操作以后,可以发现模型的坐标向量全部反向,即原来的正X方向变为负X方向,Y、Z轴亦是如此。因此升弓动画中的角度正、余弦函数值如果不做变化,也就造成了原绕X轴顺时针旋转的物体,变为逆时针旋转。由此造成原本升弓的,现在变成电弓下降钻进车子内部去了。

四、解决问题的方法:
根据第二节中的旋转矩阵,只要将旋转角度的负值代入,修正三角函数值,就可以解决问题。由Sin函数的性质所知:
Sin(-A)=-SinA;
Cos(-A)=CosA;
因此只需要将电弓动画的旋转矩阵Sin对应的数字取相反数即可。
头像被屏蔽
发表于 2007-4-30 21:40:52 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
 楼主| 发表于 2007-4-30 21:41:03 | 显示全部楼层
五、实际操作示例:
打开.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 编辑 ]

图3

图3
 楼主| 发表于 2007-4-30 21:41:33 | 显示全部楼层
这个修改方法可以衍生应用在其他动画上面,例如雨刷器,只不过游戏中,雨刷是绕Z轴旋转的而已。关于电弓高度的修改,其实
也是一样的道理,将不同角度的Sin和Cos值代入对应位置就可以了。当然,最根本的解决方法还在于模型作者,毕竟修改模型是最
方便的,也不需要理论。全文完,谢谢!
发表于 2007-4-30 21:42:54 | 显示全部楼层
显然先抢个19T!
显然你又回来了~~~~~~~~~~~~~~~~
显然顶
头像被屏蔽
发表于 2007-4-30 23:13:21 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2007-4-30 23:45:14 | 显示全部楼层
原帖由 quangg 于 2007-4-30 21:37 发表
浅谈固定重联电力机车B车电弓动画的修正问题



OMG....
发表于 2007-5-1 00:24:27 | 显示全部楼层
好久没看见熊了,其实这个东西很久以前就有了,澳大利亚的那个模拟火车站上就有教程,只不过他那个是教你改变导电弓架的高度,其实跟这个原理还是差不多的,呵呵!
发表于 2007-5-1 00:25:10 | 显示全部楼层
呵呵  显然老一辈的都出来活动了
发表于 2007-5-1 02:13:51 | 显示全部楼层
发表于 2007-5-1 12:25:01 | 显示全部楼层
歪嘴能周拴的见解,很值得我们学习啊
发表于 2007-5-1 15:57:09 | 显示全部楼层
发表于 2007-5-1 18:15:42 | 显示全部楼层
原帖由 陈志 于 2007-4-30 23:45 发表



OMG....

幽灵复活了??
 楼主| 发表于 2007-5-1 19:34:05 | 显示全部楼层
原帖由 陈磊 于 2007-5-1 18:15 发表

幽灵复活了??


其实人家一直在的,只不过用马甲回贴而已~呵呵
 楼主| 发表于 2007-5-1 19:38:25 | 显示全部楼层
原帖由 火车喵喵 于 2007-5-1 00:24 发表
好久没看见熊了,其实这个东西很久以前就有了,澳大利亚的那个模拟火车站上就有教程,只不过他那个是教你改变导电弓架的高度,其实跟这个原理还是差不多的,呵呵!


那篇文章我见过,后来还有人翻译了,是不是你啊?
那个文章缺乏理论性,不是我的风格,我喜欢从根本上分析问题,解决问题,就跟刘博士一样~哈哈
发表于 2007-5-1 20:42:22 | 显示全部楼层
ding
发表于 2007-5-2 03:12:30 | 显示全部楼层
原帖由 quangg 于 2007-5-1 19:38 发表
那篇文章我见过,后来还有人翻译了,是不是你啊?
那个文章缺乏理论性,不是我的风格,我喜欢从根本上分析问题,解决问题,就跟刘博士一样~哈哈

恩,是我,哈哈,还是全哥行,什么出来再见见面,商量以前你说的搞批车的问题,你现在还玩MSTS吗??
您需要登录后才可以回帖 登录 | 注册进站

本版积分规则

手机版|小黑屋|Archiver|海子铁路网 ( 京ICP证120035号 京公网安备11010702001036 )

GMT+8, 2024-11-26 15:28

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表