查看: 4350|回复: 6

osg与Physx结合的问题

[复制链接]

该用户从未签到

发表于 2008-7-3 18:08:23 | 显示全部楼层 |阅读模式
我想实现一个简单的小方块在重力作用下,掉下来的过程,但在OSG和Physx的结合中碰到了问题,编译没有问题,链接有问题,一到回调函数中physx代码,就提示说gSence错误,不知道是什么原因
  1. #define NOMINMAX
  2. #include <osg/ref_ptr>
  3. #include <osg/Group>
  4. #include <osgViewer/Viewer>
  5. #include <osgDB/ReadFile>
  6. #include <osg/MatrixTransform>
  7. #include <osg/NodeCallback>
  8. #include <osg/Camera>
  9. #include <osgGA/TrackballManipulator>
  10. #include <osg/PositionAttitudeTransform>
  11. #include <osg/ShapeDrawable>
  12. #include <iostream>
  13. #include <windows.h>
  14. #include <GL/gl.h>
  15. #include <GL/glut.h>

  16. //physx
  17. #include "NxPhysics.h"

  18. //physx
  19. static NxPhysicsSDK  *gPhysicsSDK=NULL;
  20. static NxScene       *gScene=NULL;
  21. static NxVec3        gDefaultGravity(0.0f,-9.8f,0.0f);
  22. static bool InitNx()
  23. {
  24. //初始化 PhysicsSDK
  25. gPhysicsSDK=NxCreatePhysicsSDK(NX_PHYSICS_SDK_VERSION,0,NULL);
  26. if(!gPhysicsSDK)
  27.   return false;
  28. gPhysicsSDK->setParameter(NX_SKIN_WIDTH,0.05f);

  29. //创建一场景
  30. NxSceneDesc sceneDesc;
  31. sceneDesc.gravity=gDefaultGravity;
  32. gScene=gPhysicsSDK->createScene(sceneDesc);
  33. NxMaterial *defaultMaterial=gScene->getMaterialFromIndex(0);
  34. defaultMaterial->setRestitution(0.9f);
  35. defaultMaterial->setStaticFriction(0.1f);
  36. defaultMaterial->setDynamicFriction(0.1f);

  37. //创建一个刚体
  38. int size=5;
  39. int radius=3;
  40. NxBodyDesc BodyDesc;
  41. BodyDesc.angularDamping=0.5f;
  42. BodyDesc.linearVelocity=NxVec3(2.0f,0.0f,0.0f);
  43. //创建一个方块
  44. NxBoxShapeDesc BoxDesc;
  45. BoxDesc.dimensions=NxVec3(float(size),float(size),float(size));
  46. NxActorDesc BoxActorDesc;
  47. BoxActorDesc.shapes.pushBack(&BoxDesc);
  48. BoxActorDesc.body=&BodyDesc;
  49. BoxActorDesc.density=0.1f;
  50. BoxActorDesc.globalPose.t=NxVec3(10.0,20.0,0.0);
  51. gScene->createActor(BoxActorDesc)->userData = (void*)size;
  52. }
  53. class Movemtbox : public osg::NodeCallback
  54. {
  55. public:
  56.   
  57.     virtual void operator()( osg::Node* node,osg::NodeVisitor* nv )
  58.     {
  59.         
  60.    osg::MatrixTransform* mtBox =dynamic_cast<osg::MatrixTransform*>( node );
  61.      gScene->fetchResults(NX_RIGID_BODY_FINISHED);
  62.         gScene->simulate(1/420.0f);//一帧多少时间
  63.         gScene->flushStream();
  64. //在下面这一行出错,总提示gScene读取内存位置时发生错误,百思不得其解
  65.   int nbActors = gScene->getNbActors();//得到场景中角色的数量
  66.         NxActor** actors = gScene->getActors();//得到场景中所有角色的队列
  67.         NxActor* actor = *actors++;
  68.         float glmat[16];      
  69.         actor->getGlobalPose().getColumnMajor44(glmat);//得到角色的世界位置,并转化到glmat中,是3*3矩阵
  70.         
  71.   osg::Matrix mat;
  72.   mat.set(glmat[0],glmat[1],glmat[2],glmat[3],glmat[4],glmat[5],glmat[6],glmat[7],glmat[8],glmat[9],glmat[10],glmat[11],glmat[12],glmat[13],glmat[14],glmat[15]);
  73.   mtBox->setMatrix(mat);
  74.   traverse(node,nv);
  75.     }

  76. protected:
  77.    

  78. };
  79. osg::ref_ptr<osg::Node> createScene()
  80. {
  81.     osg::Group* root = new osg::Group();


  82.   osg::Box* unitCube = new osg::Box( osg::Vec3(0,0,0), 1.0f);
  83.   osg::ShapeDrawable* unitCubeDrawable = new osg::ShapeDrawable(unitCube);
  84.   osg::Geode* basicShapesGeode = new osg::Geode();
  85.   basicShapesGeode->addDrawable(unitCubeDrawable);
  86.         osg::ref_ptr<osg::MatrixTransform> mtBox =new osg::MatrixTransform;
  87.         mtBox->setDataVariance( osg::Object::DYNAMIC );
  88.         mtBox->setUpdateCallback( new Movemtbox );
  89.         mtBox->addChild( basicShapesGeode );

  90.         root->addChild(mtBox.get());
  91.     return root;
  92. }


  93. int main(int argc, char** argv)
  94. {
  95.    
  96. //physx
  97. InitNx();
  98.    
  99. //osg
  100. osgViewer::Viewer viewer;
  101.     viewer.setSceneData( createScene().get() );
  102.     if (!viewer.getSceneData())
  103.         return 1;
  104.     viewer.getCamera()->setClearColor(osg::Vec4( 0.3, 0.4, 0.5, 1. ) );
  105.   
  106.   
  107. if(gPhysicsSDK && gScene)
  108. {
  109.   gPhysicsSDK->releaseScene(*gScene);
  110. }
  111. gPhysicsSDK->release();

  112. return viewer.run();

  113. }
复制代码

该用户从未签到

发表于 2008-7-4 08:55:36 | 显示全部楼层
我也想作这方面的工作,不过是新手啊

该用户从未签到

发表于 2008-7-4 09:07:56 | 显示全部楼层
没用过PhysX。不过按经验来说,如果确定是gScene->getNbActors()出了问题,而且gScene不是野指针(你的代码中应该已经证明了这一点)的话,不妨追踪一下这个函数的源代码吧

该用户从未签到

发表于 2008-8-1 11:49:20 | 显示全部楼层
运行了,出现下列错误:

正在链接...
physx osg.obj : error LNK2019: 无法解析的外部符号 __imp__NxCreatePhysicsSDK,该符号在函数 "bool __cdecl InitNx(void)" (?InitNx@@YA_NXZ) 中被引用
C:\Documents and Settings\monkey\桌面\physx osg\Debug\physx osg.exe : fatal error LNK1120: 1 个无法解析的外部命令
生成日志保存在“file://c:\Documents and Settings\monkey\桌面\physx osg\physx osg\Debug\BuildLog.htm”
physx osg - 2 个错误,2 个警告
========== 生成: 0 已成功, 1 已失败, 0 最新, 0 已跳过 ==========

该用户从未签到

发表于 2008-8-1 13:18:24 | 显示全部楼层
原帖由 znmonkey 于 2008-8-1 11:49 发表
运行了,出现下列错误:

正在链接...
physx osg.obj : error LNK2019: 无法解析的外部符号 __imp__NxCreatePhysicsSDK,该符号在函数 "bool __cdecl InitNx(void)" (?InitNx@@YA_NXZ) 中被引用
C:\Documents an ...


缺少PhyX的某个链接库,请检查一下依赖库的设置

该用户从未签到

 楼主| 发表于 2008-8-2 20:35:10 | 显示全部楼层
在依赖项里要加入几个LIB。刚开始也碰到过这个问题

该用户从未签到

发表于 2008-9-12 12:05:41 | 显示全部楼层
呵呵,我原来为了这个问题搞了一上午。后来在一个DirectX的例子里找到一样的解决办法。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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