|
最近一直在做一个虚拟装配的系统,原来是做windows底层,第一次弄图形的感觉压力山大。不过在看了许多代码后,利用osgbullet把我从solidworks导出的模型成功显示出来,并检测到了碰撞。
然后,我打算加上dragger,在看了 magicstone&simbaforrest 写的dragger分析后,我打算从selection类继承出一个自己的类,并在里面存放bullet的btCollisionObject指针,用于拖拽的时候实时更新bullet世界的模型坐标。但是,在实际看到osg3.0.0的代码后,发现这个结构已经改变了,所以,我从dragger和DraggerTransformCallback分别继承出一个类来,并增加了新的变量指针指向btCollisionObject。
但是,我虽然是这么想的,但是结果使用的时候总是出现错误,编译是通过的,但是执行的时候总是发生错误被中断
下面是我的那两个类
class OBDraggerTransformCallback: public osgManipulator:raggerTransformCallback{
public:
基本代码都没有变,就是增加了更新bullet世界的功能。
OBDraggerTransformCallback(osg::MatrixTransform* obtransform,btCollisionObject* co):DraggerTransformCallback(obtransform){
_co=co;
}
void ChangeBulletTransform(){
osg::Matrix trans =_transform->getMatrix();
_co->setWorldTransform(osgbCollision::asBtTransform( trans ) );
}
virtual bool receive(const osgManipulator::MotionCommand& command){
if (!_transform) return false;
switch (command.getStage())
{
case osgManipulator::MotionCommand::START:
{
// Save the current matrix
_startMotionMatrix = _transform->getMatrix();
// Get the LocalToWorld and WorldToLocal matrix for this node.
osg::NodePath nodePathToRoot;
osgManipulator::computeNodePathToRoot(*_transform,nodePathToRoot);
_localToWorld = osg::computeLocalToWorld(nodePathToRoot);
_worldToLocal = osg::Matrix::inverse(_localToWorld);
return true;
}
case osgManipulator::MotionCommand::MOVE:
{
// Transform the command's motion matrix into local motion matrix.
osg::Matrix localMotionMatrix = _localToWorld * command.getWorldToLocal()
* command.getMotionMatrix()
* command.getLocalToWorld() * _worldToLocal;
// Transform by the localMotionMatrix
_transform->setMatrix(localMotionMatrix * _startMotionMatrix);
ChangeBulletTransform();
return true;
}
case osgManipulator::MotionCommand::FINISH:
{
return true;
}
case osgManipulator::MotionCommand::NONE:
default:
return false;
}
}
protected:
btCollisionObject* _co;
osg::MatrixTransform* _mt;
};
class OBTranslateAxisDragger : public osgManipulator::TranslateAxisDragger{
public:
OBTranslateAxisDragger(){}
virtual ~OBTranslateAxisDragger(){}
void addTransformUpdating(osg::MatrixTransform* transform)
{
addDraggerCallback(new OBDraggerTransformCallback(transform,_co));
}
void setbtCollisionObject(btCollisionObject *co){_co=co;}
btCollisionObject* getbtCollisionObject(){return _co;}
protected:
btCollisionObject* _co;
};
我这样的方法是正确的吗?这么使用是可行的吗? |
|