आपको मैट्रिस के घूर्णन भागों के लिए SLERP का उपयोग करना होगा, और अन्य भागों के लिए रैखिक। सबसे अच्छा तरीका है कि अपने मैट्रिस को quaternions में बदलना और (सरल) quaternion SLERP का उपयोग करें: http://en.wikipedia.org/wiki/Slerp।
मैं ग्राफ़िक रत्न II या III पढ़ने का सुझाव देता हूं, विशेष रूप से मैट्रिक्स को सरल परिवर्तनों में विघटित करने के बारे में अनुभाग। यहाँ इस अध्याय के लिए स्पेंसर डब्ल्यू थॉमस 'स्रोत है:
http://tog.acm.org/resources/GraphicsGems/gemsii/unmatrix.c
बेशक
, मैं सुझाव है कि आप कैसे इस खुद कर सीखते हैं। यह वास्तव में मुश्किल नहीं है, बस बहुत परेशान बीजगणित। http://cache-www.intel.com/cd/00/00/29/37/293748_293748.pdf
संपादित: और अंत में, यहाँ कैसे एक चौका में एक मैट्रिक्स चालू करने के लिए, और वापस, आईडी सॉफ्टवेयर के द्वारा पर एक बड़ा कागज है यह, सूत्र काफी हर किसी का हवाला देते है यह एक 1985 SIGGRAPH से है कागज।
कहाँ:
- qm = interpolated quaternion
- qa = quaternion a (first quaternion to be interpolated between)
- qb = quaternion b (second quaternion to be interpolated between)
- t = a scalar between 0.0 (at qa) and 1.0 (at qb)
- θ is half the angle between qa and qb
कोड:
quat slerp(quat qa, quat qb, double t) {
// quaternion to return
quat qm = new quat();
// Calculate angle between them.
double cosHalfTheta = qa.w * qb.w + qa.x * qb.x + qa.y * qb.y + qa.z * qb.z;
// if qa=qb or qa=-qb then theta = 0 and we can return qa
if (abs(cosHalfTheta) >= 1.0){
qm.w = qa.w;qm.x = qa.x;qm.y = qa.y;qm.z = qa.z;
return qm;
}
// Calculate temporary values.
double halfTheta = acos(cosHalfTheta);
double sinHalfTheta = sqrt(1.0 - cosHalfTheta*cosHalfTheta);
// if theta = 180 degrees then result is not fully defined
// we could rotate around any axis normal to qa or qb
if (fabs(sinHalfTheta) < 0.001){ // fabs is floating point absolute
qm.w = (qa.w * 0.5 + qb.w * 0.5);
qm.x = (qa.x * 0.5 + qb.x * 0.5);
qm.y = (qa.y * 0.5 + qb.y * 0.5);
qm.z = (qa.z * 0.5 + qb.z * 0.5);
return qm;
}
double ratioA = sin((1 - t) * halfTheta)/sinHalfTheta;
double ratioB = sin(t * halfTheta)/sinHalfTheta;
//calculate Quaternion.
qm.w = (qa.w * ratioA + qb.w * ratioB);
qm.x = (qa.x * ratioA + qb.x * ratioB);
qm.y = (qa.y * ratioA + qb.y * ratioB);
qm.z = (qa.z * ratioA + qb.z * ratioB);
return qm;
}
से: http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/
स्रोत
2010-11-04 17:29:46
धन्यवाद! तो मैं एक मैट्रिक्स को quaternion में कैसे परिवर्तित कर सकता हूँ? – clamp
मेरा सुझाव है कि आप इसे पढ़कर शुरू करें: http://en.wikipedia.org/wiki/Quaternion – tdammers