やっていくOpenXR入門

2-1. インスタンス

この節ではOpenXRを使う上で最初の一歩となるインスタンスの作成を行います。基本的にOpenXRの全ての機能はインスタンスを通して利用します。

まずはmain関数に以下のコードを追加して動かしてみましょう。

xr::InstanceCreateInfo instCreateInfo = {};    
std::strcpy(instCreateInfo.applicationInfo.applicationName, "OpenXRTest");
std::strcpy(instCreateInfo.applicationInfo.engineName, "");
instCreateInfo.applicationInfo.apiVersion = xr::Version::current();

xr::Instance instance = xr::createInstance(instCreateInfo);

instance.destroy();

エラー無く実行できましたでしょうか。注意点ですが、SteamVRやViveなど何かしらのOpenXRランタイムが入っていないとエラーが出ます。VR(AR)環境の揃ったPCで動かしてください。

とりあえずこれでインスタンスの作成と破棄処理が出来ました。これからの全ての処理はcreateInstanceからdestroyまでの間に書いていくことになります。ソースコードを確認していきましょう。

InstanceCreateInfo

インスタンスを作成する際は xr::InstanceCreateInfo に色々なデータを入れてcreateInstanceに渡します。ここでは最低限の設定としてアプリ名、エンジン名、APIバージョンを指定しています。

applicationInfo.applicationNameにはアプリ名を指定します。ここは自由に設定すれば良いでしょう。

applicationInfo.engineNameにはエンジン名を指定します。ここでは何のエンジンという訳でもないので空にしていますが、例えばUnityなどは内部的にOpenXRを呼び出す際にここに「Unity」などと指定していると思われます。もしあなたが自作のゲームエンジンなどを作りたい場合は、ここで何かしら名乗るとよいかもしれません。

std::strcpy(instCreateInfo.applicationInfo.engineName, "My Game Engine");

applicationInfo.apiVersionには利用するOpenXRのバージョンを指定します。実行環境がここで指定するバージョンに対応していなければ初期化が失敗します。ここではxr::Version::current()を指定していますが、この中身はXR_CURRENT_API_VERSIONで定義されている開発環境のAPIバージョンです。

createInstance/destroy

これらはインスタンスを作成・破棄するAPI関数です。

createで作ったものはしっかりdestroyで破棄するのが原則です。しかし、いちいち破棄するのは面倒だし抜け漏れがあってはいけませんね。そこで、破棄を自動化してしまいます。

先ほどのコードを以下のように書き換えましょう。

xr::InstanceCreateInfo instCreateInfo = {};    
std::strcpy(instCreateInfo.applicationInfo.applicationName, "OpenXRTest");
std::strcpy(instCreateInfo.applicationInfo.engineName, "");
instCreateInfo.applicationInfo.apiVersion = xr::Version::current();

xr::UniqueInstance instance = xr::createInstanceUnique(instCreateInfo);

Uniqueと付いているのが分かるかと思います。

OpenXR-Hppでは、破棄の必要なオブジェクトに対してUniqueと付いたバージョンのオブジェクトを用意しており、これらはデストラクタで自動で破棄処理を行ってくれます。基本的にはC++標準のstd::unique_ptrと同じです。メソッド(メンバ関数)には.ではなく->でアクセスします。

プロパティの出力

インスタンスからは利用しているOpenXRランタイムの情報などを取得できます。試しに出力してみましょう。

xr::InstanceProperties instProps = instance->getInstanceProperties();
std::cout << "Runtime: " << instProps.runtimeName << std::endl;
std::cout << "Version: " << to_string(instProps.runtimeVersion) << std::endl;

手元環境(SteamVRを使用)では以下のように表示されました。

Runtime: SteamVR/OpenXR
Version: 0.1.0

SteamVRが認識されていることが分かります。


この節ではインスタンスの作成を行いました。次の節ではシステムの取得を行います。

この節のコード
#include <iostream>
#include <openxr/openxr_platform.h>
#include <openxr/openxr.hpp>

int main() {
    xr::InstanceCreateInfo instCreateInfo = {};    
    std::strcpy(instCreateInfo.applicationInfo.applicationName, "OpenXRTest");
    std::strcpy(instCreateInfo.applicationInfo.engineName, "");
    instCreateInfo.applicationInfo.apiVersion = xr::Version::current();

    xr::UniqueInstance instance = xr::createInstanceUnique(instCreateInfo);
    
    auto instProps = instance->getInstanceProperties();
    std::cout << "Runtime: " << instProps.runtimeName << std::endl;
    std::cout << "Version: " << to_string(instProps.runtimeVersion) << std::endl;

    return 0;
}
cmake_minimum_required(VERSION 3.22)

project(openxr-test)

set(CMAKE_CXX_STANDARD 17)

add_executable(app main.cpp)

find_package(OpenXR CONFIG REQUIRED)
target_link_libraries(app PRIVATE OpenXR::headers OpenXR::openxr_loader)