Рассчитать положение и поворот камеры с помощью событий мыши - PullRequest
0 голосов
/ 10 мая 2018

Мой план:

1. Рассчитать направление мыши [x, y] [success]

Событие перемещения мыши:

int directionX = lastPosition.x - position.x;
int directionY = lastPosition.y - position.y;

2. Рассчитать углы [тета, фи] [успех]

float theta = fmod(lastTheta + sensibility * directionY, M_PI);
float phi = fmod(lastPhi + sensibility * directionX * -1, M_PI * 2);

Редактировать {

исправление ошибки:

float theta = lastTheta + sensibility * directionY * -1;
if (theta < M_PI / -2)theta = M_PI / -2;
else if (theta > M_PI / 2)theta = M_PI / 2;

float phi = fmod(lastPhi + sensibility * directionX * -1, M_PI * 2);

}

Теперь я дал тэта , фи , центральную точку и радиус , и я хочу вычислить позицию и вращение [что камера смотрит в центр]

3. Рассчитать координаты положения [X, Y, Z] [не удалось]

float newX = radius * sin(phi) * cos(theta);
float newY = radius * sin(phi) * sin(theta);
float newZ = radius * cos(phi);

Решение [от meowgoesthedog]:

float newX = radius * cos(theta) * cos(phi);
float newY = radius * sin(theta);
float newZ = radius * cos(theta) * sin(phi);

4. Рассчитать вращение [не удалось]

float pitch = ?;
float yaw = ?;

Решение [от meowgoesthedog]:

float pitch = -theta;
float yaw = -phi;

Спасибо за ваши решения!

1 Ответ

0 голосов
/ 10 мая 2018

Ваша попытка была почти (вроде) верна:

  • Как видно из диаграммы, в OpenGL «вертикальное» направление принято считать Y, тогда как в ваших формулах предполагается, что оно Z

  • phi и theta находятся в неправильном порядке

  • Очень простое преобразование: yaw = -phi, pitch = -theta (с точки зрения камеры)

Фиксированные формулы:

float position_X = radius * cos(theta) * cos(phi);
float position_Y = radius * sin(theta);
float position_Z = radius * cos(theta) * sin(phi);

(Могут также быть некоторые проблемы со знаками в дельтах мыши, но их легко исправить.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...