Попытка реализовать мышью «камеру» в OpenGL / SFML - PullRequest
4 голосов
/ 13 июля 2011

Я уже некоторое время использую OpenGL с SFML 1.6, и это было здорово! За одним исключением: я не могу правильно реализовать класс камеры. Видите ли, я пытаюсь создать класс C ++ под названием «Камера». Вот мои функции:

Camera::Strafe(float fSpeed)

проверяет, нажаты ли клавиши WASD, и, если это так, переместите камеру в положение «fSpeed» в их соответствующих направлениях.

Camera::MouseMove(int currentX, int currentY)

должен обеспечивать вид мыши от первого лица, принимая текущие координаты мыши и соответственно поворачивая камеру. Моя реализация Strafe () работает нормально, но я не могу понять, правильно ли MouseMove ().

Я уже знаю, читая другие ресурсы по реализациям мышки в OpenGL, что я должен центрировать мышь после каждого кадра, и у меня эта часть опущена. Но это все. Я не могу понять, как на самом деле вращать камеру на месте от координат мыши. Бьюсь об заклад, наверное, нужно использовать триг.

1 Ответ

0 голосов
/ 13 июля 2011

Я сделал нечто похожее на это (это была камера от третьего лица). Если я помню, что я сделал правильно, я взял изменение положения мыши и использовал это для вычисления двух углов (я сделал это с некоторым триггером, я полагаю). Один угол дал мне горизонтальное вращение, другой дал мне вертикальное вращение. В частности, Pitch, Yaw and Roll, хотя я не могу вспомнить, в каком направлении это происходит. Есть еще один, который вы должны сделать, прежде чем другой, иначе все будет смешно. Я почти уверен, что сначала это был шаг, затем рыскание или крен.

Надеюсь, должно быть очевидно, что изменило положение мыши. Это позволило чувствительность мыши. Если бы я быстро двигал мышь, у меня было бы большее изменение, и поэтому я бы вращался «быстрее».

РЕДАКТИРОВАТЬ: Хорошо, я посмотрел на мой код, и это очень простой расчет.

Это было сделано с C #, так что терпите меня за синтаксис:

_angles.X += MathHelper.ToDegrees(changeInX / 100);
_angles.Y += MathHelper.ToDegrees(changeInY / 100);

мои углы были сохранены в двухмерном векторе (поскольку я вращался только на двух осях). Вы увидите, что я взял мои значения changeInX и changeInY и просто разделил их на 100, чтобы получить произвольное значение в радианах, а затем преобразовал это число в градусы. Отрегулируйте 100 для чувствительности. Имейте в виду, никакой математики здесь не было сделано, чтобы понять это. Я просто сделал несколько проб и ошибок, пока не получил что-то, что хорошо работало.

...