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.