查看: 2248|回复: 2

关于两个扇面(osgSim::SphereSegment)求交线的问题

[复制链接]

该用户从未签到

发表于 2009-3-25 22:51:45 | 显示全部楼层 |阅读模式
如图所示,需要求蓝色的垂直扇面与橙红色的水平扇面(五层中的中间一层)的交线。


垂直扇面与水平扇面都是osgSim::SphereSegment对象,求交函数如下,参考了osgSphereSegment例子,结果发现取出的结果为空。

//rss代表水平扇面,CentreSegment代表垂直扇面
void CRadar::computeSphereSegmentCentreLine(struct RadarSphereSegment rss)
{
   osgSim::SphereSegment:ineList lines ;
   osg::Matrixd possie ;

//用rss的世界坐标*CentreSegment的局部坐标
   possie = (*getWorldCoords(rss.SphereSegment))*(*getLocalCoords(CentreSegment.SphereSegment));
   lines = CentreSegment.SphereSegment->computeIntersection( possie,rss.SphereSegment);

}

getWorldCoords函数用来取某节点的世界坐标矩阵,getLocalCoords函数用来取某节点的局部坐标矩阵

osg::Matrixd* getWorldCoords( osg::Node* node)

{

getWorldCoordOfNodeVisitor* ncv = new getWorldCoordOfNodeVisitor();

if (node && ncv)

{

node->accept(*ncv);

return ncv->giveUpDaMat();

}

else

{

return NULL;

}

}
class getWorldCoordOfNodeVisitor : public osg::NodeVisitor

{

public:

getWorldCoordOfNodeVisitor():

osg::NodeVisitor(NodeVisitor::TRAVERSE_PARENTS), done(false)

{

wcMatrix= new osg::Matrixd();

}


virtual void apply(osg::Node &node)

{

if (!done)

{

if ( 0 == node.getNumParents() ) //
到达根节点,此时节点路径也已记录完整

{

wcMatrix->set( osg::computeLocalToWorld(this->getNodePath()) );

done = true;

}

traverse(node);

}

}

osg::Matrixd* giveUpDaMat()

{

return wcMatrix;

}

private:

bool done;

osg::Matrix* wcMatrix;

};


[ 本帖最后由 口口广大 于 2009-3-25 23:01 编辑 ]
新建 BMP 图像 (5).JPG

该用户从未签到

发表于 2009-3-25 22:53:58 | 显示全部楼层
这应当说是一个数学问题吧,我想osg不会为您提供现成的解决方案;也许自行实现相关的算法或者直接使用外部的数学辅助库都是一个不错的选择

该用户从未签到

 楼主| 发表于 2009-3-25 23:05:44 | 显示全部楼层
但是osg::sim::SphereSegment有computeIntersection函数,接受的参数是一个位置矩阵和一个欲相交的node,位置矩阵代表了源node到目标node的矩正变换,返回的是交线集合,如上图因该有两条交线,osgSphereSegment例子是这样用的。请array老大帮我研究下这段简短的例子。

[ 本帖最后由 口口广大 于 2009-3-25 23:08 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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