展示群集行为的群体模拟与 Windows* Mixed Reality:第 1 部分

scene interface

简介

借助 Unity* 软件游戏引擎实施人工智能以及在群体模拟中展示突现行为是创建模拟的最佳方式之一。在本文中,我们将逐步介绍如何在 Unity 软件中创建群体模拟,然后将其实施为混合现实应用。

我们将执行以下步骤:

  1. 借助 Unity 软件实施人工智能。
  2. 在 Unity 软件中构建群体模拟。
  3. 创建项目的混合现实构建。

系统要求

在本项目中,我们使用了以下配置:

  • 标准华硕 ROG* 笔记本电脑
  • 第四代智能英特尔® 酷睿 i7 处理器
  • 8 GB RAM
  • Windows® 10 企业版

群体模拟

在本文中,我们将讨论被称作群体模拟的行为,并在 Unity 软件中创建该行为。定义实施群体人工智能 (AI) 所需行为的对象被称为代理 (agent)。在本示例中,我们关注的是大规模的代理,而非单个代理。我们首先介绍群体模拟引发的不同行为,如运动、碰撞、成员间的速度传播,这为群体提供了自己的特性。

模拟群体中所有个体并生成群体行为是一项劳动密集型工作,要求群体内的个体和对象制定大量决策,使用简单矢量方法实施的行为为决策提供了依据。

人们采用了多种方法来设计群体行为。群体不会无序地移动,而是具有肉眼无法立即察觉的条理性。它们是自组织系统,在它们的运动方向上会出现流线。

群体越密集,发生动荡的可能性就越高。实施 Reynolds 的群集算法是模拟群体行为最简单的方法之一。

1986 年,Craig Reynolds 创建了模拟模型,该模型能生成类似于鸟群与鱼群的行为。模拟模型发明了名为 boid 的生物群体。

在多数情况下,我们认为 boid 采取突现行为。

Reynolds 的算法基于模拟 boid 的 3 个简单转向行为。

  • 分离:转向以避开附近拥挤的 boid。
  • 聚集:转向以移动至附近其他 boid 的平均位置。
  • 队列:转向附近其他 boid 的平均航向。

我们将利用导航网格(navmesh)和投影在 Unity 软件中实施与整合这些行为,以创造所需的效果。

入门

首先,我们将利用 Unity 软件集成开发环境 (IDE) 来实施对象的人工智能行为,并展示突现行为的工作原理。然后,我们将项目构建转换为混合现实应用,并了解如何创建混合现实 Windows® 10 通用 Windows 平台 (UWP)。

第 1 步:创建项目

第 1 步,我们需要在 Unity 软件中打开一个项目,然后从创建项目要求入手。

第 2 步:声明场景中的对象

接下来,在 Unity 软件中创建一个场景,场景包含需要使用的对象。本项目将使用 3D 对象。

第 3 步:在 Unity 软件中创建人工智能行为

在该步骤,我们在 Unity 软件中创建一个复制群体模拟的场景要求。在该场景中,群体模拟的基本单位是一个红色代理和一个蓝色代理。一旦对象具备从一个地方移动到另一个地方的能力,这两个代理将复制群体行为。

第 4 步:面向混合现实设置我们的 PC

接下来,设置电脑上的 Windows 10 混合现实应用,以便您在没有配戴混合现实头显的情况下,体验仅次于头显的模拟混合现实环境。

第 5 步:构建场景并将其转换为混合现实应用

在该步骤,我们将创建一个场景,然后使用 IL2CPP* 脚本在后端创建一个场景构建,用作运行应用的 Windows Mixed Reality 应用。某些中间步骤也非常重要,需要引起我们的注意,如使用合适的设置转换构建,进而针对 Windows 10 UWP 优化项目。创建项目构建时,我们需要选择 IL2CPP 后端,以优化模拟环境的大小和运行速度。生成项目构建将创建一个 Microsoft Visual Studio* 解决方案文件,本文对该文件的结构进行了介绍。最后生成本地构建,这样它可以以 Windows 10 混合现实应用的形式出色地运行。

在 Unity* 软件 IDE 中创建项目并在场景中声明对象

为了着手生成场景,首先创建一个新项目。

首先,打开 Unity 软件 IDE。接下来创建一个新项目并将其命名为“New Unity Project (5)”。

create project dialog

图 1.创建一个名为 New Unity Project (5) 的新项目。

将场景保存为 scene2

save dialog

图 2.将场景保存为“scene2”。

接下来,将游戏对象添加至场景中。

首先添加一个平面,然后根据需要延伸平面。然后添加一个新的立方体 3D 对象,后者将被用作墙。

unity software interface

图 3.在场景中添加一个平面和第一个 3D 立方体。

添加两个立方体后,根据需要对它们进行调整。

unity software interface

图 4.延伸立方体以创建墙。

重新命名立方体,并添加颜色,使它们看起来更明显。为此,我们需要声明一个新材料。

为墙添加颜色后,场景类似于下图。

unity software interface

图 5.为墙添加颜色。

接下来添加用于识别代理的胶囊体。我们将胶囊体的尺寸缩小至 0.5 和 0.5,并分别将它们重命名为红色代理与蓝色代理。

接下来创建材料并添加红、蓝两种颜色。我们需要创建两个立方体,用作红、蓝代理的目标点。添加立方体与胶囊体后,场景应如下所示。

unity software interface

图 6.添加红色与蓝色代理。

我们需要将立方体重命名为 redGoalblueGoal

接下来需要在红色和蓝色代理中添加导航网格。为此,点击 add component 和默认 navmesh。

unity software interface

图 7.在红色和蓝色代理中添加“导航网格”。

然后创建一个名为“AIController.cs”的 C# 脚本。我们来看一下默认脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AIController : MonoBehavior {

    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update () {

    }
}

添加所需的值后,脚本变为:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;

public class AIController : MonoBehavior {
    public GameObject goal;
    NavMeshAgent agent;



    // Use this for initialization
    void Start () {
        agent = this.GetComponent<NavMeshAgent> ();
        agent.SetDestination (goal.transform.position);

    }

    // Update is called once per frame
    void Update () {

    }
}

接下来,将脚本添加至红色代理和蓝色代理。两个胶囊体的目标截然相反。

创建面向人工智能的行为

为导航网格设置导航

为了将适当的行为应用于代理,我们需要调整一些设置。

添加自定义选项卡

如欲添加导航选项卡和 Inspector 面板与服务,前往 Windows 选项卡并选择 Navigation

然后,我们需要将场景中的某些对象命名为 navigation static。为此,选择特定对象,即平面与墙。

设置完成后,我们需要前往 Bake 选项卡并点击 Bake

需要进一步调整人工智能脚本。如蓝色与红色代理附加的人工智能脚本所示,我们需要选择一个目标。

AI controller script setting

图 8.为红色与蓝色代理选择一个目标。

接下来同时选择红色与蓝色代理的目标,然后播放场景。只需复制代理 (control + B),便可产生更多代理,最终创建一个群体模拟。

在键盘上按十次 control + D 便可选择红色代理,然后采用相同的方法选择蓝色代理。

构建混合现实

我们使用 Unity 4.2 进行开发。为了创建混合现实构建,我们需要做一些改变。

Windows Mixed Reality

Windows Mixed Reality 是一款将增强现实与头盔显示器效果结合在一起的混合现实平台,可提供独一无二的体验。混合现实应用是一款在头盔显示器上运行的 Windows 10 UWP 应用。

自 2018 年 4 月 Windows 10 创意者更新以来,混合现实平台便一直存在,它是开发混合现实所必需的。

所需的工具

使用混合现实头显需要做大量的准备工作,因为需要安装许多软件,包括:

Microsoft Visual Studio 2017

如需安装,请选择 Universal Windows PlatformGame Development with Unity 软件选项。请确保已启用 hyper-v,并且使用 Unity 2017.4 版 Unity 软件。

由于我们需要在安装 Microsoft Visual Studio 2017 时安装 IL2CPP 后端,请选择 Desktop Development with C++ 选项。

设置面向混合现实的项目

首先,访问构建设置,然后选择 Universal Windows Platform

目标设备(Target Device):请选择 Any deviceHoloLens*。

target device setting

图 9.在通用 Windows* 平台构建设置中选择 Any device

我们需要保留的设置是:

构建类型 -> Direct3D*

SDK -> 安装最新版

Microsoft Visual Studio 版本 -> 安装最新版

构建并运行于 -> 本地机器

由于我们正开发一款提供沉浸式视图(而非普通 2D 或 3D 视图)的沉浸式混合现实应用,我们需要启用虚拟现实。以下是启用步骤。

首先,确保您在通用 Windows 平台上。访问 Build Settings,然后依次选择 Player SettingsXR Settings

在 XR 设置中,确保支持虚拟现实和 Windows Mixed Reality。

xr settings

图 10.配置 Windows* Mixed Reality 以启用虚拟现实设置。

接下来访问发布设置,并在软件包选项中添加名称。

Package name ->Abhishek nandy

packaging settings

图 11.命名软件包以准备发布。

在功能选项中设置沉浸式高质量头显空间知觉网络摄像头麦克风

capabilities settings

图 12.配置项目支持的功能。

在 Unity 软件摄像头设置中,将 RGBA 设置为 0

color picker

图 13.选择 Unity* 软件摄像头设置,将 RGBA 设置为 0

接下来通过这种方式编译场景:

添加所需的场景。在本示例中为 “scene3”,然后点击 Build。创建最终的本地文件前,我们需要设置几个 Windows 选项,然后点击 Update & Security

update and security setting

图 14.配置 Windows* 设置中的更新与安全性。

在左侧,我们需要选择 For developers 选项。

windows update dialog

图 15.配置“For developers”选项。

务必选中 Developer mode 并安装开发人员模式软件包。

developer mode setting

图 16.选择 Developer mode 以启用高级开发特性。

在搜索字段中输入 mixed reality portal

mixed reality portal setting

图 17.将“Mixed Reality Portal”添加至构建选项。

选择 Mixed Reality Portal 后,您将看到 Get Started 按钮。点击该按钮。

welcome screen

图 18.Windows* Mixed Reality 开始界面。

在这里,您将看到您需要接受的条款与条件。

setup dialog

图 19.同意服务条款和安全警告。

下一页显示 PC 的系统配置,以便查看您是否符合标准。点击 Simulated 选项。

点击 Next 后,会出现显示您已完成 Windows Mixed Reality 设置的选项。

welcome to windows mixed reality

图 20.Windows* Mixed Reality 欢迎界面。

选择 Set up simulation (for developers)。

set up simulation screen

图 21.设置 Windows* Mixed Reality 的桌面模拟。

随后下载面向 Mixed Reality 的其他内容。

download dialog

图 22.下载面向 Windows* Mixed Reality 的其他内容。

构建 Windows® 10 UWP 和 Mixed Reality

依次点击 file和 Unity 软件中的 build settings\,然后访问通用 Windows 平台上的玩家设置。在配置窗格中,您可以选择 .NET 内核或 IL2CPP。选择 IL2CPP(中级 C++)。

configuration settings

图 23.设置 IL2CPP* 的脚本后端选项。

接下来选择场景;在本示例中为 Scene 2,然后点击 Build

scenes in build settings

图 24.准备构建 Scene2。

在电脑上选择一个用于存储文件的文件夹。按照所有可能的构建顺序生成了 Microsoft Visual Studio 解决方案文件。

由于我们将该项目命名为 New Unity Project (5),生成的解决方案文件名称为“New Unity Project (5).soln”。

project select dialog

图 25.新解决方案文件采用了 Unity* 软件项目的名称。

深入探讨解决方案文件前,我们需要更好地了解 IL2CPP。

什么是 IL2CPP*?

如果您想使用 .NET 的替代选项来编译 UWP,IL2CPP 是最佳选择。

构建面向 UWP 的 Unity 软件项目时,Unity 软件将 IL(中级)代码和不同汇编代码转换为 C++,然后创建原生库。创建的原生二进制文件为 .exe、.apk 和 .xap。

对于 Unity 软件游戏引擎,项目或游戏输出可能更大;为了减小游戏的尺寸,我们使用 IL2CPP。

我们借助 IL2CPP 将 Unity 脚本 API 代码转换为托管汇编代码。

利用名为 unused bytecode stripper 的 Unity 软件工具处理与 IL2CPP 一起使用的其他插件和库,该工具定位所有未使用的类和方法,并将它们从 DLL 中删除。然后将所有托管汇编代码转换为标准 C++ 代码。

然后使用原生平台编译器编译为 C++ 和 IL2CPP 运行时部分生成的代码,如下图所示。

flowchart

图 26.转换 C++ 代码和编译原生二进制文件的流程图。

Microsoft Visual Studio* 解决方案文件

我们返回来继续介绍 Microsoft Visual Studio 解决方案文件。首先,我们来看一下重要的头文件:

the app.h files and #pragma once

namespace New_Unity_Project__5_
{
    ref class App sealed :
        public Windows::ApplicationModel::Core::IFrameworkView,
        public Windows::ApplicationModel::Core::IFrameworkViewSource
    {
    public:
        virtual void Initialize(Windows::ApplicationModel::Core::CoreApplicationView^ applicationView);
        virtual void SetWindow(Windows::UI::Core::CoreWindow^ window);
        virtual void Load(Platform::String^ entryPoint);
        virtual void Run();
        virtual void Uninitialize();

        virtual Windows::ApplicationModel::Core::IFrameworkView^ CreateView();

    private:
        UnityPlayer::AppCallbacks^ m_AppCallbacks;
        Windows::UI::Core::CoreWindow^ m_CoreWindow;
        void OnActivated(Windows::ApplicationModel::Core::CoreApplicationView^ sender, Windows::ApplicationModel::Activation::IActivatedEventArgs^ args);
        void SetupOrientation();
    };
}

在 main.cpp 中,初始化将 C# 代码转换为 C++ 的包装程序。

#include "pch.h"
#include "App.h"

struct RoInitializeWrapper
{
    inline RoInitializeWrapper() { RoInitialize(RO_INIT_MULTITHREADED); }
    inline ~RoInitializeWrapper() { RoUninitialize(); }
};

int CALLBACK wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow)
{
    RoInitializeWrapper roInit;

    Windows::ApplicationModel::Core::CoreApplication::Run(ref new New_Unity_Project__5_::App());
    return 0;
}

从类封装的 app.h 文件中获得应用的核心功能,然后初始化 Unity 软件框架。自动创建这些文件。

标头 pch.h is 用于标准系统文件,这些文件将在项目中使用。

#pragma once
#include <roapi.h>
#include <Windows.h>
The generated app.cpp file contains all the handlers and main capabilities to run the app in the Windows UWP environment.The generated code is shown below:
#include "pch.h"
#include "App.h"
#include "UnityGenerated.h"

using namespace New_Unity_Project__5_;
using namespace Platform;
using namespace UnityPlayer;
using namespace Windows::ApplicationModel::Activation;
using namespace Windows::ApplicationModel::Core;
using namespace Windows::Foundation;
using namespace Windows::UI::Core;
using namespace Windows::UI::ViewManagement;

void App::Initialize(CoreApplicationView^ applicationView)
{
    SetupOrientation();
    m_AppCallbacks = ref new AppCallbacks();
    m_AppCallbacks->SetCoreApplicationViewEvents(applicationView);
    applicationView->Activated += ref new TypedEventHandler<CoreApplicationView ^, IActivatedEventArgs^>(this, &App::OnActivated);
}

void App::SetWindow(CoreWindow^ window)
{
    m_CoreWindow = window;

    ApplicationView::GetForCurrentView()->SuppressSystemOverlays = true;

    m_AppCallbacks->SetCoreWindowEvents(window);
    m_AppCallbacks->InitializeD3DWindow();
}

void App::Load(String^ entryPoint)
{
}

void App::Run()
{
    m_AppCallbacks->Run();
}

void App::Uninitialize()
{
    m_AppCallbacks = nullptr;
}

IFrameworkView^ App::CreateView()
{
    return this;
}

void App::OnActivated(CoreApplicationView^ sender, IActivatedEventArgs^ args)
{
    m_CoreWindow->Activate();
}

void App::SetupOrientation()
{
    Unity::SetupDisplay();
}

接下来对解决方案文件进行编译,然后便可构建面向 Windows Mixed Reality 的应用。对于 Microsoft Visual Studio,我们需要选择本地运行,然后双击部署的项目。它会在混合现实平台上运行,包含选定的模拟选项。

mixed reality portal screen

图 27.运行已完成的模拟项目。

总结

我们使用 Unity 软件游戏引擎创建了该项目,并掌握了如何创建展示群集突现行为的群体模拟。在这个过程中,我们创建了面向 Windows 的成熟的混合现实应用。

有关编译器优化的更完整信息,请参阅优化通知