查看: 7197|回复: 15

OSG+physX开源物理引擎

[复制链接]

该用户从未签到

发表于 2008-12-17 23:02:01 | 显示全部楼层 |阅读模式
OSG + nVIDIA physX 是我的 osgNV 工程计划中的一部分。physX引擎利用nVIDIA显卡的强劲力量,具现了三维环境下刚体、柔体、织物、角色的真实物理碰撞与运动效果,是目前国外大型游戏开发的首选物理引擎之一。

osgNV工程(http://osgnv.sourceforge.net/)由我接手以后,除了针对最新的Cg语言增加了Geometry着色器,Texture参数,Buffer参数的支持,以及增加了四个Cg语言例子之外,目前也已经开展对OSG与physX物理引擎的接口的研究,并已初具成果。目前osgNVPhysx库已经追加到最新的osgNV-SVN版本当中,并计划于本周放出osgNV 0.6.2,其中包含刚体物理仿真的支持,以及一个相关的例子(见附图)。

希望大家能够关注和支持osgNVPhysx的进展,有兴趣的朋友欢迎参与SVN版本的测试与反馈;并十分希望有余力和有独到想法的开发者加入到开发团队中来。据我所知这可能是第一个针对OSG开发的开源物理引擎接口API,它使用Builder设计模式以及虚基类继承的架构,计划在将来实现多种物理引擎与OSG的接合。

SVN下载方式:
svn co https://osgnv.svn.sourceforge.net/svnroot/osgnv osgnv

给自己宣传一下,嗯,就这样~~还有使用ATI显卡的朋友们请止步,osgNV的主要功能都不能在ATI图形环境下运行 :)
osgnvphysxboxes.JPG

该用户从未签到

发表于 2008-12-17 23:48:16 | 显示全部楼层
关注一下~
之前听说nvidia向业界(主要是ati)开放cuda等技术,不知道现在进行的怎样了。真希望有一天ati和nvidia(最好加上opengl和微软d3d)能够达成某种程度的一致,目前各自为政标准扩展一大堆写程序太麻烦了。

该用户从未签到

发表于 2008-12-18 00:07:43 | 显示全部楼层
哈哈哈,,支持~~~~~~~

该用户从未签到

发表于 2010-9-5 14:49:58 | 显示全部楼层
请教:PhysX中 到底哪一部分代码表达的是碰撞就停止呀 我自己看了好长时间还是没弄清楚

void NxVehicle::handleContactPair(NxContactPair& pair, NxU32 carIndex)
{
        NxContactStreamIterator i(pair.stream);
       
        while(i.goNextPair())
        {
                NxShape * s = i.getShape(carIndex);
               
                while(i.goNextPatch())
                {
                        const NxVec3& contactNormal = i.getPatchNormal();
                       
                        while(i.goNextPoint())
                        {
                                //user can also call getPoint() and getSeparation() here
       
                                const NxVec3& contactPoint = i.getPoint();

                                //add forces:

                                //assuming front wheel drive we need to apply a force at the wheels.
                                if (s->is(NX_SHAPE_CAPSULE) && s->userData != NULL) {
                                        //assuming only the wheels of the car are capsules, otherwise we need more checks.
                                        //this branch can't be pulled out of loops because we have to do a full iteration through the stream
                               
                                        NxQuat local2global = s->getActor().getGlobalOrientationQuat();
                                        NxWheel* w = (NxWheel*)s->userData;
                                        if (!w->getWheelFlag(NX_WF_USE_WHEELSHAPE))
                                                {
                                                NxWheel1 * wheel = static_cast<NxWheel1*>(w);
                                                wheel->contactInfo.otherActor = pair.actors[1-carIndex];
                                                wheel->contactInfo.contactPosition = contactPoint;
                                               
                                                wheel->contactInfo.contactPositionLocal = contactPoint;
                                                wheel->contactInfo.contactPositionLocal -= _bodyActor->getGlobalPosition();
                                                local2global.inverseRotate(wheel->contactInfo.contactPositionLocal);
                                               
                                                wheel->contactInfo.contactNormal = contactNormal;
                                                if (wheel->contactInfo.otherActor->isDynamic())
                                                        {
                                                        NxVec3 globalV = s->getActor().getLocalPointVelocity(wheel->getWheelPos());
                                                        globalV -= wheel->contactInfo.otherActor->getLinearVelocity();
                                                        local2global.inverseRotate(globalV);
                                                        wheel->contactInfo.relativeVelocity = globalV.x;
                                                        //printf("%2.3f (%2.3f %2.3f %2.3f)\n", wheel->contactInfo.relativeVelocity,
                                                        //        globalV.x, globalV.y, globalV.z);
                                                        }
                                                else
                                                        {
                                                        NxVec3 vel = s->getActor().getLocalPointVelocity(wheel->getWheelPos());
                                                        local2global.inverseRotate(vel);
                                                        wheel->contactInfo.relativeVelocity = vel.x;
                                                        wheel->contactInfo.relativeVelocitySide = vel.z;
                                                        }
                                                NX_ASSERT(wheel->hasGroundContact());
                                                //printf(" Wheel %x is touching\n", wheel);
                                                }
                                }
                        }
                }               
        }
        //printf("----\n");
}

该用户从未签到

发表于 2010-9-5 14:51:59 | 显示全部楼层
期待高人的指导!!!!

该用户从未签到

发表于 2010-9-5 15:50:17 | 显示全部楼层
NxVec3 globalV = s->getActor().getLocalPointVelocity(wheel->getWheelPos());
                                                        globalV -= wheel->contactInfo.otherActor->getLinearVelocity();
                                                        local2global.inverseRotate(globalV);
                                                        wheel->contactInfo.relativeVelocity = globalV.x;

该用户从未签到

发表于 2010-9-5 15:50:49 | 显示全部楼层
好像是通过相对速度来控制车轮的吧

该用户从未签到

发表于 2010-9-5 18:15:45 | 显示全部楼层
支持下阿锐哦~~这个结合貌似很多需要的

该用户从未签到

发表于 2010-9-5 18:49:42 | 显示全部楼层
我看的是physx中的例子SampleRaycastCar ,如果碰撞是由相对速度控制的话,那么代码中又是怎么体现的呢 汽车怎么就停止运动了呢

该用户从未签到

发表于 2010-9-5 18:53:15 | 显示全部楼层
支持下阿锐哦~~这个结合貌似很多需要的
tianxiao888 发表于 2010-9-5 18:15


请问是个结合有哪些需要呀 可以详细些吗

该用户从未签到

发表于 2010-9-5 19:01:29 | 显示全部楼层
[quote]好像是通过相对速度来控制车轮的吧
湖面之舟 发表于 2010-9-5 15:50 [/quote
看看那个例子的具体代码吧 physx 中的例子SampleRaycastCar 希望得到你的帮助 遇到你们很高兴!!!

该用户从未签到

 楼主| 发表于 2010-9-6 08:35:11 | 显示全部楼层
1、这个是挖坟贴……我现在已经停止osgNVPhysX的开发,并且在考虑更好的物理引擎结合方案
2、我不太明白您的问题的意思

该用户从未签到

发表于 2010-9-6 13:25:57 | 显示全部楼层
1、这个是挖坟贴……我现在已经停止osgNVPhysX的开发,并且在考虑更好的物理引擎结合方案
2、我不太明白您的问题的意思
array 发表于 2010-9-6 08:35

我的问题: PhysX中 到底哪一部分代码表示的是物体一碰撞就会停止。

该用户从未签到

发表于 2010-9-6 13:56:41 | 显示全部楼层
真的是座坟

该用户从未签到

 楼主| 发表于 2010-9-6 13:57:09 | 显示全部楼层
我已经暂时不在研究physx,这里也并非讨论它的地方。不过我想楼上的朋友已经给出了您需要的答案,通过设置wheel->contactInfo.relativeVelocity来改变相对速度,进而使得对象运动或者停止,您完全可以打印这个值来观察它的变化

该用户从未签到

发表于 2010-9-6 14:14:42 | 显示全部楼层
15# array
谢谢array及湖面之舟的解答!!我再自己看看吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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