PQ-Formel bei Vektoren
Verfasst: 29.04.2009, 16:03
Hola,
Also mein Problem ist dass ich einen Vektor mit einer quadratischen Gleichung berechne.
v*t² + 1/2 g*t² = m
Nun gibt eine Kollisionserkennung ggf. einen gekürzten Vektor zurück und ich will daraus wieder ein t berechnen. Muss also folgende Gleichung nach t auflösen:
v*t + 1/2 g*t² = m'
Ein bewegtes Ding fällt auf den Boden quasi.
v und a sind 3d Vektoren.
Mein erster Ansatz nur die Länge zu vergleichen führt über eine Gleichung vierten Grades zu einer kubischen Gleichung und letztendlich zu einem ziemlichen Bastard von einer Lösung.
Daher habe ich nun versucht für alle 3 Komponenten die PQ-Formel aufzustellen.
Die Lösung ist leider inkosistent (fällt manchmal durch den Boden) und ich bin mir nicht sicher ob mein Ansatz prinzipiell hinkt oder ob es nur auf Fließkommavergleiche zurückzuführen ist. Wobei ich weder für das eine noch für das andere spontan eine Lösung parat hätte..
Also der Code sieht bis jetzt so aus:
Wie würdet ihr das angehen?
Also mein Problem ist dass ich einen Vektor mit einer quadratischen Gleichung berechne.
v*t² + 1/2 g*t² = m
Nun gibt eine Kollisionserkennung ggf. einen gekürzten Vektor zurück und ich will daraus wieder ein t berechnen. Muss also folgende Gleichung nach t auflösen:
v*t + 1/2 g*t² = m'
Ein bewegtes Ding fällt auf den Boden quasi.
v und a sind 3d Vektoren.
Mein erster Ansatz nur die Länge zu vergleichen führt über eine Gleichung vierten Grades zu einer kubischen Gleichung und letztendlich zu einem ziemlichen Bastard von einer Lösung.
Daher habe ich nun versucht für alle 3 Komponenten die PQ-Formel aufzustellen.
Die Lösung ist leider inkosistent (fällt manchmal durch den Boden) und ich bin mir nicht sicher ob mein Ansatz prinzipiell hinkt oder ob es nur auf Fließkommavergleiche zurückzuführen ist. Wobei ich weder für das eine noch für das andere spontan eine Lösung parat hätte..
Also der Code sieht bis jetzt so aus:
Code: Alles auswählen
float p, q, a,
tx1, tx2,
ty1, ty2,
tz1, tz2;
p = m_Velocity.x / m_Gravity.x,
q = (2 * Movement.x) / m_Gravity.x;
a = p * p + q;
a = sqrtf(a);
tx1 = -p + a;
tx2 = -p - a;
p = m_Velocity.y / m_Gravity.y;
q = (2 * Movement.y) / m_Gravity.y;
a = p * p + q;
a = sqrtf(a);
ty1 = -p + a;
ty2 = -p - a;
p = m_Velocity.z / m_Gravity.z;
q = (2 * Movement.z) / m_Gravity.z;
a = p * p + q;
a = sqrtf(a);
tz1 = -p + a;
tz2 = -p - a;
if(tx1 > 0.0f){
if((Movement.y == 0.0f || tx1 == ty1 || tx1 == ty2) && (Movement.z == 0.0f || tx1 == tz1 || tx1 == tz2)) return tx1;
}
if(tx2 > 0.0f){
if((Movement.y == 0.0f || tx2 == ty1 || tx2 == ty2) && (Movement.z == 0.0f || tx2 == tz1 || tx2 == tz2)) return tx2;
}
if(ty1 > 0.0f){
if(Movement.z == 0.0f || ty1 == tz1 || ty1 == tz2) return ty1;
}
if(ty2 > 0.0f){
if(Movement.z == 0.0f || ty2 == tz1 || ty2 == tz2) return ty2;
}
if(max(tz1, tz2) > 0.0f) return max(tz1, tz2);
return -1.0f;