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ß #########