如图所示,需要求蓝色的垂直扇面与橙红色的水平扇面(五层中的中间一层)的交线。
垂直扇面与水平扇面都是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();
return ncv->giveUpDaMat();
class getWorldCoordOfNodeVisitor : public osg::NodeVisitor
getWorldCoordOfNodeVisitor():
osg::NodeVisitor(NodeVisitor::TRAVERSE_PARENTS), done(false)
wcMatrix= new osg::Matrixd();
virtual void apply(osg::Node &node)
if ( 0 == node.getNumParents() ) //到达根节点,此时节点路径也已记录完整
wcMatrix->set( osg::computeLocalToWorld(this->getNodePath()) );
osg::Matrixd* giveUpDaMat()
[ 本帖最后由 口口广大 于 2009-3-25 23:01 编辑 ] |