本帖最后由 gavinyu 于 2009-12-22 16:48 编辑
看到一些人想用C#进行osg的开发,想说下自己在用osgDotNet时碰到的一些问题和经验,希望能对用到的人有些帮助。
首先是osgDotNet有很多接口没有输出,需要手动添加。
1、普通接口函数添加:
osgDotNet不支持标准模板库的各种类型的自动转换,所以如果需要用到某个接口,参数类型或返回类型是标准模板库,需要自己手动添加。
下面以 Node 的 getParentalNodePaths 方法为例,说一下添加的方式。
C++ 中 Node 的 getParentalNodePaths 原型:
NodePathList Node::getParentalNodePaths(osg::Node* haltTraversalAtNode)const
NodePathList的定义:
typedef std::vector< Node*> NodePath; typedef std::vector< NodePath> NodePathList;
在osgDotNet自动生成的代码中,这个函数没有输出: /* unsupported methodgetParentalNodePaths */
我们可以在 Node.h 中按如下方式添加:
typedef System::Collections::Generic::IList< Node^ > NodePath;
typedef System::Collections::Generic::IList<NodePath ^ > NodePathList;
public refclass Node :Osg::Object {
…
/* unsupportedmethod getParentalNodePaths */
NodePathList ^ getParentalNodePaths(Osg::Node ^ haltTraversalAtNode); };
实现代码:
NodePathList ^ Node::getParentalNodePaths(Osg::Node ^ haltTraversalAtNode)
{ osg::NodePathListnpl;
npl = ___vtnp(this)->getParentalNodePaths(___vtnp(haltTraversalAtNode));
typedef System::Collections::Generic::List< Osg::Node ^ > TNList;
typedef System::Collections::Generic::List< Osg::NodePath ^ > TNPList;
Osg::NodePathList^ nodePathList = gcnewTNPList(); for(unsigned int i=0;i<npl.size();++i)
{
osg:: NodePath&np = npl[i];
Osg::NodePath^ nodePath = gcnewTNList();
for(unsigned int j=0;j<np.size();++j)
{ Osg::Node^ n = gcnew Osg::Node(np[j], false);
nodePath->Add(n);
}
nodePathList->Add(nodePath);
}
return nodePathList; }
2、添加回调处理:
我们经常需要根据不同的需求对节点设置更新、拣选等回调处理, osg::NodeCallback类有个非常关键的操作 operator() ,其原型如下:
virtual void operator()(Node* node, NodeVisitor* nv)
{
// note, callback is responsible for scenegraphtraversal so
// they must call traverse(node,nv) to ensure that the
// scene graph subtree (and associated callbacks) aretraversed.
traverse(node,nv);
}
但是osgDotNet自动生成的代码中,对应的托管类 ___NodeCallback_adapter 没有重载 operator(),因而不支持在C#类中的回调处理。可以按如下方式添加:
public ref classNodeCallback : Osg::Object
{
//添加虚函数
virtual void operator()(Osg::Node ^ node, Osg::NodeVisitor^ nv){}
};
class ___NodeCallback_adapter: public osg::NodeCallback
{
//重载
virtual void operator()(osg::Node * node, osg::NodeVisitor* nv);
};
实现代码:
void ___NodeCallback_adapter::operator()(osg::Node * node, osg::NodeVisitor * nv) {
___mh()->operator()( ___WS::VTableTypeWrapperFactory::getWrapper(node),___WS::VTableTypeWrapperFactory::getWrapper(nv)); }
在对应的C#类会生成新的接口Osg.NodeCallback.op_FunctionCall(Osg.Node, Osg.NodeVisitor),从而可以写自己的类重载此方法进行相应处理:
public class myNodeCallBack: Osg.NodeCallback
{
public overridevoid op_FunctionCall(Osg.Node node, Osg.NodeVisitor nv) {
//处理…
}
}
对回调的使用设置与C++中类似。
|