прямое движение камеры c ++ - PullRequest
0 голосов
/ 08 ноября 2011

Я довольно новичок в Directx, так что это может звучать очень просто.

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

Пока у меня все комнаты нарисованы с дверьми и т. Д., Но я немного застрял, как сделать камеру от первого лица и позволить пользователю перемещаться вперед, назад и из стороны в сторону с помощью клавиш со стрелками на клавиатуре.

Чем проще, тем лучше я начинающий.

Может ли кто-нибудь помочь мне с этим или указать мне правильное направление?

Заранее спасибо

Ответы [ 2 ]

3 голосов
/ 08 ноября 2011

В Интернете есть множество учебников, посвященных этой теме, поэтому Google наверняка вам поможет.

Что касается основ: вы захотите сохранить свою позицию и поворот камеры. Предполагая, что Z - ваша восходящая ось, вы должны использовать стрелки, чтобы изменить только X и Y.

Скажем также, что вы сохраните ориентацию камеры в виде композиции поворотов вдоль оси Z (направление движения) и оси X (взгляд вверх-вниз).

Простой класс:

class Player 
{
protected:
    float3 Position; // Z-up
    float2 CameraRotation; // X for turning, Y for up-down
public:
    void MoveForward()
    {
        Position.X += -cosf(CameraRotation.X) * PLAYER_SPEED;
        Position.Y += -sinf(CameraRotation.X) * PLAYER_SPEED;
    }
    // when using any other arrow, just add a multiply of PI/2 to the camera rotation
    // PI for backwards, +PI/2 for left strafe and -PI/2 for right strafe.
    // If you don't want to use mouse, use left and right arrow to modify camera rotation
    // and MoveForward and Backward will look the same, having different signs.
};

Знаки '-' перед функциями sinf и cosf присутствуют, потому что вы, вероятно, захотите такое поведение, не стесняйтесь их менять.

Что касается камеры, вам придется реализовать дельту мыши между кадрами. В каждом кадре сравните положение мыши с предыдущим. Затем умножьте его, повернув и посмотрев скорость, и установите прямо значение камеры.

Надеюсь, это помогло.

1 голос
/ 08 ноября 2011

Я скорее парень из OpenGL, поэтому я не могу помочь вам с технической стороны, я могу дать вам направление.

Как правило, 3D-камера имеет:

Перевод - где камера (x, y, z)

Поворот - угол наклона камеры вокруг каждой оси

То, что вы хотите сделать, относится только к части перевода:

  1. Контролировать ввод пользователя и снимать, когда он нажимает одну из клавиш со стрелками.
  2. Когда клавиша со стрелкой нажата, вы хотите начать изменять перевод камеры. Если пользователь нажимает клавишу «вверх», вы добавляете постоянное значение к соответствующему компоненту трансляции камеры (x) на каждой итерации основного игрового цикла, пока он не отпустит клавишу. Если он нажмет клавишу «Вниз», вы захотите вычесть это значение вместо того, чтобы добавить его.
  3. Когда он отпускает ключ, ваш код должен прекратить добавлять это значение в трансляцию камеры.

Предположим, что ваша игра работает на частоте 60 Гц, и вы добавляете, скажем, 1/60 единиц к камере, переводя каждую итерацию для каждого направления, которое хочет пройти пользователь. Если пользователь удерживал клавишу со стрелкой вверх в течение 2 секунд, камера переместилась бы вперед на 2 единицы.

В общем, это «теория», теперь я могу только указать на те веб-страницы, которые я нашел, которые могут быть полезны для решения технической стороны вашей проблемы:

Движение камеры DirectX - Полагаю, в этой статье гораздо больше, чем нужно, но она выглядела довольно хорошо, и я думаю, что вы все равно должны ее прочитать ... Но вы можете просто пропустить часть трансформации вида.

Обработка ввода - ничего особенного сказать, обычная обработка ввода Win32. Если вы не знакомы с обработкой ввода в win32, я думаю, что сначала вам понадобится час или два, чтобы изучить это.

Хорошо, вот и все, надеюсь, я помог

...