解决方案 »

  1.   

    对不起,应该是下面的代码有问题。问题很奇怪,有时候能运行,但关掉程序后,在启动就不行了。错误提示还是上面那个。
    void osgUserLine::createLine()
    {
    // Delete line object of geode.
    int nChildern = getNumChildren();
    for( int i = 0; i < nChildern; i ++ )
    {
    osg::ref_ptr<osg::Geode> geode = dynamic_cast<osg::Geode*>(getChild( i ));
    if( geode.valid() )
    {
    removeChild( geode.get() );
    //i --;
    nChildern = getNumChildren();
    }
    } osg::ref_ptr<osg::Vec3Array> vec = new osg::Vec3Array(); int nC = getNumChildren();
    for( int i = 0; i < nC; i ++ )
    {
    osg::ref_ptr<osgUserPoint> point = dynamic_cast<osgUserPoint*>( getChild( i ) );
    if( point.valid() )
    {
    osg::Matrix pm = point->getMatrix();
    vec->push_back( pm.getTrans() );
    }
    }

    int nVec = vec->size();
    if( nVec < 2 )
    return; osg::ref_ptr<osg::Vec4Array> colors = new osg::Vec4Array();
        colors->push_back( m_color ); // osg::Vec4 (1.0f, 1.0f, 1.0f, 1.0f) // Create a new line.
    osg::ref_ptr<osg::Geode>  geode = new osg::Geode(); // If m_nState == 1, create as bezier curve.
    if( m_nState == 1 )
    {
    osg::ref_ptr<osg::Vec3Array> vecBezier = new osg::Vec3Array(); osg::ref_ptr<osg::Vec3Array> vecD = new osg::Vec3Array();
    osgGMSMath::getBezieLineCtrlPointsFromPoints( vec.get(), vecD.get() );
    nVec = vecD->size(); osg::ref_ptr<osg::Vec3Array> vecSeg    = new osg::Vec3Array();
    for( int i = 0; i < nVec - 3; i += 3 )
    {
    vecSeg->push_back( (*vecD)[i] );
    vecSeg->push_back( (*vecD)[i+1] );
    vecSeg->push_back( (*vecD)[i+2] );
    vecSeg->push_back( (*vecD)[i+3] ); osgGMSMath::makeBezier4( vecSeg, 20 ); int nSeg = vecSeg->size();
    for( int j = 0; j < nSeg - 1; j ++ )
    {
    vecBezier->push_back( (*vecSeg)[j] );
    }
    vecSeg->clear();
    } vecBezier->push_back( (*vecD)[nVec - 1] );
    vecD->clear();
    vec->clear(); int nBezier = vecBezier->size();

    osg::ref_ptr<osg::Geometry>  geomy = new osg::Geometry();
    geomy->setVertexArray( vecBezier.get() );
    geode->addDrawable( geomy.get() ); geomy->setColorArray (colors.get()); geomy->setColorBinding (osg::Geometry::BIND_OVERALL);
    geomy->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::LINE_STRIP, 0, nBezier));
    }
    else
    {
    osg::ref_ptr<osg::Geometry>  geomy = new osg::Geometry();
    geomy->setVertexArray( vec.get() );
    geode->addDrawable( geomy.get() ); geomy->setColorArray (colors.get()); geomy->setColorBinding (osg::Geometry::BIND_OVERALL);
    geomy->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::LINE_STRIP, 0, nVec));
    } addChild( geode.get() );
    }
      

  2.   


    不知道是什么原因,有时能通过,有时就异常,很想不明白。我并没有哪里使用const类型的数组啊!
      

  3.   

    多线程吗?
    能重现的BUG就是好BUG
      

  4.   

    不是多线程,这个bug大约运行一两次会出现,有人说是由于增长了const类型的vector变量,我查了一下,我没有增长const类型vector变量。
      

  5.   

    我程序中有下面几行代码(pD->m_arrArrayDoubleX是CArray型数组):
    osg::ref_ptr<osg::Vec3Array> vec = new osg::Vec3Array;
    for( int i = 0; i < nD; i ++ )
    {
    osg::Vec3 v3(pD->m_arrArrayDoubleX[i], pD->m_arrArrayDoubleY[i], pD->m_arrArrayDoubleZ[i]);
    vec->push_back( v3 );
    }
    如果注释掉就不会有这个问题,但什么也画不出来了。而且这种使用方式是非常正常的啊!