Я строю игру в OpenGL. Когда я запускаю оператор IF с помощью функции, включенной в столкновение, это заставляет код пересечения треугольника, чтобы перестать работать. < /P>
Вот мой код с оператором if и без. Первый работает, но второй - нет. Коробка рампа установлена на кастинг Рэй, через который игрок может просто пройти, но другие коробки, которые установлены на столкновение, работают. < /P>
// ramp box which should use ray casting.
model = glm::mat4();
model = glm::translate(model, glm::vec3(-2.0f, 4.5f, 8.0f));
model = glm::rotate(model, 45 * toRadians, glm::vec3(0.0f, 0.0f, 1.0f));
model = glm::scale(model, glm::vec3(10.0f, 2.0f, 1.0f));
glUniformMatrix4fv(uniformModel, 1, GL_FALSE, glm::value_ptr(model));
tile.UseTexture();
shinyMaterial.UseMaterial(uniformSpecularIntensity, uniformShininess);
meshList[4]->RenderMesh();
meshList[4]->updateVertices(model);
meshList[4]->UsesBoxCollision = false;
std::vector ExtractTrianglesFromMesh(const Mesh* mesh) {
std::vector triangles;
for (unsigned int i = 0; i < mesh->mNumOfIndices; i += 3) {
unsigned int i0 = mesh->mIndices;
unsigned int i1 = mesh->mIndices[i + 1];
unsigned int i2 = mesh->mIndices[i + 2];
Triangle* tri = new Triangle();
tri->v0 = mesh->transformedVertices[i0];
tri->v1 = mesh->transformedVertices[i1];
tri->v2 = mesh->transformedVertices[i2];
triangles.push_back(tri);
}
return triangles;
}
// ray casting works here by itself without the if statement
// std::cout v0, tri->v1, tri->v2, hitY)) {
// if (hitY > closestY) {
// closestY = hitY;
// hit = true;
// }
// }
// }
// }
// }
// ray casting does not work here
for (int i = 0; i < meshList.size();i++) {
if (!meshList->transformedVertices.empty()) {
if (!meshList->UsesBoxCollision) { // !!! culprit
const std::vector tris = ExtractTrianglesFromMesh(meshList);
for (int j = 0; j < tris.size();j++) {
float hitY;
if (RayIntersectsTriangle(rayOrigin, rayDir, tris[j]->v0, tris[j]->v1, tris[j]->v2, hitY)) {
if (hitY > closestY) {
closestY = hitY;
hit = true;
}
}
}
} else {
float groundY = 0.0f;
if (camera.boxCollision(meshList->box, deltaTime, groundY)) {
anyGrounded = true;
if (groundY > maxGroundLevel) {
maxGroundLevel = groundY;
closestY = maxGroundLevel;
hit = true;
}
}
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/796 ... op-working