D3DXQuaternionSlerp: Interpolation zu schnell...?



  • ich interpoliere zwischen zwei Quaternionen:

    D3DXQuaternionSlerp(&out,&quatMCamera,&quatCamera,t);
    

    Die Zeit t läuft von 0 bis 1. Komischerweise stimmt die out Quaternion bei etwa t=0.2 mit der quatCamera Quaternion überein und verändert sich im Intervall 0.2 bis 1.0 nicht mehr merklich - das verwundert mich etwas - woran könnte das liegen?

    noch etwas mehr Code, an dem man sehen kann wie ich die Quaternions erzeuge:

    // Build quaternion for MCamera
    		const D3DXMATRIX* viewMCamera = g_MCamera.GetViewMatrix();
    
    		D3DXVECTOR3 forwardMCamera;
    		forwardMCamera.x = viewMCamera->_13;
    		forwardMCamera.y = viewMCamera->_23;
    		forwardMCamera.z = viewMCamera->_33;
    		D3DXVec3Normalize(&forwardMCamera,&forwardMCamera);
    
    		D3DXVECTOR3 upMCamera;
    		upMCamera.x = viewMCamera->_12;
    		upMCamera.y = viewMCamera->_22;
    		upMCamera.z = viewMCamera->_32;
    		D3DXVec3Normalize(&upMCamera,&upMCamera);
    
    		D3DXVECTOR3 rightMCamera;
    		rightMCamera.x = viewMCamera->_11;
    		rightMCamera.y = viewMCamera->_21;
    		rightMCamera.z = viewMCamera->_31;
    		D3DXVec3Normalize(&rightMCamera,&rightMCamera);
    
    		D3DXMATRIX matRot;
    		D3DXMatrixIdentity(&matRot);
    		matRot._13 = forwardMCamera.x;
    		matRot._23 = forwardMCamera.y;
    		matRot._33 = forwardMCamera.z;
    
    		matRot._12 = upMCamera.x;
    		matRot._22 = upMCamera.y;
    		matRot._32 = upMCamera.z;
    
    		matRot._11 = rightMCamera.x;
    		matRot._21 = rightMCamera.y;
    		matRot._31 = rightMCamera.z;
    
    		D3DXQUATERNION quatMCamera;
    		D3DXQuaternionRotationMatrix(&quatMCamera,&matRot);
    
    		// Build quaternion for Camera
    		D3DXVECTOR3 forwardCamera;
    		forwardCamera.x = g_Camera.GetWorldAhead()->x;
    		forwardCamera.y = g_Camera.GetWorldAhead()->y;
    		forwardCamera.z = g_Camera.GetWorldAhead()->z;
    		D3DXVec3Normalize(&forwardCamera,&forwardCamera);
    
    		D3DXVECTOR3 upCamera;
    		upCamera.x = g_Camera.GetWorldUp()->x;
    		upCamera.y = g_Camera.GetWorldUp()->y;
    		upCamera.z = g_Camera.GetWorldUp()->z;
    		D3DXVec3Normalize(&upCamera,&upCamera);
    
    		D3DXVECTOR3 rightCamera;
    		rightCamera.x = g_Camera.GetWorldRight()->x;
    		rightCamera.y = g_Camera.GetWorldRight()->y;
    		rightCamera.z = g_Camera.GetWorldRight()->z;
    		D3DXVec3Normalize(&rightCamera,&rightCamera);
    
    		D3DXMATRIX matRot2;
    		D3DXMatrixIdentity(&matRot2);
    		matRot2._13 = forwardCamera.x;
    		matRot2._23 = forwardCamera.y;
    		matRot2._33 = forwardCamera.z;
    
    		matRot2._12 = upCamera.x;
    		matRot2._22 = upCamera.y;
    		matRot2._32 = upCamera.z;
    
    		matRot2._11 = rightCamera.x;
    		matRot2._21 = rightCamera.y;
    		matRot2._31 = rightCamera.z;
    
    		D3DXQUATERNION quatCamera;
    		D3DXQuaternionRotationMatrix(&quatCamera,&matRot2);
    
    		// Blend between quaternions
    		const float fAnimationTime = 2.0f;
    		if (fTime - fStartTimeAutomaticState > fAnimationTime)
    		{
    			///...
    		}
    		else
    		{
    			float t = (fTime - fStartTimeAutomaticState) / fAnimationTime;
    
    			D3DXQUATERNION out;
    			D3DXQuaternionSlerp(&out,&quatMCamera,&quatCamera,t);
    
    			g_MCamera.SetViewQuat(out);
    		}
    


  • Dieser Thread wurde von Moderator/in rüdiger aus dem Forum Rund um die Programmierung in das Forum Spiele-/Grafikprogrammierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Anmelden zum Antworten