Как установить камеру вокруг источника - PullRequest
0 голосов
/ 08 ноября 2018

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

Вот моя попытка:

float distance, // radius (from origin) updated by -, + keys
      pitch,    // angle in degrees updated from W, S keys (increments of +- 10)
      yaw;      // angle in degrees updated from A, D keys (increments of +- 10)


view = lookAt(
        Eigen::Vector3f(distance * sin(toRadians(pitch)) * cos(toRadians(yaw)), distance * sin(toRadians(pitch)) * sin(toRadians(yaw)), distance * cos(toRadians(pitch))),
        Eigen::Vector3f(0.0f, 0.0f, 0.0f),
        Eigen::Vector3f(0.0f, 0.0f, 1.0f));

proj = perspective(toRadians(90.0f), static_cast<float>(width) / height, 1.0f, 10.0f);

Я чувствую, что моя проблема - это вектор Up, но я не уверен, как правильно его обновить (и в то же время я думаю, что все в порядке, так как я всегда хочу, чтобы ориентация камеры оставалась неизменной, я очень хочется просто переместить положение камеры)

Редактировать: Я хотел бы добавить, что я рассчитываю информацию, основанную на позиции, найденную здесь: http://tutorial.math.lamar.edu/Classes/CalcIII/SphericalCoords.aspx Я не уверен, что математика, обсуждаемая здесь, напрямую переходит, поэтому, пожалуйста, поправьте меня если не так.

1 Ответ

0 голосов
/ 08 ноября 2018

Это может быть вопросом интерпретации. Ваш код выглядит правильно, но pitch может не иметь того значения, которое вы думаете.

Когда pitch равно 0, камера расположена на северном полюсе сферы (0, 0, 1). Это немного проблематично, так как ваш вектор вверх и направление обзора становятся параллельными, и вы не получите правильное преобразование. Затем, когда pitch увеличивается, камера перемещается на юг, пока не достигнет южного полюса, когда pitch=PI. Ваш код должен работать для любой точки, которая не находится на полюсах. Вы можете поменять местами sin(pitch) и cos(pitch), чтобы начать на экваторе, когда pitch=0 (и поддерживать положительную и отрицательную высоту тона).

На самом деле, я предпочитаю моделировать этот тип камеры более непосредственно в виде комбинации матриц:

view = Tr(0, 0, -distance) * RotX(-pitch) * RotY(-yaw)

Tr - это матрица перевода, RotX - это вращение вокруг оси x, а RotY - это вращение вокруг оси y. Это предполагает, что ось у вверх. Если вы хотите, чтобы была установлена ​​другая ось, вы можете просто добавить соответствующую матрицу вращения. Например, если вы хотите, чтобы ось Z была вверху, то

view = Tr(0, 0, -distance) * RotX(-pitch) * RotY(-yaw) * RotX(-Pi/2)
...