Ограничительная сфера застряла на месте - PullRequest
0 голосов
/ 15 февраля 2020

Я пытался создать простую систему столкновений для своей 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» в происхождении, почему оно помещает туда только ограничивающую сферу? почти как указатели не обновляются, когда я передаю их в функцию

...