Я строю игру в 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
Если оператор с логическими причинами функционирует, чтобы прекратить работу [закрыто] ⇐ C++
Программы на C++. Форум разработчиков
1746534425
Anonymous
Я строю игру в 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[i];
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[i]->transformedVertices.empty()) {
if (!meshList[i]->UsesBoxCollision) { // !!! culprit
const std::vector tris = ExtractTrianglesFromMesh(meshList[i]);
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[i]->box, deltaTime, groundY)) {
anyGrounded = true;
if (groundY > maxGroundLevel) {
maxGroundLevel = groundY;
closestY = maxGroundLevel;
hit = true;
}
}
}
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79608338/if-statement-with-boolean-causes-function-to-stop-working[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия