Итак, я пытаюсь сделать базовую 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;
}