for (unsigned int i = 0; i < m_gameObjects.size(); i++) { GameObject* obj = m_gameObjects[i]; for (int j = 0; j < collisionTriangles.size(); j++) { Triangle tr = collisionTriangles[j]; float currDist = tr.A * obj->position.x() + tr.B * obj->position.y() + tr.C * obj->position.z() + tr.D; float prevDist = tr.A * obj->previousPosition.x() + tr.B * obj->previousPosition.y() + tr.C * obj->previousPosition.z() + tr.D; if ((currDist * prevDist < 0) || abs(currDist) < obj->m_radius) { // Rzut pozycji obiektu na plaszczyzne QVector3D p = obj->position - tr.n * currDist; // Przesuniecie punktu do srodka trojkata o dlugosc promienia kolidera QVector3D r = (tr.v1 + tr.v2 + tr.v3) * (1.0f / 3.0f) - p; r = r.normalized(); p = p + r * obj->m_radius; // Obliczenie v, w, u - wspolrzednych barycentrycznych QVector3D v0 = tr.v2 - tr.v1, v1 = tr.v3 - tr.v1, v2 = p - tr.v1; float d00 = QVector3D::dotProduct(v0, v0); float d01 = QVector3D::dotProduct(v0, v1); float d11 = QVector3D::dotProduct(v1, v1); float d20 = QVector3D::dotProduct(v2, v0); float d21 = QVector3D::dotProduct(v2, v1); float denom = d00 * d11 - d01 * d01; float v = (d11 * d20 - d01 * d21) / denom; float w = (d00 * d21 - d01 * d20) / denom; float u = 1.0f - v - w; // Sprawdzenie czy punkt jest w srodku trojkata if (v >= 0 && w >= 0 && (v + w) <= 1) { float d = obj->m_radius - currDist; obj->position = obj->position + tr.n * d; obj->energy = obj->energy - tr.n * QVector3D::dotProduct(tr.n, obj->energy) * 2; } } } }