Я пытался создать простую систему столкновений для своей 3D-игры, я создаю ограничивающую сферу, подобную этой:
struct ACollSphr
{
glm::vec3* pos;
float radius;
};
И в то же время l oop, которая отображает мою игру в основном я даю им такую позицию:
for (unsigned int i = 0; i < meshModelMatrices2.size(); i++)
{
Ackerfe::ACollSphr tempSphr;
glm::vec3 *temporary = new glm::vec3(meshRenderer2.getBoundingSpherePos(*meshRenderer2.getMesh()) * glm::vec3(vec[i][12], vec[i][13], vec[i][14]));
tempSphr.pos = temporary;
radius = meshRenderer2.getBoundingSphereRadius(*meshRenderer2.getMesh(), *tempSphr.pos);
tempSphr.radius = radius;
meshSphr.push_back(tempSphr);
//std::cout << pos.x << " " << pos.y << " " << pos.z << std::endl;
//std::cout << vec[i][12] << " " << vec[i][13] << " " << vec[i][14] << std::endl;
}
где meshSphr - это вектор сфер, а meshRenderer2 - это средство визуализации, которое я использую для ячеек, в которые я загружаю, в основном я получаю меня sh, передайте его getBoundingSpherePos и получите позицию этого me sh, затем я умножу его на glm :: vec3, составленный из значений позиций внутри матрицы модели каждого me sh, и получу радиус после это и поместил мою вновь созданную сферу в вектор meshSphr (который я очищаю после использования ее для проверки столкновений, чтобы она могла быть снова заполнена в следующей итерации)
моя проверка столкновений выглядит следующим образом:
for (unsigned int i = 0; i < meshSphr.size(); i++)
{
if (Ackerfe::sphrSphrColl(camera3D.getSphr(), &meshSphr[i]))
{
camera3D.changePosition(camera3D.getPosition()+glm::vec3(-5.0f));
}
}
и моя функция sphrSphrColl выглядит следующим образом:
bool sphrSphrColl(ACollSphr *first, ACollSphr *second)
{
if (fabs((first->pos->x - second->pos->x) * (first->pos->x - second->pos->x) +
(first->pos->y - second->pos->y) * (first->pos->y - second->pos->y) +
(first->pos->z - second->pos->z) * (first->pos->z - second->pos->z) < (first->radius + second->radius) * (first->radius + second->radius)))
{
//std::cout <<"DISTANCE: "<<std::endl<<glm::length(*first->pos - *second->pos) << std::endl << std::endl << std::endl << std::endl;
return true;
}
return false;
}
Я проверяю положение ограничивающих сфер с меткой в моем главном, пока l oop, и позиции зарегистрировано правильно, но когда я передаю их в функцию sphrSphrColl, кажется, что только помещает ограничивающую сферу в начало координат и все.
Мой вопрос: есть идеи, почему он это делает? Хотя у меня есть «* 1023» в происхождении, почему оно помещает туда только ограничивающую сферу? почти как указатели не обновляются, когда я передаю их в функцию