この節では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)