Tutorials

Больше камер

Нажмите, чтобы сфокусироваться, затем нажмите пробел, чтобы приблизиться и отдалиться, нажмите стрелку влево и стрелку вправо, чтобы переключиться на левую и правую камеры

Учебник Основные камеры проведет вас через создание камеры Entity и добавление ее в вашу сцену. Для одной статической камеры не требуется скриптование. Но для более динамичной и интерактивной камеры или для более продвинутого использования вы можете захотеть прикрепить компонент сценария и самостоятельно программировать поведение камеры.

Изменение атрибутов

Первый способ, которым вы можете захотеть изменить камеру во время выполнения, - это изменить значения атрибутов на компоненте камеры. Вы делаете это таким же образом, как устанавливаете атрибуты на любом другом компоненте, используя методы set() и get() на ComponentSystem.

var Zoom = pc.createScript('zoom');

// инициализация кода, вызываемого один раз для каждой сущности
Zoom.prototype.initialize = function() {
    this.targetFov = 45;
};

// код обновления, вызываемый каждый кадр
Zoom.prototype.update = function(dt) {

    if (this.app.keyboard.wasPressed(pc.KEY_SPACE) ) {
        if (this.targetFov == 10) {
            this.targetFov = 45;
        } else {
            this.targetFov = 10;
        }
    }

    var fov = this.entity.camera.fov;
    if (fov < this.targetFov) {
        fov += (10 * dt);
        if (fov > this.targetFov) {
            fov = this.targetFov;
        }
    }

    if (fov > this.targetFov) {
        fov -= (10 * dt);
        if (fov < this.targetFov) {
            fov = this.targetFov;
        }
    }
    this.entity.camera.fov = fov;
};

В этом примере нажатие на пробел вызывает изменение поля зрения. С помощью строки var fov = this.entity.camera.fov мы get() значение fov из компонента камеры сущности, к которой прикреплен этот скрипт.

С помощью this.app.keyboard.wasPressed() мы обнаруживаем нажатие клавиши и переключаемся между значением целевого поля зрения.

С помощью последних двух вложенных конструкций if(){} мы постепенно изменяем значения поля зрения, чтобы создать эффект приближения/отдаления.

С помощью строки this.entity.camera.fov = fov мы set() атрибут камеры fov на новое значение.

Обратите внимание, что когда вы отдалены, верхний и нижний кубы находятся на краях экрана, это соответствует нашим ожиданиям от сцены PlayCanvas Editor, где кубы расположены рядом с верхней и нижней сторонами камеры frustum

Текущая камера

Другой способ, которым вы можете создать взаимодействие с камерами, - это переключение между несколькими камерами. Вы можете сделать это, добавив несколько камер Entity в вашу сцену; убедитесь, что активирована только одна; а затем измените текущую камеру во время выполнения в вашем скрипте.

var CameraManager = pc.createScript('cameraManager');

// инициализация кода, вызываемого один раз для каждой сущности
CameraManager.prototype.initialize = function() {
    this.activeCamera = this.entity.findByName('Center');
    this.app.keyboard.on(pc.EVENT_KEYDOWN, this.onKeyDown, this);

    this.on('destroy', function() {
        this.app.keyboard.off(pc.EVENT_KEYDOWN, this.onKeyDown, this);
    }, this);
};

// предотвращает выполнение стандартных действий браузера, таких как прокрутка при нажатии клавиш курсора
CameraManager.prototype.onKeyDown = function (event) {
    event.event.preventDefault();
};

CameraManager.prototype.setCamera = function (cameraName) {
    // Отключаем текущую активную камеру
    this.activeCamera.enabled = false;

    // Включаем только что указанную камеру
    this.activeCamera = this.entity.findByName(cameraName);
    this.activeCamera.enabled = true;
};

// код обновления, вызываемый каждый кадр
CameraManager.prototype.update = function(dt) {
    var app = this.app;

    if (app.keyboard.wasPressed(pc.KEY_SPACE) ) {
        this.setCamera('Center');
    } else if (app.keyboard.wasPressed(pc.KEY_LEFT)) {
        this.setCamera('Left');
    } else if (app.keyboard.wasPressed(pc.KEY_RIGHT)) {
        this.setCamera('Right');
    }
};

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

Сначала мы создаем функцию для поиска нужной нам камеры по имени - с помощью функции findByName() применительно к родительской сущности этого скрипта (учитывая, что камеры находятся там, нет необходимости использовать this.app.root.findByName() для поиска всех сущностей в сцене).

Мы настраиваем объект, содержащий имена камер Entity, соответствующих клавишам со стрелками и пробелу (см. сцену редактора).

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

This site is translated by the community. If you want to get involved visit this page