查看: 1930|回复: 16

漫游的例子 为么运行时总出现异常

[复制链接]

该用户从未签到

发表于 2011-9-1 11:59:04 | 显示全部楼层 |阅读模式
Wander.zip (3.92 MB, 下载次数: 109)

该用户从未签到

 楼主| 发表于 2011-9-1 14:02:32 | 显示全部楼层


这个问题也出现在我其他的程序中了
有时候发生 有时候又能运行
不知道怎么回事哇 是不是跟我的配置设置相关?

该用户从未签到

发表于 2011-9-1 15:35:21 | 显示全部楼层
估计是DYNAMIC的问题,你动态更新的节点,应该设置数据变度

该用户从未签到

发表于 2011-9-1 15:36:57 | 显示全部楼层
这个问题我也遇到过的很奇怪 后来我下载了3.0.1就可以了 你试试

该用户从未签到

 楼主| 发表于 2011-9-1 16:27:11 | 显示全部楼层
估计是DYNAMIC的问题,你动态更新的节点,应该设置数据变度
tianxiao888 发表于 2011-9-1 15:35



    能否具体说一下呢?

该用户从未签到

 楼主| 发表于 2011-9-1 17:56:08 | 显示全部楼层
回复 3# tianxiao888


    这个能否具体说一下呢?

该用户从未签到

发表于 2011-9-1 18:41:48 | 显示全部楼层
就是你动态更新的节点,都要设置数据变度为DYNAMIC

该用户从未签到

发表于 2011-9-2 08:31:49 | 显示全部楼层
回复  tianxiao888


    这个能否具体说一下呢?
feifei90544 发表于 2011-9-1 17:56



   是否请您先具体说一下,您写了什么样的代码,用的什么样的工程和环境配置

该用户从未签到

 楼主| 发表于 2011-9-2 09:37:56 | 显示全部楼层
本帖最后由 feifei90544 于 2011-9-2 11:24 编辑

回复 8# array

例子有打包放上去 从FreeSouth的书里参照的一个 建的是一个Win32控制台程序 VS2010 OSG3.0.0

该用户从未签到

发表于 2011-9-2 13:05:56 | 显示全部楼层
请精简代码贴出来~~
你放个工程包不太好~~~

该用户从未签到

 楼主| 发表于 2011-9-2 13:39:16 | 显示全部楼层
  1. osg::Matrixd CSouth::getMatrix(void) const
  2. {
  3. osg::Matrixd mat;
  4. mat.makeRotate(m_vRotation._v[0], osg::Vec3(1.0f, 0.0f, 0.0f),
  5. m_vRotation._v[1], osg::Vec3(0.0f, 1.0f, 0.0f),
  6. m_vRotation._v[2], osg::Vec3(0.0f, 0.0f, 1.0f));
  7. return mat*osg::Matrixd::translate(m_vPosition);
  8. }

  9. osg::Matrixd CSouth::getInverseMatrix(void) const
  10. {
  11. osg::Matrixd mat;
  12. mat.makeRotate(m_vRotation._v[0], osg::Vec3(1.0f, 0.0f, 0.0f),
  13. m_vRotation._v[1], osg::Vec3(0.0f, 1.0f, 0.0f),
  14. m_vRotation._v[2], osg::Vec3(0.0f, 0.0f, 1.0f));
  15. return osg::Matrixd::inverse(mat*osg::Matrixd::translate(m_vPosition));
  16. }

  17. bool CSouth::handle(const osgGA::GUIEventAdapter&ea,osgGA::GUIActionAdapter&us)
  18. {
  19. float mouseX = ea.getX();
  20. float mouseY = ea.getY();
  21. switch(ea.getEventType())
  22. {
  23. case(osgGA::GUIEventAdapter::KEYDOWN):
  24. {
  25. if (ea.getKey()==0x20)
  26. {
  27. us.requestRedraw();
  28. us.requestContinuousUpdate(false);
  29. return true;
  30. }
  31. if (ea.getKey()==0xFF50)
  32. {
  33. ChangePosition(osg::Vec3(0,0,m_fMoveSpeed));
  34. return true;
  35. }
  36. if (ea.getKey()==0x2D)
  37. {
  38. m_fMoveSpeed-=1.0f;
  39. if (m_fMoveSpeed<1.0f)
  40. {
  41. m_fMoveSpeed = 1.0f;
  42. }
  43. return true;
  44. }
  45. if (ea.getKey()==0xFF52||ea.getKey()==0x57||ea.getKey()==0x77)
  46. {
  47. ChangePosition(osg::Vec3(0,m_fMoveSpeed*sinf(osg::PI_2+m_vRotation._v[2]),0));
  48. ChangePosition(osg::Vec3(m_fMoveSpeed*cosf(osg::PI_2+m_vRotation._v[2]),0,0));
  49. return true;
  50. }
  51. if (ea.getKey()==0x41||ea.getKey()==0x61)
  52. {
  53. ChangePosition(osg::Vec3(0,m_fMoveSpeed*cosf(osg::PI_2+m_vRotation._v[2]),0));
  54. ChangePosition(osg::Vec3(-m_fMoveSpeed*sinf(osg::PI_2+m_vRotation._v[2]),0,0));
  55. return true;
  56. }
  57. if (ea.getKey()==0x44||ea.getKey()==0x64)
  58. {
  59. ChangePosition(osg::Vec3(0,-m_fMoveSpeed*cosf(osg::PI_2+m_vRotation._v[2]),0));
  60. ChangePosition(osg::Vec3(m_fMoveSpeed*sinf(osg::PI_2+m_vRotation._v[2]),0,0));
  61. return true;
  62. }
  63. if (ea.getKey()==0xFF53)
  64. {
  65. m_vRotation._v[2]-=osg::DegreesToRadians(m_fAngle);
  66. }
  67. if (ea.getKey()==0xFF51)
  68. {
  69. m_vRotation._v[2]+=osg::DegreesToRadians(m_fAngle);
  70. }
  71. if (ea.getKey()==0x46||ea.getKey()==0x66)
  72. {
  73. computeHomePosition();
  74. m_fAngle-=0.2;
  75. return true;
  76. }
  77. if (ea.getKey()==0x47||ea.getKey()==0x67)
  78. {
  79. m_fAngle+=0.2;
  80. return true;
  81. }
  82. return false;
  83. }
  84. case(osgGA::GUIEventAdapter::PUSH):
  85. if (ea.getButton()==1)
  86. {
  87. m_fpushX=mouseX;
  88. m_fpushY=mouseY;
  89. m_bLeftButtonDown=true;
  90. }
  91. return false;
  92. case(osgGA::GUIEventAdapter::DRAG):
  93. if (m_bLeftButtonDown)
  94. {
  95. m_vRotation._v[2]-=osg::DegreesToRadians(m_fAngle*(mouseX-m_fpushX));
  96. m_vRotation._v[0] += osg::DegreesToRadians(1.1*(mouseY-m_fpushY));
  97. if (m_vRotation._v [0] >= 3.14) m_vRotation._v [0] = 3.14;
  98. if (m_vRotation._v [0] <= 0) m_vRotation._v [0] = 0;
  99. }
  100. return false;
  101. case (osgGA::GUIEventAdapter::RELEASE):
  102. if (ea.getButton()==1)
  103. {
  104. m_bLeftButtonDown = false;
  105. }
  106. return false ;
  107. default:
  108. return false;
  109. }
  110. }

  111. void CSouth::ChangePosition(osg::Vec3&delta)
  112. {
  113. if (m_bPeng)
  114. {
  115. osg::Vec3 newPos = m_vPosition + delta;
  116. osgUtil::IntersectVisitor iv;
  117. osg::ref_ptr<osg::LineSegment> line = new osg::LineSegment(newPos,m_vPosition);
  118. osg::ref_ptr<osg::LineSegment> lineZ = new osg::LineSegment(newPos+osg::Vec3(0.0f,0.0f,m_fMoveSpeed),
  119. newPos-osg::Vec3(0.0f, 0.0f,m_fMoveSpeed));
  120. iv.addLineSegment(lineZ.get());
  121. iv.addLineSegment (line.get());
  122. m_node ->accept(iv);
  123. if (!iv.hits())
  124. {
  125. m_vPosition += delta;
  126. }
  127. }
  128. else
  129. m_vPosition += delta;
  130. }

  131. float CSouth::getSpeed()
  132. {
  133. return m_fMoveSpeed;
  134. }
  135. void CSouth::setSpeed(float sp)
  136. {
  137. m_fMoveSpeed = sp;
  138. }
  139. void CSouth::SetPosition(osg::Vec3 &position)
  140. {
  141. m_vPosition = position ;
  142. }
  143. void CSouth::SetPosition(double* position)
  144. {
  145. m_vPosition._v[0] = position[0];
  146. m_vPosition._v[1] = position[1];
  147. m_vPosition._v[2] = position[2];
  148. }
  149. osg::Vec3 CSouth::GetPosition()
  150. {
  151. return m_vPosition;
  152. }
  153. void CSouth::setNode(osg::Node*node)
  154. {
  155. m_node = node;
  156. }

  157. void CSouth::computeHomePosition()
  158. {
  159. if(m_node.get())
  160. {
  161. const osg::BoundingSphere& boundingSphere=m_node->getBound();
  162. osg::Vec3 bp = boundingSphere._center; SetPosition(bp);
  163. }
  164. }
  165. void CSouth::setPeng(bool peng)
  166. {
  167. m_bPeng = peng;
  168. }
  169. bool CSouth::getPeng()
  170. {
  171. return m_bPeng;
  172. }
  173. void CSouth::setFpeng()
  174. {
  175. m_bPeng = !m_bPeng;
  176. }


  177. void main()
  178. {
  179. osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();
  180. viewer->setSceneData(osgDB::readNodeFile("ceep.ive"));
  181. viewer->setCameraManipulator(new CSouth());
  182. viewer->realize();
  183. viewer->run();
  184. }
复制代码

该用户从未签到

发表于 2011-9-5 08:47:56 | 显示全部楼层
给出运行堆栈的信息,给出工程配置中的依赖库信息

该用户从未签到

 楼主| 发表于 2011-9-14 10:26:38 | 显示全部楼层
回复 12# array

            viewer->run();
00413F95 8D 4D E8             lea         ecx,[ebp-18h]  
00413F98 E8 D2 D4 FF FF       call        

osg::ref_ptr<osgViewer::Viewer>:perator-> (41146Fh)  
00413F9D 89 85 BC FE FF FF    mov         dword ptr [ebp-144h],eax  
00413FA3 8B 85 BC FE FF FF    mov         eax,dword ptr [ebp-144h]  
00413FA9 8B 10                mov         edx,dword ptr [eax]  
00413FAB 8B F4                mov         esi,esp  
00413FAD 8B 8D BC FE FF FF    mov         ecx,dword ptr [ebp-144h]  
00413FB3 8B 42 2C             mov         eax,dword ptr [edx+2Ch]  
00413FB6 FF D0                call        eax  
->(错误)00413FB8 3B F4                cmp         esi,esp  
00413FBA E8 6F D4 FF FF       call        @ILT+1065(__RTC_CheckEsp) (41142Eh)  
    }

        osg80-osgGAd.dll!012241bc()         
        [Frames below may be incorrect and/or missing, no symbols loaded for

osg80-osgGAd.dll]        
        osg80-osgViewerd.dll!01107f2d()         
        osg80-osgViewerd.dll!0110f9fe()         
        osg80-osgViewerd.dll!0110f87b()         
        osg80-osgViewerd.dll!01104559()         
        osg80-osgViewerd.dll!01169c8a()         
->(错误)        Wander.exe!main()  Line 254 + 0x23 bytes        C++
        Wander.exe!__tmainCRTStartup()  Line 555 + 0x19 bytes        C
        Wander.exe!mainCRTStartup()  Line 371        C
        kernel32.dll!7d4e7d2a()         

/OUT:"F:\osg\Code\Wander\Debug\Wander.exe" /INCREMENTAL /NOLOGO "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" /MANIFEST /ManifestFile:"Debug\Wander.exe.intermediate.manifest" /ALLOWISOLATION /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /PDB:"F:\osg\Code\Wander\Debug\Wander.pdb" /SUBSYSTEM:CONSOLE /PGD:"F:\osg\Code\Wander\Debug\Wander.pgd" /TLBID:1 /DYNAMICBASE /NXCOMPAT /MACHINE:X86 /ERRORREPORTUEUE
   
您说的是这个吗

该用户从未签到

发表于 2011-9-14 10:47:14 | 显示全部楼层
好像以前出现过类似的错误,我是通过把 osg 和自己的程序都用 Debug 编译解决的。 Release 的 osg 编译版本在 vs 里面不能调试运行?

该用户从未签到

 楼主| 发表于 2011-9-14 15:15:37 | 显示全部楼层
回复 4# garyliyong

    但是二进制文件仍然是原来的版本吧 这个没什么用处吧

该用户从未签到

发表于 2011-9-15 09:01:13 | 显示全部楼层
您在发什么?我看不到错误定位在您的代码的什么位置,又如何判断您的代码出了什么问题??

该用户从未签到

 楼主| 发表于 2011-9-15 09:32:53 | 显示全部楼层
回复 16# array


   是呀 我也没找到 生成的.map都是乱码 不知道是怎么回事
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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