查看: 2476|回复: 4

multiswitch节点设置

[复制链接]

该用户从未签到

发表于 2008-9-8 09:51:47 | 显示全部楼层 |阅读模式
如题,场景文件格式为flt的,利用指定名称的查找功能获取了此multiswitch节点,,利用setActiveSwitchSet()实现了状态转换,可是在程序中,出现了这样一来的问题:
在形式上这样一来的代码段

  1. if (_KBST->_b_LA_Leg1_Up)
  2. {}
  3. else
  4. {}
  5. 中,
  6. 程序在执行过程中,只有_b_LA_Leg(1,2,3,4)_Down下的执行,其他的却都不执行setActiveSwitchSet(),不知道是为什么?这让我很迷惑,是不是编写的程序有问题,还是bug?


  7. void AL_NodeCallBack::AL_ForLeg(osgSim::DOFTransform* DL1,osgSim::DOFTransform* DL2,osgSim::DOFTransform* DL3,osgSim::DOFTransform* DL4,osgSim::DOFTransform* DQ1,osgSim::DOFTransform* DQ2,osgSim::MultiSwitch* DS1,osgSim::MultiSwitch* DS2,osgSim::MultiSwitch* DS3,osgSim::MultiSwitch* DS4)
  8. {
  9. float HandStep = quickstep;

  10. ///////////////////////////////快慢速设置开始///////////////////////////
  11. if (_KBST->_b_Speed)
  12. {
  13. HandStep = quickstep;
  14. }
  15. else
  16. {
  17. HandStep = slowstep;
  18. }
  19. ///////////////////////////////快慢速设置结束/////////////////////////////

  20. ///////////////////////////////所有调平腿动作开始///////////////////////////////
  21. if (_KBST->_b_LA_All_Up)
  22. {
  23. _Leg1 -= HandStep;
  24. _Leg2 -= HandStep;
  25. _Leg3 -= HandStep;
  26. _Leg4 -= HandStep;

  27. if (_Leg1 <= 0.0)
  28. {
  29. _Leg1 = 0.0;
  30. }
  31. if (_Leg2 <= 0.0)
  32. {
  33. _Leg2 = 0.0;
  34. }
  35. if (_Leg3 <= 0.0)
  36. {
  37. _Leg3 = 0.0;
  38. }
  39. if (_Leg4 <= 0.0)
  40. {
  41. _Leg4 = 0.0;
  42. }
  43. DS1->setActiveSwitchSet(1);
  44. DS2->setActiveSwitchSet(1);
  45. DS3->setActiveSwitchSet(1);
  46. DS4->setActiveSwitchSet(1);

  47. DL1->setCurrentTranslate(osg::Vec3(0,0,_Leg1));
  48. DL2->setCurrentTranslate(osg::Vec3(0,0,_Leg2));
  49. DL3->setCurrentTranslate(osg::Vec3(0,0,_Leg3));
  50. DL4->setCurrentTranslate(osg::Vec3(0,0,_Leg4));
  51. }
  52. else
  53. {
  54. DS1->setActiveSwitchSet(0);
  55. DS2->setActiveSwitchSet(0);
  56. DS3->setActiveSwitchSet(0);
  57. DS4->setActiveSwitchSet(0);
  58. }

  59. if (_KBST->_b_LA_All_Down)
  60. {
  61. _Leg1 += HandStep;
  62. _Leg2 += HandStep;
  63. _Leg3 += HandStep;
  64. _Leg4 += HandStep;

  65. if (_Leg1 >= maxD)
  66. {
  67. _Leg1 = maxD;
  68. }
  69. if (_Leg2 >= maxD)
  70. {
  71. _Leg2 = maxD;
  72. }
  73. if (_Leg3 >= maxD)
  74. {
  75. _Leg3 = maxD;
  76. }
  77. if (_Leg4 >= maxD)
  78. {
  79. _Leg4 = maxD;
  80. }

  81. DS1->setActiveSwitchSet(1);
  82. DS2->setActiveSwitchSet(1);
  83. DS3->setActiveSwitchSet(1);
  84. DS4->setActiveSwitchSet(1);


  85. DL1->setCurrentTranslate(osg::Vec3(0,0,_Leg1));
  86. DL2->setCurrentTranslate(osg::Vec3(0,0,_Leg2));
  87. DL3->setCurrentTranslate(osg::Vec3(0,0,_Leg3));
  88. DL4->setCurrentTranslate(osg::Vec3(0,0,_Leg4));
  89. }
  90. else
  91. {
  92. DS1->setActiveSwitchSet(0);
  93. DS2->setActiveSwitchSet(0);
  94. DS3->setActiveSwitchSet(0);
  95. DS4->setActiveSwitchSet(0);
  96. }
  97. ///////////////////////////////所有调平腿动作结束///////////////////////////////

  98. ///////////////////////////////调平腿动作开始///////////////////////////////

  99. if (_KBST->_b_LA_Leg1_Up)
  100. {
  101. DS1->setActiveSwitchSet(1);
  102. _Leg1 -= HandStep;
  103. if (_Leg1 <= 0.0)
  104. {
  105. _Leg1 = 0.0;
  106. }
  107. DL1->setCurrentTranslate(osg::Vec3(0,0,_Leg1));
  108. }
  109. else
  110. {
  111. DS1->setActiveSwitchSet(0);
  112. }

  113. if (_KBST->_b_LA_Leg1_Down)
  114. {
  115. DS1->setActiveSwitchSet(1);
  116. _Leg1 += HandStep;
  117. if (_Leg1 >= maxDD)
  118. {
  119. if (_Leg1 >= maxD)
  120. {
  121. _Leg1= maxD;
  122. }

  123. }
  124. DL1->setCurrentTranslate(osg::Vec3(0,0,_Leg1));
  125. }
  126. else
  127. {
  128. DS1->setActiveSwitchSet(0);
  129. }
  130. ///////////////////////////////调平腿动作结束///////////////////////////////

  131. ///////////////////////////////调平腿动作开始///////////////////////////////
  132. if (_KBST->_b_LA_Leg2_Up)
  133. {
  134. DS2->setActiveSwitchSet(1);
  135. _Leg2 -= HandStep;

  136. if (_Leg2 <= 0.0)
  137. {
  138. _Leg2 = 0.0;
  139. }

  140. DL2->setCurrentTranslate(osg::Vec3(0,0,_Leg2));
  141. }
  142. else
  143. {
  144. DS2->setActiveSwitchSet(0);
  145. }

  146. if (_KBST->_b_LA_Leg2_Down)
  147. {
  148. DS2->setActiveSwitchSet(1);
  149. _Leg2 += HandStep;
  150. if (_Leg2 >= maxD)
  151. {
  152. _Leg2 = maxD;
  153. }
  154. DL2->setCurrentTranslate(osg::Vec3(0,0,_Leg2));
  155. }
  156. else
  157. {
  158. DS2->setActiveSwitchSet(0);
  159. }
  160. ///////////////////////////////调平腿动作结束///////////////////////////////

  161. ///////////////////////////////调平腿动作开始///////////////////////////////
  162. if (_KBST->_b_LA_Leg3_Up)
  163. {
  164. DS3->setActiveSwitchSet(1);
  165. _Leg3 -= HandStep;

  166. if (_Leg3 <= 0.0)
  167. {
  168. _Leg3 = 0.0;
  169. }

  170. DL3->setCurrentTranslate(osg::Vec3(0,0,_Leg3));
  171. }
  172. else
  173. {
  174. DS3->setActiveSwitchSet(0);
  175. }

  176. if (_KBST->_b_LA_Leg3_Down)
  177. {
  178. DS3->setActiveSwitchSet(1);
  179. _Leg3 += HandStep;
  180. if (_Leg3 >= maxD)
  181. {
  182. _Leg3 = maxD;
  183. }
  184. DL3->setCurrentTranslate(osg::Vec3(0,0,_Leg3));
  185. }
  186. else
  187. {
  188. DS3->setActiveSwitchSet(0);
  189. }
  190. ///////////////////////////////调平腿动作结束///////////////////////////////

  191. ///////////////////////////////调平腿动作开始///////////////////////////////
  192. if (_KBST->_b_LA_Leg4_Up)
  193. {
  194. DS4->setActiveSwitchSet(1);
  195. _Leg4 -= HandStep;

  196. if (_Leg4 <= 0.0)
  197. {
  198. _Leg4 = 0.0;
  199. }

  200. DL4->setCurrentTranslate(osg::Vec3(0,0,_Leg4));
  201. }
  202. else
  203. {
  204. DS4->setActiveSwitchSet(0);
  205. }

  206. if (_KBST->_b_LA_Leg4_Down)
  207. {
  208. DS4->setActiveSwitchSet(1);
  209. _Leg4 += HandStep;
  210. if (_Leg4 >= maxD)
  211. {
  212. _Leg4 = maxD;
  213. }
  214. DL4->setCurrentTranslate(osg::Vec3(0,0,_Leg4));
  215. }
  216. else
  217. {
  218. DS4->setActiveSwitchSet(0);
  219. }
  220. ///////////////////////////////调平腿动作结束///////////////////////////////
  221. }


复制代码

谢谢!

[ 本帖最后由 gjczhhbz 于 2008-9-8 17:51 编辑 ]

该用户从未签到

发表于 2008-9-8 12:00:23 | 显示全部楼层
原帖由 gjczhhbz 于 2008-9-8 09:51 发表
如题,场景文件格式为flt的,利用指定名称的查找功能获取了此multiswitch节点,如何进行闪烁设置呢,我看到有一个函数setSingleChildOn(int ,int),是不是这个函数是实现此功能的呢?再者就是这这两个参数的含义是什么?

...


MultiSwitch可以保存多个开关状态集(Switch Set,通过setValueList追加),用以快速设定多个子节点的开关状态。只有当前状态集(通过setActiveSwitchSet设置)才会影响到子节点的显示与隐藏。
setSingleChildOn函数的作用是把多重开关节点的所有子节点设置为off,只有指定的那个节点设置为on。连个参数分别表示要设置的那个开关状态集switchSet以及状态集中唯一设置为开启的位置pos。

您所说的闪烁是什么意思?如果是类似红绿灯的那种快速切换子节点的显/隐,使用MultiSwitch并事先设置几个不同的开关状态集是没有问题的

该用户从未签到

发表于 2008-9-8 13:16:32 | 显示全部楼层
我不太理解您的代码中准备完成什么工作,不过有一点请注意,您的程序中将依次执行以下判断(因为您没有用else if):
if (_KBST->_b_LA_All_Up) …… else ……
if (_KBST->_b_LA_All_Down) …… else ……
if (_KBST->_b_LA_Leg1_Up) …… else ……
if (_KBST->_b_LA_Leg1_Down) …… else ……
if (_KBST->_b_LA_Leg2_Up) …… else ……
if (_KBST->_b_LA_Leg2_Down) …… else ……
if (_KBST->_b_LA_Leg3_Up) …… else ……
if (_KBST->_b_LA_Leg3_Down) …… else ……
if (_KBST->_b_LA_Leg4_Up) …… else ……
if (_KBST->_b_LA_Leg4_Down) …… else ……
并且每个条件分支中几乎都执行了setActiveSwitchSet
由于setActiveSwitchSet的作用只是指定要使用哪个状态集,真正的开关操作要等到场景遍历时才执行。因此这里只有最后的那个条件分支对setActiveSwitchSet的影响是有效的!
换句话说,您在所有的LA_Leg_Up分支中对DS和DL变量的setActiveSwitchSet操作都没有意义,因为它们会在随后被LA_Leg_Down分支(或者其else部分)重置
我觉得这可能是您的代码有逻辑错误

还有不要直接就修改帖子的标题和内容,我说的并不一定就正确,而且有可能别的朋友也会对您的话题发表意见,这样一来人家就无从下手了。

该用户从未签到

 楼主| 发表于 2008-9-8 15:44:43 | 显示全部楼层
谢谢您的解答,您提的建议,我以后会注意/改进!

该用户从未签到

 楼主| 发表于 2008-9-8 17:50:05 | 显示全部楼层
谢谢,问题已经解决(按照提示)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表