Я пытался стрелять пулями из моего текущего местоположения камеры, но по какой-то причине мои положения пуль не верны, когда камера движется - PullRequest
0 голосов
/ 15 декабря 2018

Итак, я пытаюсь сделать базовую fps-игру для своего проекта, и я реализовал анимацию стрельбы.Пули появляются из вектора вида камеры (там, где смотрит игрок), и все в порядке, когда я просто меняю вектор вида камеры (когда я осматриваюсь с помощью мыши).Но когда я по какой-то причине меняю местоположение камеры (перемещаюсь вокруг координат x и z), мои пули появляются слева и справа от камеры (например, если я иду налево, пули появляются немного вправо).Я пробовал разные вещи, но не смог решить проблему.

Вот как я создаю пули.

for (int i = 0; i < BulletArray.size(); i++)
{

    if ( BulletArray[i].shooting_time + 4 >= currentFrame)
    {
        if (BulletArray[i].FirstFire)
        {

            BulletArray[i].BulletDirection = guy1.GetFrontLook();

            BulletArray[i].BulletPos = guy1.GetPos();

            BulletArray[i].FirstFire = false;
        }

        glm::mat4 BulletModel;
        BulletArray[i].BulletPos += BulletArray[i].BulletDirection*velocity;
        BulletModel = glm::translate(BulletModel, BulletArray[i].BulletPos);
        BulletModel = glm::scale(BulletModel, glm::vec3(0.01f));
        lightingShader.setMat4("model", BulletModel);
        lightingShader.setVec3("objectColor", 0.2f, 1.7f, 2.31f);

        glDrawArrays(GL_TRIANGLES, 0, 36);
    }
    else if (BulletArray[i].shooting_time + 4 < currentFrame)
    {
        BulletArray.erase(BulletArray.begin() + i);
    }

}

Вот как я обновляю фронтальные векторы камеры:

void update()
{
    glm::vec3 front;
    front.x = cos(glm::radians(Yaw)) * cos(glm::radians(Pitch));
    front.y = FrontGo.y;
    front.z = sin(glm::radians(Yaw)) * cos(glm::radians(Pitch));
    FrontGo = glm::normalize(front);
    if (prewYaw > Yaw)
    {
        lastRotationDegree = glm::acos(glm::dot(FrontGo, PrevFrontGo) / (glm::length(FrontGo) + glm::length(PrevFrontGo)));
    }
    else
    {
        lastRotationDegree = -glm::acos(glm::dot(FrontGo, PrevFrontGo) / (glm::length(FrontGo) + glm::length(PrevFrontGo)));
    }
    PrevFrontGo = FrontGo;
    prewYaw = Yaw;
    glm::vec3 frontl;
    frontl.x = cos(glm::radians(Yaw)) * cos(glm::radians(Pitch));
    frontl.y = sin(glm::radians(Pitch));
    frontl.z = sin(glm::radians(Yaw)) * cos(glm::radians(Pitch));
    FrontLook =  glm::normalize(frontl);
    Right = glm::normalize(glm::cross(FrontLook, wUp));
    Up = glm::normalize(glm::cross(Right,FrontLook));
}

Вот как я обновляю положение камеры:

void ProcessKeyboardP(Player_Movement direction, float deltaTime)
{
    float velocity = MovementSpeed * deltaTime;
    if (direction == FORWARD_P)
        Position +=  FrontGo * velocity;
    if (direction == BACKWARD_P)
        Position -= FrontGo * velocity;
    if (direction == LEFT_P)
        Position -= Right * velocity;
    if (direction == RIGHT_P)
        Position += Right * velocity;

}
...