Probleme mit Modelcode



  • Hi, ich habe mir einen Source code für einen Milkshapemodelloader heruntergeladen und 1:1 übernommen. Wenn ich jetzt jedoch das Programm nach dem erstellen der exe-Datei starte kommt folgender Fehler:
    Fatal signal: Segemantation Fault <SDL Parachute Deployed>
    Ich habe nun herausgefunden, dass der Fehler an diesem Code liegt.

    void Model::advanceAnimation() //////////////////////////////////////////////////////////
    {
        double time = m_pTimer->getTime();
    
        if ( time > m_totalTime )
        {
            if ( m_looping )
            {
                restart();
                time = 0;
            }
            else
            {
                time = m_totalTime;
            }
        }
    
        for ( int i = 0; i < m_numJoints; i++ )
        {////////////////////////bis hier alles ok
            float transVec[ 3 ];
            Matrix transform;
            int frame;
            Joint *pJoint = &m_pJoints[ i ];
    
            if ( pJoint->m_numRotationKeyframes == 0
                 && pJoint->m_numTranslationKeyframes == 0 )
            {
                pJoint->m_final.set( pJoint->m_absolute.getMatrix() );
                continue;
            }
    /////////////////////////////////////ok
            frame = pJoint->m_currentTranslationKeyframe; ///////////////////(HIER)
            while ( frame < pJoint->m_numTranslationKeyframes
                    && pJoint->m_pTranslationKeyframes[ frame ].m_time < time )
            {
                frame++;
            }
            pJoint->m_currentTranslationKeyframe = frame;
    //////////////////////////////////////////////////////////////////////
    
            if ( frame == 0 )
            {
                memcpy( transVec,
                        pJoint->m_pTranslationKeyframes[ 0 ].m_parameter,
                        sizeof ( float ) * 3 );
            }
            else
            {
                if ( frame == pJoint->m_numTranslationKeyframes )
                {
                    memcpy( transVec,
                            pJoint->m_pTranslationKeyframes[frame - 1].m_parameter,
                            sizeof ( float ) * 3 );
                }
                else
                {
                    assert( frame > 0
                            && frame < pJoint->m_numTranslationKeyframes );
    
                    const Model::Keyframe& curFrame =
                        pJoint->m_pTranslationKeyframes[ frame ];
                    const Model::Keyframe& prevFrame =
                        pJoint->m_pTranslationKeyframes[ frame - 1 ];
    
                    float timeDelta = curFrame.m_time - prevFrame.m_time;
                    float interpValue = ( float ) ((time - prevFrame.m_time)
                                                   / timeDelta);
    
                    transVec[ 0 ] = prevFrame.m_parameter[ 0 ] +
                        ( curFrame.m_parameter[ 0 ] - prevFrame.m_parameter[ 0 ] ) * interpValue;
                    transVec[ 1 ] = prevFrame.m_parameter[ 1 ] +
                        ( curFrame.m_parameter[ 1 ] - prevFrame.m_parameter[ 1 ] ) * interpValue;
                    transVec[ 2 ] = prevFrame.m_parameter[ 2 ] +
                        ( curFrame.m_parameter[ 2 ] - prevFrame.m_parameter[ 2 ] ) * interpValue;
                }
            }
    
            frame = pJoint->m_currentRotationKeyframe;
            while ( frame < pJoint->m_numRotationKeyframes
                    && pJoint->m_pRotationKeyframes[ frame ].m_time < time )
            {
                frame++;
            }
            pJoint->m_currentRotationKeyframe = frame;
    
            if ( frame == 0 )
            {
                transform.setRotationRadians( pJoint->m_pRotationKeyframes[ 0 ].m_parameter );
            }
            else
            {
                if ( frame == pJoint->m_numRotationKeyframes )
                {
                    transform.setRotationRadians( pJoint->m_pRotationKeyframes[ frame - 1 ].m_parameter );
                }
                else
                {
                //    assert( frame > 0 && frame < pJoint->m_numRotationKeyframes );/////////////////////
    
                    const Model::Keyframe& curFrame =
                        pJoint->m_pRotationKeyframes[ frame ];
                    const Model::Keyframe& prevFrame =
                        pJoint->m_pRotationKeyframes[ frame - 1 ];
    
                    float timeDelta = curFrame.m_time - prevFrame.m_time;
                    float interpValue = ( float ) ((time - prevFrame.m_time)
                                                   / timeDelta);
    
                    assert( interpValue >= 0 && interpValue <= 1 );
    
    #if 0
                    Quaternion qPrev( prevFrame.m_parameter );
                    Quaternion qCur( curFrame.m_parameter );
                    Quaternion qFinal( qPrev, qCur, interpValue );
                    transform.setRotationQuaternion( qFinal );
    #else
                    float rotVec[ 3 ];
    
                    rotVec[ 0 ] = prevFrame.m_parameter[ 0 ] + ( curFrame.m_parameter[ 0 ] - prevFrame.m_parameter[ 0 ] ) * interpValue;
                    rotVec[ 1 ] = prevFrame.m_parameter[ 1 ] + ( curFrame.m_parameter[ 1 ] - prevFrame.m_parameter[ 1 ] ) * interpValue;
                    rotVec[ 2 ] = prevFrame.m_parameter[ 2 ] + ( curFrame.m_parameter[ 2 ] - prevFrame.m_parameter[ 2 ] ) * interpValue;
    
                    transform.setRotationRadians( rotVec );
    #endif 
                }
            }
    
            transform.setTranslation( transVec );
            Matrix relativeFinal( pJoint->m_relative );
            relativeFinal.postMultiply( transform );
    
            if ( pJoint->m_parent == -1 )
                pJoint->m_final.set( relativeFinal.getMatrix() );
            else
            {
                pJoint->m_final.set( m_pJoints[ pJoint->m_parent ].m_final.getMatrix() );
                pJoint->m_final.postMultiply( relativeFinal );
            }
    
        }
    }
    

    Der Fehler hat wahrscheinlich etwas mit der makierten Stelle im Code zu tun(Ab ////(HIER) bis nächste Kommentarlinie.)Also mit der Anzahl der Frames.

    Bitte Antwortet mir!

    Gruß ##############



  • was hat frame für einen wert? vielleicht gehst du hier über die grösse hinaus
    pJoint->m_pTranslationKeyframes[ frame ]



  • miller_m schrieb:

    was hat frame für einen wert? vielleicht gehst du hier über die grösse hinaus
    pJoint->m_pTranslationKeyframes[ frame ]

    Frame gibt doch die Framerate an und die ist im MSModel festgelegt.
    Auch habe ich das Model verwendet, welches auch downgeloadet habe. Aber mit eigenen Models funzt das auch nicht.



  • ja aber ist dies ein gültiger wert ? den dieser fehler "Fatal signal: Segemantation Fault <SDL Parachute Deployed> " sagt mir das du mit irgendeinem pointer ein problem hast. somit dachte ich mir das du mit "frame" ausserhalb des gültigen bereiches bist.



  • Hi,

    was heißt denn gültiger Wert? Bei frame ist doch keine Begrenzung festgelegt.

    Gruß ########



  • mal angenommen du hast 5 keyframes und frame hat einen wert von 7
    dann würde der oben beschriebe fehler entstehen. somit wäre frame ungültig.
    mögliche ursache wäre dann das das model nicht korrekt geladen wurde.



  • Hi,

    ich habe mein Problem jetzt selber gelöst. Noch einmal Danke.
    Das Problem lag bei einem fehlerhaften Model.

    Gruß #########


Anmelden zum Antworten