Докуметация Cтарт Статьи Форум Лента Вход
Не официальное русскоязычное сообщество
Главная
    Документация jMonkeyEngine
        jMonkeyEngine Уроки и Документация
            Документация для продвинутых пользователей
                Создание камеры следующей за персонажем, камера от 3-го лица

Создание камеры следующей за персонажем, камера от 3-го лица

Опубликованно: 02.06.2017, 21:35
Последняя редакция, Andry: 03.06.2017 0:50

Когда игроки управляют игровым персонажем с видом 1-го лица, они прямо управляют камерой (flyCam.setEnabled (true);), и они никогда не видят самого ходящего персонажа. Однако в игре с просмотром 3-го лица игроки видят идущего персонажа, и вы (разработчик игр) хотите, чтобы камера двигалась вокруг персонажа, когда он ходит.

Есть два способа, как камера может это сделать:

  • Регистрация камеры преследования для игрока и менеджера ввода.
  • Прикрепление камеры к персонажу с помощью узла камеры.
Использование вида от третьего лица требует деактивации flyCam по умолчанию (вид от первого лица). Это означает, что вам необходимо настроить свою собственную навигацию (клавиши ввода и analogListener), которая заставит игрока ходить. Для перемещения персонажа физически существующего игрока используйте player.setWalkDirection(), для не существующего физически персонажа вы можете использовать player.move().

Образцы кода

Нажмите WASD или клавиши со стрелками для перемещения. Двигайте мышь при нажатой левой кнопке мыши, чтобы повернуть.

Узел камеры

Чтобы камера следила за узлом цели, добавьте этот код узла камеры в ваш метод инициализации (например, simpleInitApp()). Spatial цели обычно является узлом игрока.

// Отключить камеру пролета заданную по умолчанию
flyCam.setEnabled(false);
//создать Узел камеры
camNode = new CameraNode("Camera Node", cam);
//Этот режим означает, что камера копирует движения цели:
camNode.setControlDir(ControlDirection.SpatialToCamera);
//Прикрепите camNode к цели:
target.attachChild(camNode);
//Переместить camNode, например. сзади и суть выше цели:
camNode.setLocalTranslation(new Vector3f(0, 5, -5));
//Поверните camNode, чтобы посмотреть целью:
camNode.lookAt(target.getLocalTranslation(), Vector3f.UNIT_Y);
Там, где в примере указано camNode.setLocalTranslation(new Vector3f (0, 5, -5)), вы должны предоставить свою собственную начальную позицию для камеры. Это зависит от размера вашей цели (персонажа игрока) и ее положения в вашей конкретной сцене. Оптимально, если вы устанавливаете это на положение немного позади и выше цели.
Методы  Описание
setControlDir(ControlDirection.SpatialToCamera)  Пользовательский ввод управляет spatial цели, а камера следует за spatial.
Преобразование spatial копируется по трансформации камеры.
Пример: использование с spatial контролем CharacterControlled.
setControlDir(ControlDirection.CameraToSpatial)  Пользовательский ввод управляет камерой, а объект цель следует за камерой.
Преобразование камеры копируется для преобразования spatial. Используйте с flyCam от первого лица.

Пример кода:

  • TestCameraNode.java – Нажмите WASD или клавиши со стрелками для перемещения. Двигайте мышь при нажатой левой кнопке мыши, чтобы повернуть.

Камеру преследования(Chase Camera)

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

// Отключить камеру пролета заданную по умолчанию
flyCam.setEnabled(false);
// Включите камеру преследования для этой цели (обычно это игрок).
ChaseCamera chaseCam = new ChaseCamera(cam, target, inputManager);
chaseCam.setSmoothMotion(true);
Методы  Описание
setInvertVerticalAxis(true)  Инвертировать вращение камеры по вертикальной Оси
setInvertHorizontalAxis(true)  Инвертировать вращение камеры по горизонтальной Оси
setTrailingEnabled(true)  Камера следит за мишенью и летает вокруг и сзади, когда цель движется в сторону камеры. Трейлинг работает только с включенным плавным движением. (По умолчанию)
setTrailingEnabled(false)  Камера следует за целью, но не вращается вокруг цели, когда цель меняет направление.
setSmoothMotion(true)  Активируйте SmoothMotion при завершении. Это означает, что камера, позже, ускоряется и летит позади персонажа, а когда она догнал, она снова замедляется.
setSmoothMotion(false)  Отключите плавное движение камеры. Отключение SmoothMotion также отключает трейлинг.
setLookAtOffset(Vector3f.UNIT_Y.mult(3))  Камера смотрит на точку в 3 мировых единицах выше цели.
setToggleRotationTrigger(new MouseButtonTrigger(MouseInput.BUTTON_MIDDLE))  Включите вращение, удерживая среднюю кнопку мыши нажатой (например, в Blender). Это отключает вращение правой и левой кнопкой мыши.
setToggleRotationTrigger(new MouseButtonTrigger(
MouseInput.BUTTON_MIDDLE),
new KeyTrigger(KeyInput.KEY_SPACE)) 
Активируйте несколько триггеров для поворота камеры, например. Пробел и среднюю кнопку мыши и.т.д.
setRotationSensitivity(5f)  Как быстро камера вращается. Используйте значения около <1.0f (все большие значения игнорируются).

Пример кода:

  • TestChaseCamera.java – Нажмите WASD или клавиши со стрелками для перемещения. Двигайте мышь при нажатой левой кнопке мыши, чтобы повернуть.

Что выбрать?

В чем разница между двумя примерами кода выше?

CameraNode  ChaseCam
Камера немедленно следует, то есть летает с той же скоростью, что и цель.  Камера движется плавно, ускоряется и замедляется, летает медленнее, чем цель и догоняет.
Камера остается прикрепленной к цели на постоянном расстоянии.  Камера вращается вокруг цели и медленно приближается.
Drag-to-Rotate вращает цель и камеру. Вы всегда видите цель сзади.  Drag-to-Rotate поворачивает только камеру. Вы можете видеть цель с разных сторон.

Переведено для jmonkeyengine.ru, оригинал
Автор перевода: Andry

Добавить комментарий

jMonkeyEngine.ru © 2017. Все права сохранены.