使用英特尔® NUC 在虚拟现实中参加真实的卡丁车比赛

Go kart track

Master of Shapes 是一家以设计为主的交互工作室,由创意人员、游戏玩家、总监和技术人员组成。我们与英特尔合作,使用搭载 AMD* Radeon* RX Vega GPU 和英特尔® 酷睿™ i7 处理器的英特尔® NUC 原型创造了一种独特的颠覆性虚拟现实 (VR) 体验。

我们还与另一位客户合作,创建了一条史无前例的虚拟赛道。现实中处于相邻赛道的两位专业车手,得以于虚拟世界中同一赛道上竞技,从而对技术功能进行测试。这是一次令人振奋的经历,因为车手们必须躲避火焰、巨石、悬崖、落石,并避免撞到对手,才能到达终点。之后,全新英特尔 NUC 激励我们团队进行了更大的创新。

我们曾经使用大型 PC 服务器支持之前的项目。对于这个项目,我们希望提高技术的效率,以便针对更小、驾驶起来更轻松的车辆扩展这一项目。Master of Shapes 中的许多人都是玩《马里奥赛车*》长大的,希望为这个我们童年最喜欢的视频游戏创建一个成人版。我们采用小型英特尔 NUC 和强大的 GPU 创建 VR 卡丁车,用户可以在虚拟世界中驾驶真实的卡丁车与时间赛跑。

Driver on a go kart
图 1.通过 VR 在 K1 Speed 室内卡丁车赛道上驾驶卡丁车。

驶上正确的赛道

我们联系了 K1 Speed 室内卡丁车专家,询问是否可以购买他们的高性能电动卡丁车。不久,我们受邀前往他们位于加州托伦斯占地 40,000 平方英尺的工厂,在这里建造和测试我们的作品。

Real life track used for the game
图 2.我们使用激光雷达复制的赛道。

准确表示真实的赛道对在 VR 中驾驶至关重要。为此,我们使用激光雷达扫描。这种遥感技术与雷达类似,利用激光的脉冲光波收集测量数据。这些可以用来创建对象和环境中的 3D 模型和地图。我们使用的是 Faro* Focus3D X 130 激光雷达扫描仪。

在 K1 Speed 场馆,我们从 8 个有利位置扫描了 190 x 160 英尺的赛道,以确保完全覆盖。一开始采用空间的点云表示形式。

Data points assigned to track
图 3.一组称为点云的数据点表示赛道。

我们使用 Faro Scene 将点云导出至 Unreal* Engine。

Track as a mesh object
图 4.Unreal Engine 中的网状激光雷达扫描。

运动捕捉

准确扫描比赛环境后,我们需要实时映射卡丁车的位置,以将其位置转化到虚拟世界中。

我们使用 Toronto-based BlackTrax 的红外 (IR) 运动捕捉解决方案。我们小心地将摄像头放置在赛道周围并进行校准。摄像头的信息将从 BlackTrax 服务器传输至每辆卡丁车上的电脑,为车手渲染虚拟环境。

下一步是将红外信标连接到卡丁车上。BlackTrax 信标是一根长绳,顶端装有传感器。我们的目标是让它们在镜头前清晰可见。(为了实现无缝覆盖,两个摄像头需要随时看到安装在卡丁车上的信标。)我们使用计算机辅助设计 (CAD) 模型和 3D 打印的自定义安装,将它们安装在卡丁车顶部。这样可以提供畅通无阻的视野,而且使得安装非常稳定,以减少震动和误差。

摄像头和信标支持我们将卡丁车的位置上传至 Unreal Engine。位置数据即时发送到耳机,所以 VR 中卡丁车的移动反映了真实情况。我们以每秒 100 帧 (fps) 的速度跟踪卡丁车的运动,以便最精确地标识真实赛道的曲线和尺寸。

 

BlackTrax motion capture system
图 5.BlackTrax 运动捕捉系统。

BlackTrax transponder  and beacon
图 6.BlackTrax 转发器(顶部)和信标(底部)。

Mount system
图 7.自定义安装 BlackTrax 信标。这些都连接到卡丁车的框架上,以及车手背后的电子组装模块上。

为卡丁车安装英特尔® NUC

我们制作了一个木制的外壳和金属支架,以将英特尔 NUC 安装到卡丁车后面。我们还创建了一款定制传感器解决方案,以检测卡丁车的转向角度和速度。传感器馈送至微控制器,微控制器负责处理器这些数据并将其发送至 Unreal Engine,以支持游戏和屏幕显示。我们设计并 3D 打印了一个支架和滑轮系统,以跟踪转向柱的转动。

 

bracket and pulley system
图 8.用于检测转向角度和速度的支架和滑轮系统,CAD 设计形式(左)和成品(右)。

Design to prototype
Design to prototype
图9.从制图板到原型。CAD 形式的英特尔 NUC 机箱(左上)。映射到卡丁车座椅背面(右上)。安装机箱的框架(左下)。英特尔 NUC 组装完毕并通过 3D 打印的减震支架(右下)固定好。

Intel NUC mount
图 10.安装在卡丁车上的英特尔 NUC。它的木制机箱漆成黑色。

为平台供电

我们需要通过在 48 伏 (V) 下运行的电动卡丁车为 Oculus* Rift VR 耳机、定制 Arduino* 传感器套件和英特尔 NUC 供电。我们将 48V 分成若干部分 — 为各组件供电 — 并为英特尔 NUC 配备一个内嵌式保险丝,以防止其受到电流峰值的影响。

48 volt system
图 11:48 伏系统。

创建游戏

硬件确立后,我们的下一步是创建游戏。受《银翼杀手》的启发,我们使用 20 世纪 80 年代的合成音轨,摩天大楼、火焰屏障、激光和残骸,布置在东京充满未来主义色彩的赛道上。为了传输用户,我们使用大胆的红色灯光,以蓝色路灯引导赛车穿过黑暗,同时也照亮高层建筑的窗户。大气中还加入了粒子效应、火焰和烟雾。

In-game, urban Tokyo style background
图 12.游戏内优化的建筑物和粒子效果镜头。

我们使用 Unreal Engine 插件 Houdini Engine* (3D 动画和特效应用)创建霓虹灯。Houdini Engine 将输入的文本转换为 3D 紫外线光照贴图。这样一来,输入各种日语词填充符号,便可实现快速变化,也不必在 Houdini Engine 和 Unreal Engine 之间进行来回切换。

Houdini Engine with Unreal Engine
图 13.Unreal Engine 内部的 Houdini Engine sign-creator 工具。

In-game aerial view of race track
图 14.显示真实和数字赛道合并的鸟瞰图。

在构建期间,优化多边形计数是首要任务。VR 对 PC 的性能提出了要求,而保持 90 fps 对驾驶体验至关重要。

内置 Unreal Engine CPU 状态控制台命令意味着我们可以轻松地进行调试和优化。多核处理器确保我们不会受到 CPU 限制,而且 AMD GPU 表现良好。

我们需要使用应用编程接口 (API) Vulkan* 防止 VR 中出现伪影(视觉异常)和故障。Vulkan 还可帮助 Unreal Engine 实现 40% 的性能提升,因此这个工具非常好用。如欲了解更多关于如何借助 Vulkan 进行优化的信息,请查看幻灯片演示 (PPT)

UI of settings
图 15.项目设置窗口,Vulkan* Desktop 已检查。

我们想要在游戏中加入数字启动,以表达对《马里奥赛车*》的敬意,而卡丁车的一个关键功能就是支持这种启动。所有 K1 卡丁车都配备了替代控制装置,可以手动接管卡丁车功能,以防车手因某种原因失控或违反赛道规则。具体来说,每辆卡丁车都有一个独立的遥控器,可以与卡丁车内置的速度控制和刹车系统通信。我们解码和捕获远程控制信号,通过与内置系统通信的自定义发射器重新广播,以此逆向设计了替代控制系统。通过这个过程,我们支持玩家实时对卡丁车的启动、瞬间加速赛车或者瞬间停车做出反应,就像《马里奥赛车》中因障碍或对手突然加速,而造成赛车损坏或减速的赛车手。

这些实时功能是 VR 卡丁车最具创新性、最重要的方面。在现实世界中转动方向盘时,您可以看到它在虚拟世界中转动。我们想让所有东西同步。这对我们来说很重要,因为我们品牌的主要任务是创造令人难忘、身临其境的体验。

In-game power up station
图 16.游戏界面中的《马里奥赛车*》式启动。

保持准确赛道

设计环境并创建资产后,我们开始编程处理卡丁车跟踪和传感器数据的逻辑。主服务器广播卡丁车的所有可能位置,并与光学跟踪解决方案系统通信。主服务器能够启动游戏和停止卡丁车。

Diagram
图 17.VR 卡丁车的服务器-客户端结构。

为了设置上文所示的服务器客户端结构,我们在 Unreal Engine 中创建了一款多人游戏。

(如果您从未创建过多人游戏,建议您阅读   Blueprint Multiplayer Shootout Game 教程。A good understanding of blueprint replication, and how it works inside Unreal Engine 4, is also useful.)

我们的第一步包括发送位置数据到玩家的耳机,让他们知道他们在赛道上的位置。我们还必须确保驱动程序和服务器同时启动。

我们在服务器计算机上创建并托管了一个会话:

UI for game
图 18.服务器上的托管会话。

我们的客户端是这样加入的:

UI for game
图 19.在客户端上加入会话。

管理(服务器)托管游戏。vrPawn 和 ID 编号在服务器中生成后分配给玩家。

我们设置了比赛计时器,可从服务器复制到客户端。当管理员和其他玩家在游戏中时计时开始。每场比赛都可以从控制赛车和游戏的中心位置进行监控,同时监控和维护系统。

开始调用发生在 GameStateBase 中。时间更新发生在 GameModeBase

UI for game
图 20.计时器跨服务器和客户端实现同步。

我们在玩家控制器中有一个覆盖,如果玩家不小心断开服务器连接,覆盖可以保存 pawn。

为此,我们制作了一个 C++ 玩家控制器。

Game logic diagram
图 21.后期登录设置玩家 ID。

#include "PlayerControllerCpp.h" 
#include "Runtime/Engine/Classes/GameFramework/Pawn.h"

void APlayerControllerCpp::PawnLeavingGame_Implementation() 
{
	if (GetPawn()!= NULL & DestroyActorThenUnpossess) 
	{
	
	GetPawn ()->Destroy();
	 SetPawn(NULL);
	 
	}
} 

覆盖玩家控制器类,以便玩家意外断开服务器连接时可以保存 pawn。

卡丁车传感器数据

卡丁车连接的传感器由 Arduino 读取,Arduino 是一款开源原型平台,可以让用户创建交互式电子对象。Arduino 命令由 Python* 解析,并通过用户数据报协议 (UDP) 发送到 Unreal Engine。我们使用这种插槽插件

我们针对事件“Begin Play”对英特尔 NUC 上的 UDP 连接进行了初始化。

这些消息被解析成数值,以便在 Unreal Engine 中驱动数据。我们在方向盘上安装了一个测量电动势的电位计。用户转动真实的方向盘时,我们将其映射到虚拟世界中,以此增加体验的沉浸感,并让玩家感觉自己同时控制着数字卡丁车和物理卡丁车。服务器通过来自跟踪摄像头的信息,处理赛道上所有卡丁车的位置,还可以与卡丁车进行实时沟通。

挑战

我们面临的主要挑战之一是时间。通常,如此规模和复杂的项目需要长达 4 个月的时间。但我们只有一半的时间,因此,我们在编程虚拟世界时变得更有创造力。

在游戏引擎中构建环境时,通常需要沿着用户的路径手动放置条目。我们没有时间一件件地建设世界。相反,我们使用 Houdini Engine 沿着赛道开发了一个脊柱系统。我们可以用建筑物、墙壁、火焰等条目快速填充系统。我们可以不用编码环境的每个部分,而用不同的 3D 网格填充脊柱,从而轻松变换界面,创建一个完全不同的赛道。这对我们来说是一种全新的方法,它已经成为面向未来的工具。

该项目解决了 VR 体验的主要问题之一:使用固定 VR 时,用户很容易感到眩晕。如果您看到自己在 VR 中移动,但在现实生活中感觉不到自己在移动,就很容易感到不舒服。现在,随着用户加速驾驶,他们可以看到感觉到自己的移动。

另一个成功之处是我们可以每次创造不一样的体验。用户可以选择不同的卡丁车风格,甚至还可以在自己选择的自定义世界中驾驶。目前,该项目支持一位玩家进行游戏,但后期完全可扩展至多人游戏,因此我们对未来的实施感到兴奋。

请观看 VR Go Karts 视频,欣赏最终的体验。

player in a go-kart
图 23.移动中的 VR。玩 VR 卡丁车的玩家。

结论

英特尔技术将继续支持前沿开发人员,支持他们树立远大理想,实现远大愿景。这个项目的核心是英特尔 NUC,它很好地证明了我们在意想不到的领域也能完成创新项目。它是一款强大的 4x4 英寸迷你 PC,具有出色的娱乐、游戏和办公功能,包含一个可按照您的期望容纳内存、存储和操作系统的定制主板。无论是将配置齐全、随时可用的迷你 PC 电脑改装成工具包,还是以真正的 diy 模式围绕主板构建,用户每天都在突破边界,探索新的想法和创意。如欲更多地了解英特尔 NUC 以及它如何帮助您克服下一个挑战,请访问 英特尔® NUC 网站。

作者

Adam Amaral 是 Master of Shapes 的创始人、CEO 和创意技术专家。他不断努力走出舒适区,创造的作品获奖无数,同时也积累了广泛的专业知识。如果 Adam 没有驯服野牛,或开发机器人,他会忙着为 Miley Cyrus 设计巡回演唱会、或制作备受赞誉的商业内容和互动装置。最近,他一直在打造创新的 VR/AR 体验,并使用新技术,尝试进入外太空。

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