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

Видеонаблюдение с применением нескольких камер

Опубликованно: 03.06.2017, 1:10
Последняя редакция, Andry: 03.06.2017 14:12

Вы можете разделить экран и посмотреть 3D-сцену с разных ракурсов одновременно. Например. Вы можете иметь два корневых узла с разными графами сцен и два viewPorts, каждый из которых может видеть только собственное подмножество сцены с собственным подмножеством фильтров port-processing, поэтому вы получаете две совершенно разных камеры наблюдающие сцены.

Пакеты, используемые в этом примере, — com.jme3.renderer.Camera и com.jme3.renderer.ViewPort. Вы можете получить полный образец кода здесь: TestMultiViews.java

Как изменить размер и положение ViewPorts

По умолчанию viewPort имеет размер как само окно. Если у вас их несколько, они должны быть разных размеров, либо перекрывающихся, либо смежных друг с другом. Как вы можете сообщить jME, какие из ViewPorts должны появляться там, где нужно на экране, и насколько они велики?

Представьте окно как прямоугольник 1.0f x 1.0f. Режим ViewPort для камеры по умолчанию

cam.setViewPort(0f, 1f, 0f, 1f);

Этот параметр позволяет ViewPort обрабатывать весь прямоугольник.

Четыре значения читаются в следующем порядке:

cam.setViewPort(x1,x2 , y1,y2);
  • Ось X слева направо
  • Оси Y снизу вверх

Вот несколько примеров:

cam1.setViewPort( 0.0f , 1.0f   ,   0.0f , 1.0f );
cam2.setViewPort( 0.5f , 1.0f   ,   0.0f , 0.5f );

Эти параметры viewport (в таком порядке) располагаются с лева-направо, и снизу вверх создавая тем самым прямоугольник обзора камеры на экране.

0.0 , 1.0       1.0 , 1.0
       +-----+-----+
       |cam1       |
       |           |
       |     +-----+
       |     |     |
       |     |cam2 |
       +-----+-----+
0.0 , 0.0       1.0 , 0.0

Пример: прямоугольник Cam2 находится в правом нижнем углу: он располагается от середины (x1 = 0,5f) снизу (y1 = 0,0f), и с права (x2 = 1,0f) и середины (y2 = 0,5f)

Если вы масштабируете обзора камеры таким образом, чтобы соотношение сторон ViewPort отличалось от соотношения сторон окна, то ViewPort выглядит искаженным. В этих случаях вы должны воссоздать (не клонировать) объект Cam ViewPort с правильным соотношением сторон. Например: Camera cam5 = new Camera(100,100);

Четырехразмерный разделительный экран

В этом примере вы создаете четыре обзора камеры (2×2) с тем же соотношением сторон, что и окно, но каждый из них имеет только половину ширины и высоты.

Настройка первого обзора камеры

Вы используете предварительно сконфигурированную камеру cam и viewPort из SimpleApplication для первого обзора камеры. Это в правом нижнем углу.

cam.setViewPort(.5f, 1f, 0f, 0.5f); // Измените размер viewPort на половину его размера, располагается снизу справа.

По желанию, можете поместить основную камеру в сцену и поверните ее в исходное положение.

cam.setLocation(new Vector3f(3.32f, 4.48f, 4.28f));
cam.setRotation(new Quaternion (-0.07f, 0.92f, -0.25f, -0.27f));

Настроить еще три вида

Вот схема, как вы создаете три других cam и viewPorts (полный образец кода здесь.) В фрагменте кода cam_n стоит для cam_2 — cam_4, соответственно, то же самое для view_n.

  1. Клонировать первый cam, чтобы повторно использовать его настройки
  2. Измените размер и расположение viewPort камеры с помощью setViewPort().
  3. (Необязательно) Переместите камеры в сцене и поверните их так, чтобы они смотрели на то, что вы хотите видеть.
  4. Создайте ViewPort для каждой камеры
  5. Сбросить статус включенной камеры
  6. Прикрепите узел, который будет отображаться на этом ViewPort. + Камера конечно не обязана смотреть на rootNode, но обычно делают что бы смотрела.

Вот пример абстрактного кода для камеры n:

Camera cam_n    = cam.clone();
cam_n.setViewPort(...); // изменить размер viewPort
cam_n.setLocation(new Vector3f(...));
cam_n.setRotation(new Quaternion(...));

ViewPort view_n = renderManager.createMainView("View of camera #n", cam_n);
view_n.setClearEnabled(true);
view_n.attachScene(rootNode);
view_n.setBackgroundColor(ColorRGBA.Black);

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

0.0 , 1.0       1.0 , 1.0
       +-----+-----+
       |     |     |
       |cam3 |cam4 |
       +-----------+
       |     |     |
       |cam2 |cam1 |
       +-----+-----+
0.0 , 0.0       1.0 , 0.0

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

cam1.setViewPort( 0.5f , 1.0f  ,  0.0f , 0.5f);
...
cam2.setViewPort( 0.0f , 0.5f  ,  0.0f , 0.5f);
...
cam3.setViewPort( 0.0f , 0.5f  ,  0.5f , 1.0f);
...
cam4.setViewPort( 0.5f , 1.0f  ,  0.5f , 1.0f);

Изображение в изображении

Следующий фрагмент кода устанавливает два обзора камер, один охватывает весь экран, а второй — небольшой участок в верху в центре.

       +-----+-----+
       |   |cam|   |
       |   | 2 |   |
       +   +---+   +
       |           |
       |    cam    |
       +-----+-----+
// Настройка первого полноэкранного обзора камеры
cam.setViewPort(0f, 1f, 0f, 1f);
cam.setLocation(new Vector3f(3.32f, 4.48f, 4.28f));
cam.setRotation(new Quaternion(-0.07f, 0.92f, -0.25f, -0.27f));

// Настройка второго, меньшего PiP обзора камеры
Camera cam2 = cam.clone();
cam2.setViewPort(.4f, .6f, 0.8f, 1f);
cam2.setLocation(new Vector3f(-0.10f, 1.57f, 4.81f));
cam2.setRotation(new Quaternion(0.00f, 0.99f, -0.04f, 0.02f));
ViewPort viewPort2 = renderManager.createMainView("PiP", cam2);
viewPort2.setClearFlags(true, true, true);
viewPort2.attachScene(rootNode);

Настройки ViewPort

Вы можете индивидуально настроить камеру и viewPort для каждого обзора камеры. Например, каждый обзора камер может иметь другой цвет фона:

viewPort.setBackgroundColor(ColorRGBA.Blue);

У вас есть полный контроль, позволяющий определять, какие узлы могут видеть камеры! Они могут видеть полный rootNode …

viewPort1.attachScene(rootNode);

… или вы можете дать каждой камере специальный узел, содержимое которого она может видеть:

viewPort2.attachScene(spookyGhostDetectorNode);

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

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

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