Мне было интересно, как я могу заставить свою камеру FPS двигаться вперед и назад в зависимости от направления камеры, но я с треском провалился, я хотел бы знать, как сделать это оптимально, так как сейчас мой код переключается направления позади моего треугольника (w становится s, а s становится w) и обычно не работают (двигайтесь по диагонали вместо иногда вперед), вращение работает отлично, но перевод портит мою матрицу...
void glfwCursorCallback(GLFWwindow* window, double x, double y) {
camera.rx += (x - camera.lcx) * 0.01f;
camera.ry += (y - camera.lcy) * 0.01f;
kmMat4RotationYawPitchRoll(&camera.mat, camera.ry , camera.rx, 0.0f);
camera.lcx = x;
camera.lcy = y;
}
...
kmMat4PerspectiveProjection(&projection, 90.0f, aspect, 0.1f, 1000.f);
float x = 0.0f, y = 0.0f, z = -1.0f;
while(!glfwWindowShouldClose(window)) {
if(glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS) {
/* pitch - ry */
x += 0.1*sin(camera.ry)*cos(camera.rx);
y += 0.1*sin(camera.ry)*sin(camera.rx);
z += 0.1*cos(camera.ry);
}
if(glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS) {
x -= 0.1*sin(camera.ry)*cos(camera.rx);
y -= 0.1*sin(camera.ry)*sin(camera.rx);
z -= 0.1*cos(camera.ry);
}
glClear(GL_COLOR_BUFFER_BIT);
kmMat4Translation(&transform, x, y, z);
kmMat4Multiply(&object, &camera.mat, &transform);
kmMat4Multiply(&final, &projection, &object);
glUniformMatrix4fv(shader.mpm, 1, GL_FALSE, final.mat);
...
Я понятия не имею, как это сделать, так как никогда не делал этого раньше, поэтому мне бы хотелось получить несколько советов от более опытных людей!
Редактировать: цель состоит в том, чтобы камера двигалась вперед в соответствии с ориентацией. Кроме того, он отлично работает, если я опускаю x
, y
и просто устанавливаю z
на +- 0,1 ... так что это не проблема умножения матриц.