I'm trying to implement OBB vs OBB SAT collision from Randy Gaul's article.
I have been playing with it for days, but I can't figure it out why it doesn't work.
I am storing all vertex positions of each box, and also each edge normal on two lists. Then I use them on the algorithm, I tried a lot of changes to make it work but no luck.
This is my C++ code:
QVector2D Entity::getSupport(QVector2D dir)
{
float bestProjection = -std::numeric_limits<float>::max();
QVector2D bestVertex;
for(quint32 i = 0; i < verticesList.count(); ++i)
{
QVector2D v = verticesList.at(i);
float projection = QVector2D::dotProduct(v,dir);
if(projection > bestProjection)
{
bestVertex = v;
bestProjection = projection;
}
}
return bestVertex;
}
qreal Collision::FindAxisLeastPenetration(Entity *A, Entity *B )
{
float bestDistance = -std::numeric_limits<float>::max();
for(quint32 k = 0; k < A->verticesList.count() ; ++k)
{
QVector2D n = A->normalList.at(k);
QVector2D s = B->getSupport(-n);
QVector2D v = A->verticesList.at(k);
QVector2D r = s-v;
qreal d = QVector2D::dotProduct(n,r);
if(d > bestDistance)
{
bestDistance = d;
}
}
return bestDistance;
}
if (coli->FindAxisLeastPenetration(player,player2) <0 && FindAxisLeastPenetration(player2,player) <0 )
{
qDebug() << "Collision detected ";
}
↧