Учебное руководство: Использование технологии Intel® RealSense™ в Unreal Engine* 3. Часть 2

Download PDF 854 KB

GoTutorial: Использование технологии Intel® RealSense™ в Unreal Engine* 3. Часть 1 

В первой части мы создали простую карту игры со структурой костей лица в редакторе Unreal 3. Здесь, во второй части, мы покажем, как использовать возможности Intel RealSense SDK в игре на движке Unreal.

Настройка Visual Studio 2010 для образца игры

Приведенные ниже действия настраивают ваш файл карты в качестве карты по умолчанию для примера игры путем редактирования файла INI.

  1. Перейдите в папку \ExmapleGame\Config.
  2. Откройте файл DefaultEngine.ini и отредактируйте его, как показано ниже.

[URL]

MapExt=umap

Map=test.umap

LocalMap=BLrealsense_Map.umap

TransitionMap=BLrealsense_Map.umap

EXEName=ExampleGame.exe

DebugEXEName=DEBUG-ExampleGame.exe

GameName=Example Game

GameNameShort=EG

  1. Откройте файл ExampleEngine.ini и отредактируйте его, как показано ниже.

    [URL]

    Protocol=unreal

    Name=Player

    Map=test.umap

    LocalMap=BLrealsense_Map.umap

    LocalOptions=

    TransitionMap=BLrealsense_Map.umap

    MapExt=umap

    EXEName=ExampleGame.exe

    DebugEXEName=DEBUG-ExampleGame.exe

    SaveExt=usa

    Port=7777

    PeerPort=7778

    GameName=Example Game

    GameNameShort=EG

  2. Откройте файл проекта или решения UE3 Visual Studio в папке \Development\Src – UE3.sln либо откройте UE3.sln в Visual Studio.

    Рисунок 1. Microsoft Visual Studio* 2010.

  3. Соберите и запустите приложение, как описано ранее. Появится начальное окно Unreal и ваша игра.

Использование системы координат в Unreal Engine

Перед компоновкой с Intel® RealSense™ SDK важно понять систему координат в Unreal.

Положение отслеживается по осям X-Y-Z (см. классы Origin и RotOrigin в исходном коде UE3), а поворот — по эйлеровым углам (P-Y-R) и кватернионам (дополнительные сведения см. в статье https://en.wikipedia.org/wiki/Quaternion for more detail). 


Рисунок 2. Система координат

У кватерниона поворота вокруг поперечной оси — один скалярный множитель и три векторных множителя.

Для преобразования эйлеровых углов в кватернионы

Углы X-Y-Z

Автоматическое расширение установки отладчика в Visual Studio 2010 (необязательно)

Символы отладки массива структуры костей, расположения и поворота изначально были зашифрованы и не отображаются в Visual Studio в доступном для чтения виде. Для просмотра символов отладки выполните перечисленные ниже действия.

  1. Найдите файл Autoexp.dat.
     

    В Visual Studio под управлением 64-разрядной версии Windows 7 он находится в папке C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\Packages\Debugger.

  2. Найдите сценарий отладки и откройте его.
     

    Папка UE3\ Development/External/Visual Studio Debugging/AUTOEXP.DAT_addons.txt

  3. Скопируйте все разделы [AutoExpand] и [Visualizer] в файл Autoexp.dat.

Включение поддержки Intel® RealSense™ SDK в Unreal Engine 3

В этом разделе описываются изменения в Unreal Engine 3, связанные с Intel RealSense SDK. Эти изменения необходимо применить после установки Intel RealSense SDK и Depth Camera Manager. API отслеживания реперных точек на лице и положения головы в Intel RealSense SDK используются для обработки выражения лица и движения головы персонажа. Отслеживание положения головы осуществляется интуитивно, поскольку значения поворота вокруг продольной, поперечной и вертикальной осей можно использовать в Unreal Engine 3 без дополнительных изменений. Отслеживание реперных точек на лице выполняется несколько сложнее.


Рисунок 3. Повороты вокруг трех осей

Intel RealSense SDK предоставляет 76 отслеживаемых точек на лице. Для каждого выражения лица (например, для подмигивания или открытого рта) у соответствующих точек есть определенный диапазон значений. Например, если глаз закрыт, то расстояние между точками 12 и 16 будет близко к 0, а при открытом глазе это расстояние будет больше 0, причем оно будет различаться у разных людей.

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


Рисунок 4. Реперные точки на лице и их номера в Intel® RealSense™ SDK

<UE3> — папка, в которую установлен UE3. Необходимо изменить следующие четыре файла.

  • <UE3>\Development\Src\UnrealBuildTool\Configuration\UE3BuildConfiguration.cs
  • <UE3>\Development\Src\UnrealBuildTool\Configuration\UE3BuildWin32.cs
  • <UE3>\Development\Src\Engine\Inc\UnSkeletalMesh.h
  • <UE3>\Development\Src\Engine\Src\UnSkeletalComponent.cpp

UE3BuildConfiguration.cs (необязательно)

public static bool bRealSense = true;

Важные для RealSense коды заключены во фразу «#if USE_REALSENSE». Это предложение используется для определения фразы «#if USE_REALSENSE» в файле UE3BuildWin32.cs. Если изменить код, указав значение false, ссылка на соответствующий код RealSense не будет задействована при компиляции. Это необязательно.

UE3BuildWin32.cs

if (UE3BuildConfiguration.bRealSense)
{
SetupRealSenseEnvironment();
}
void SetupRealSenseEnvironment()
{
      GlobalCPPEnvironment.Definitions.Add("USE_REALSENSE=1");
      String platform = (Platform == UnrealTargetPlatform.Win64 ? "x64" : "Win32");

      GlobalCPPEnvironment.SystemIncludePaths.Add("$(RSSDK_DIR)/include");
      FinalLinkEnvironment.LibraryPaths.Add("$(RSSDK_DIR)/lib/" + platform);

      if (Configuration == UnrealTargetConfiguration.Debug) {
           FinalLinkEnvironment.AdditionalLibraries.Add("libpxc_d.lib");
      } else {
           FinalLinkEnvironment.AdditionalLibraries.Add("libpxc.lib");
      }
}

Определение USE_REALSENSE, которое будет использовано для включения или отключения Intel RealSense SDK в исходном коде (необязательно).

Поскольку Unreal Engine 3 работает на основе makefile, необходимо добавлять файл заголовка Intel RealSense SDK и путь к библиотеке в раздел include проекта и в путь к библиотекам.

UnSkeletalMesh.h

#if USE_REALSENSE
	PXCFaceData* faceOutput;
	PXCFaceConfiguration *faceConfig;
	PXCSenseManager *senseManager;

	void InitRealSense();
	void ReleaseRealSense();
#endif

Это часть объявления классов и функций Intel RealSense SDK. Фрагмент, отвечающий за работу со структурой костей, находится в разделе UpdateSkelPos() файла UnSkeletalComponent.cpp.

UnSkeletalComponent.cpp

#if USE_REALSENSE
	#include "pxcfacedata.h"
	#include "pxcfacemodule.h"
	#include "pxcfaceconfiguration.h"
	#include "pxcsensemanager.h"

	FLOAT rsEyeMin = 6;
	FLOAT rsEyeMax = 25;

	FLOAT rsMouthMin = 5;
	FLOAT rsMouthMax = 50;

	FLOAT rsMouthWMin = 40;
	FLOAT rsMouthWMax = 70;

	FLOAT chMouthMin = -105;
	FLOAT chMouthMax = -75;
……
#endif

Включите файлы заголовков Intel RealSense SDK. Определяет минимальные и максимальные значения пользователя и игровых персонажей. Начинается с rs (значение пользователя) или с ch (значение игрового персонажа). Эти значения должны изменяться в соответствии с внешним видом пользователя и игрового персонажа. Например, при моргании определяется расстояние при открытом и при закрытом глазе, и в соответствующей пропорции эти данные применяются к персонажу игры.

void USkeletalMeshComponent::Attach()
{
……
#if USE_REALSENSE
	senseManager = NULL;
	InitRealSense();
#endif

Функция Attach() вызывает функцию InitRealSense() для инициализации классов, относящихся к Intel RealSense SDK и настройки камеры.

#if USE_REALSENSE
void USkeletalMeshComponent::InitRealSense() {
	if (senseManager != NULL) return;

	faceOutput = NULL;

	senseManager = PXCSenseManager::CreateInstance();
	if (senseManager == NULL) 
	{
 // обнаружена ошибка
	}

	PXCSession *session = senseManager->QuerySession();
	PXCCaptureManager* captureManager = senseManager-> QueryCaptureManager();

Функция InitRealSense() указывает, какая камера будет использоваться, и создает соответствующие экземпляры классов для распознавания лиц.

void USkeletalMeshComponent::UpdateSkelPose( FLOAT DeltaTime, UBOOL bTickFaceFX )
{
……
#if USE_REALSENSE
if (senseManager->AcquireFrame(false) >= PXC_STATUS_NO_ERROR) {
	faceOutput->Update();
	int totalNumFaces = faceOutput->QueryNumberOfDetectedFaces();
	if (totalNumFaces > 0) {

Функция UpdateSkelPose() используется для отслеживания положения головы и реперных точек на лице.

// Голова
FVector v(yaw, roll, pitch);
			
LocalAtoms(6).SetRotation(FQuat::MakeFromEuler(v));
LocalAtoms(6).NormalizeRotation();

Отслеживание положения головы осуществляется интуитивно, поскольку значения поворота вокруг продольной, поперечной и вертикальной осей из Intel RealSense SDK можно использовать без каких-либо дополнительных изменений и вычислений.


Рисунок 5. Реперные точки на лице и номера, используемые при различных выражениях лица (мимика рта, открытые или закрытые глаза)

Для моргания используются реперные точки 12, 16 и 20, 24, а для мимики рта — 47, 51, 33, 39 (подробности реализации зависят от предпочтений разработчиков).

// Рот
FLOAT mouthOpen = points[51].image.y - points[47].image.y;
mouth = chMouthMax - (mouthOpen - rsMouthMin) * mouthRatio;

mouthOpen = points[47].image.x - points[33].image.x;
rMouthWOpen = chMouthWMin + (mouthOpen - rsMouthWMin) * mouthWRatio;
					
mouthOpen = points[39].image.x - points[47].image.x;
lMouthWOpen = chMouthWMin + (mouthOpen - rsMouthWMin) * mouthWRatio;
					
cMouth = chMouthCMax - (mouthOpen - rsMouthWMin) * mouthCRatio;
// Левый глаз
FLOAT eyeOpen = points[24].image.y - points[20].image.y;
lEyeInner = chEyeInnerMin + (eyeOpen - rsEyeMin) * innerEyeRatio;
lEyeOuter = chEyeOuterMin + (eyeOpen - rsEyeMin) * outerEyeRatio;
lEyeUpper = chEyeUpperMin + (eyeOpen - rsEyeMin) * upperEyeRatio;
// Правый глаз
eyeOpen = points[16].image.y - points[12].image.y;
rEyeInner = chEyeInnerMin + (eyeOpen - rsEyeMin) * innerEyeRatio;
rEyeOuter = chEyeOuterMin + (eyeOpen - rsEyeMin) * outerEyeRatio;
rEyeUpper = chEyeUpperMin + (eyeOpen - rsEyeMin) * upperEyeRatio;
rEyeLower = chEyeLowerMin + (eyeOpen - rsEyeMin) * lowerEyeRatio;

BN_Lips_Corner_R, BN_Lips_Corner_L, BN_Jaw_Dum используются для мимики рта, а BN_Blink_UpAdd, BN_Blink_Lower, BN_Blink_Inner, BN_Blink_Outer — для моргания. (Номера всех костей см. в разделе «Структура костей лица в примерах персонажей».)

// Рот
FVector m(90, 0, mouth);
LocalAtoms(59).SetRotation(FQuat::MakeFromEuler(m));

LocalAtoms(57).SetTranslation(FVector(mouthWXZ[2], rMouthWOpen, mouthWXZ[3])); // Правая сторона
LocalAtoms(58).SetTranslation(FVector(mouthWXZ[4], lMouthWOpen * -1, mouthWXZ[5])); // Левая сторона

// Левый глаз
LocalAtoms(40).SetTranslation(FVector(eyeXY[0], eyeXY[1], lEyeUpper)); // Верхняя часть
LocalAtoms(41).SetTranslation(FVector(eyeXY[2], eyeXY[3], lEyeLower)); // Нижняя часть
LocalAtoms(42).SetTranslation(FVector(eyeXY[4], eyeXY[5], lEyeInner)); // Внутренняя часть
LocalAtoms(43).SetTranslation(FVector(eyeXY[6], eyeXY[7], lEyeOuter)); // Внешняя часть

// Правый глаз
LocalAtoms(47).SetTranslation(FVector(eyeXY[8], eyeXY[9], rEyeLower)); // Нижняя часть
LocalAtoms(48).SetTranslation(FVector(eyeXY[10], eyeXY[11], rEyeOuter)); // Внешняя часть
LocalAtoms(49).SetTranslation(FVector(eyeXY[12], eyeXY[13], rEyeInner)); // Внутренняя часть
LocalAtoms(50).SetTranslation(FVector(eyeXY[14], eyeXY[15], rEyeUpper)); // Верхняя часть
void USkeletalMeshComponent::ReleaseRealSense() {
	if (faceOutput) 
		faceOutput->Release();

	faceConfig->Release();
	senseManager->Close(); 
	senseManager->Release();
}

Закройте и высвободите все экземпляры соответствующих классов Intel RealSense SDK.

Структура костей лица в примерах персонажей

В этом примере лицо состоит из 58 костей. На рисунке каждый прямоугольник соответствует одной кости. Ниже следует полный список наименований костей.


Рисунок 6. Наименования костей

Заключение

Чтобы создать аватар, способный двигаться и копировать выражения лица и мимику пользователя для расширения игровых возможностей с использованием UE3 и Intel RealSense SDK, необходимо использовать исходный код UE3, а разработчики должны знать, какой файл исходного кода следует изменить. Надеемся, этот документ поможет вам при создании аватаров в UE3 с помощью Intel RealSense SDK.

Об авторах

Чангйин Ким (Chunghyun Kim) — инженер по разработке приложений в отделе Intel Software and Services корпорации Intel. Он занимается оптимизацией игр и графики в архитектуре Intel®.

Питер Хонг (Peter Hong) — инженер по разработке приложений в отделе Intel Software and Services корпорации Intel. Его специализация — применение Intel RealSense SDK для отслеживания лица и рук, трехмерного сканирования и других целей.

Дополнительные сведения

Epic Unreal Engine
https://www.unrealengine.com

Intel RealSense SDK
http://software.intel.com/realsense

Часть 1

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