adb uninstall com.oculus.sdk.xrface cd XrSamples/XrFace/Projects/Android ../../../../gradlew installDebug
Visualは、顔の動きが内向きのフェイスカメラと任意のマイクデータに基づいて推定されることを意味します。Audioは、顔の動きがマイクデータだけに基づいて推定されることを意味します。
XR_FB_face_tracking2により、顔のアウトプットを提供する拡張機能が導入されます。この機能は、カスタムセンサーから画像をインプットとして受け取り、さまざまな顔の領域でのアクションに対応するブレンドシェイプの重みをアウトプットします。XR_FB_face_tracking拡張機能では舌のトラッキングと音声によるフェイストラッキングがサポートされていないため、非推奨になったXR_FB_face_tracking拡張機能ではなく、XR_FB_face_tracking2を選択することを強くおすすめします。古いXR_FB_face_tracking拡張機能を使いたい場合は、Khronos OpenXRレジストリで詳細をご確認ください。RECORD_AUDIOアクセス許可もリクエストする必要があります。<manifest xmlns:android="http://schemas.android.com/apk/res/android" ><!-- Tell the system this app can handle face tracking --><uses-feature android:name="oculus.software.face_tracking" android:required="true" /><uses-permission android:name="com.oculus.permission.FACE_TRACKING" /><!-- Tell the system this app can use audio for face tracking --><uses-permission android:name="android.permission.RECORD_AUDIO" /><!-- Tell the system this app can handle eye tracking --><uses-feature android:name="oculus.software.eye_tracking" android:required="true" /><uses-permission android:name="com.oculus.permission.EYE_TRACKING" /> .... </manifest>
com.oculus.permission.EYE_TRACKING、com.oculus.permission.FACE_TRACKING、android.permission.RECORD_AUDIOのアクセス許可は、実行時のアクセス許可であるため、アプリケーションで明示的にユーザーにアクセス許可の付与を求める必要があります。アクセス許可について詳しくは、実行時アクセス許可をご覧ください。次の例は、アクセス許可の処理方法を示しています。 private static final String PERMISSION_FACE_TRACKING = "com.oculus.permission.FACE_TRACKING";
private static final String PERMISSION_EYE_TRACKING = "com.oculus.permission.EYE_TRACKING";
private static final String PERMISSION_RECORD_AUDIO = "android.permission.RECORD_AUDIO";
private static final int REQUEST_CODE_PERMISSION_FACE_AND_EYE_TRACKING = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestFaceAndEyeTrackingPermissionIfNeeded();
}
private void requestFaceAndEyeTrackingPermissionIfNeeded() {
List<String> permissionsToRequest = new ArrayList<>();
if (checkSelfPermission(PERMISSION_EYE_TRACKING) != PackageManager.PERMISSION_GRANTED) {
permissionsToRequest.add(PERMISSION_EYE_TRACKING);
}
if (checkSelfPermission(PERMISSION_FACE_TRACKING) != PackageManager.PERMISSION_GRANTED) {
permissionsToRequest.add(PERMISSION_FACE_TRACKING);
}
if (checkSelfPermission(PERMISSION_RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {
permissionsToRequest.add(PERMISSION_RECORD_AUDIO);
}
if (!permissionsToRequest.isEmpty()) {
String[] permissionsAsArray =
permissionsToRequest.toArray(new String[permissionsToRequest.size()]);
requestPermissions(permissionsAsArray, REQUEST_CODE_PERMISSION_FACE_AND_EYE_TRACKING);
}
}
XrInstance instance; XrSystemId system; XrSession session; XrSpace sceneSpace;
SampleXrFramework/Src/XrApp.hヘッダーをご覧ください。SampleXrFramework/Src/XrApp.cppでは、その初期化がすべて実装されています。XrInstanceを作成するには、すべての拡張機能を明示的に列挙してください。std::vector<const char*> extensions;
XrInstance instance = XR_NULL_HANDLE;
XrInstanceCreateInfo instanceCreateInfo = {XR_TYPE_INSTANCE_CREATE_INFO};
....
instanceCreateInfo.enabledExtensionCount = extensions.size();
instanceCreateInfo.enabledExtensionNames = extensions.data();
....
OXR(initResult = xrCreateInstance(&instanceCreateInfo, &instance));
SampleXrFramework/Src/XrApp.cppをご覧ください。#include <openxr/openxr.h>
XrSession Session;
XrSpace StageSpace;
SampleXrFramework\Src\XrApp.hヘッダーをご覧ください。XR_FB_FACE_TRACKING2_EXTENSION_NAMEを使うことをおすすめします。XR_FB_EYE_TRACKING_SOCIAL_EXTENSION_NAMEはXR_FB_FACE_TRACKING2_EXTENSION_NAMEと共に有効にする必要があります。そうしないと、目に関連するブレンドシェイプEYES_LOOK_*が提供されません。XrInstanceに関して、xrGetSystemProperties関数を呼び出すことにより、システムプロパティを受け取る必要があります。XrSystemFaceTrackingProperties2FB構造体を使ってください。その定義は次のとおりです。typedef struct XrSystemFaceTrackingProperties2FB {
XrStructureType type;
void* XR_MAY_ALIAS next;
XrBool32 supportsVisualFaceTracking;
XrBool32 supportsAudioFaceTracking;
} XrSystemFaceTrackingProperties2FB;
XrSystemFaceTrackingProperties2FBをご覧ください。 XrSystemFaceTrackingProperties2FB faceTrackingSystemProperties{
XR_TYPE_SYSTEM_FACE_TRACKING_PROPERTIES2_FB};
XrSystemProperties systemProperties{
XR_TYPE_SYSTEM_PROPERTIES, &faceTrackingSystemProperties};
OXR(xrGetSystemProperties(GetInstance(), GetSystemId(), &systemProperties));
if (faceTrackingSystemProperties.supportsAudioFaceTracking ||
faceTrackingSystemProperties.supportsVisualFaceTracking) {
// face tracking is supported!
}
XrSystemFaceTrackingProperties2FB構造体のsupportsAudioFaceTrackingフィールドでtrueが返される場合、音声駆動によるフェイストラッキングはサポートされています。supportsVisualFaceTrackingフィールドがtrueを返す場合、デバイスでは、内向きのフェイスカメラを使ったフェイストラッキングがサポートされています。xrGetInstanceProcAddrをご覧ください。使用例は次のとおりです。 PFN_xrCreateFaceTracker2FB xrCreateFaceTrackerFB_ = nullptr;
PFN_xrDestroyFaceTracker2FB xrDestroyFaceTrackerFB_ = nullptr;
PFN_xrGetFaceExpressionWeights2FB xrGetFaceExpressionWeightsFB_ = nullptr;
OXR(xrGetInstanceProcAddr(
GetInstance(),
"xrCreateFaceTracker2FB",
(PFN_xrVoidFunction*)(&xrCreateFaceTrackerFB_)));
OXR(xrGetInstanceProcAddr(
GetInstance(),
"xrDestroyFaceTracker2FB",
(PFN_xrVoidFunction*)(&xrDestroyFaceTrackerFB_)));
OXR(xrGetInstanceProcAddr(
GetInstance(),
"xrGetFaceExpressionWeights2FB",
(PFN_xrVoidFunction*)(&xrGetFaceExpressionWeightsFB_)));
XrFaceTracker2FBハンドルを呼び出す必要があります。フェイストラッカーに対するXrFaceTracker2FBハンドルを作成して取得するには、xrCreateFaceTracker2FB関数を以下のように定義して呼び出す必要があります。XrResult xrCreateFaceTracker2FB( XrSession session, const XrFaceTrackerCreateInfo2FB* createInfo, XrFaceTracker2FB* faceTracker);
xrCreateFaceTracker2FBをご覧ください。使用例は次のとおりです。 XrFaceTracker2FB faceTracker_ = XR_NULL_HANDLE;
XrFaceTrackerCreateInfo2FB createInfo{XR_TYPE_FACE_TRACKER_CREATE_INFO2_FB};
createInfo.faceExpressionSet = XR_FACE_EXPRESSION_SET2_DEFAULT_FB;
createInfo.requestedDataSourceCount = 2;
XrFaceTrackingDataSource2FB dataSources[2] = {
XR_FACE_TRACKING_DATA_SOURCE2_VISUAL_FB,
XR_FACE_TRACKING_DATA_SOURCE2_AUDIO_FB};
createInfo.requestedDataSources = dataSources;
OXR(xrCreateFaceTracker2FB_(GetSession(), &createInfo, &faceTracker_));
com.oculus.permission.FACE_TRACKINGアクセス許可をリクエストし、ユーザーによってこのアクセス許可が付与される必要があります。xrGetFaceExpressionWeights2FBを呼び出すことで、フェイストラッキングブレンドシェイプデータが利用できるようになります。XR_FACE_EXPRESSION2_COUNT_FB列挙型とXR_FACE_CONFIDENCE2_COUNT_FB列挙型を使います。 float weights_[XR_FACE_EXPRESSION2_COUNT_FB] = {};
float confidence_[XR_FACE_CONFIDENCE2_COUNT_FB] = {};
xrGetFaceExpressionWeights2FB関数を呼び出す必要があります。この関数は、特定の時点でフェイストラッカーによってトラッキングされる70のブレンドシェイプの重みと信頼度を取得します。その定義は次のとおりです。XrResult XRAPI_CALL xrGetFaceExpressionWeights2FB( XrFaceTracker2FB faceTracker, const XrFaceExpressionInfo2FB* expressionInfo, XrFaceExpressionWeights2FB* expressionWeights);
xrGetFaceExpressionWeights2FBをご覧ください。XrFaceExpressionInfo2FB構造体は、顔の表現がリクエストされるタイミングを表すxrGetFaceExpressionWeights2FB関数パラメーターです。呼び出し側では、レンダリングフレームの予測表示時刻に等しい時刻をリクエストしてください。システムは、リクエストされたタイムスタンプにできる限り近いタイムスタンプで値を返します。呼び出し側が、システムによるリクエストの達成範囲を判断できるようにするため、必ず推定値のタイムスタンプが提供されます。システムでは、その時刻での表情を提供するために適切なモデリングを採用します。XrFaceExpressionInfo2FB構造体の定義は次のとおりです。typedef struct XrFaceExpressionInfo2FB {
XrStructureType type;
const void* XR_MAY_ALIAS next;
XrTime time;
} XrFaceExpressionInfo2FB;
XrFaceExpressionInfo2FBをご覧ください。XrFaceExpressionWeights2FB構造体は、フェイストラッキングのブレンドシェイプの重みと信頼度を記述する配列が含まれるxrGetFaceExpressionWeights2FB関数パラメーターです。その定義は次のとおりです。typedef struct XrFaceExpressionWeights2FB {
XrStructureType type;
void* XR_MAY_ALIAS next;
uint32_t weightCount;
float* weights;
uint32_t confidenceCount;
float* confidences;
XrBool32 isValid;
XrBool32 isEyeFollowingBlendshapesValid;
XrFaceTrackingDataSource2FB dataSource;
XrTime time;
} XrFaceExpressionWeights2FB;
XrFaceExpressionWeights2FBをご覧ください。xrGetFaceExpressionWeights2FB関数を呼び出す方法を示しています。 XrFaceExpressionWeights2FB expressionWeights{XR_TYPE_FACE_EXPRESSION_WEIGHTS2_FB};
expressionWeights.next = nullptr;
expressionWeights.weights = weights_;
expressionWeights.confidences = confidence_;
expressionWeights.weightCount = XR_FACE_EXPRESSION2_COUNT_FB;
expressionWeights.confidenceCount = XR_FACE_CONFIDENCE2_COUNT_FB;
XrFaceExpressionInfo2FB expressionInfo{XR_TYPE_FACE_EXPRESSION_INFO2_FB};
expressionInfo.time = GetPredictedDisplayTime();
OXR(xrGetFaceExpressionWeights2FB_(faceTracker_, &expressionInfo, &expressionWeights));
for (uint32_t i = 0; i < XR_FACE_EXPRESSION2_COUNT_FB; ++i) {
// weights_[i] contains one specific weight
....
}
xrDestroyFaceTracker2FB関数を使ってリソースを解放することをおすすめします。OXR(xrDestroyFaceTracker2FB_(faceTracker_));
XR_META_face_tracking_visemes拡張機能は、リグがブレンドシェイプに対応するまでの暫定的なソリューションとして口形素が必要な場合に使用できます。XrInstanceに関して、xrGetSystemProperties関数を呼び出すことにより、システムプロパティを受け取る必要があります。XrSystemFaceTrackingVisemesPropertiesMETA構造体を使ってください。その定義は次のとおりです。typedef struct XrSystemFaceTrackingVisemesPropertiesMETA {
XrStructureType type;
void* next;
XrBool32 supportsVisemes;
} XrSystemFaceTrackingVisemesPropertiesMETA;
XrSystemFaceTrackingVisemesPropertiesMETA faceTrackingVisemesSystemProperties{
XR_TYPE_SYSTEM_FACE_TRACKING_VISEMES_PROPERTIES_META};
XrSystemProperties systemProperties{XR_TYPE_SYSTEM_PROPERTIES,
&faceTrackingVisemesSystemProperties};
OXR(xrGetSystemProperties(instance, systemId, &systemProperties));
if (faceTrackingVisemesSystemProperties.supportsVisemes) {
// visemes are supported!
}
xrGetFaceExpressionWeights2FB関数を呼び出し、XrFaceExpressionWeights2FB構造体の次のチェーンにXrFaceTrackingVisemesMETAを追加する必要があります。XrFaceTrackingVisemesMETA構造体の定義は次のとおりです。xrGetFaceExpressionWeights2FBの呼び出し後にisValidフラグをチェックすることで、返されるデータの有効性を確認してください。typedef struct XrFaceTrackingVisemesMETA {
XrStructureType type;
const void* next;
XrBool32 isValid;
float visemes[XR_FACE_TRACKING_VISEME_COUNT_META];
} XrFaceTrackingVisemesMETA;
xrGetFaceExpressionWeights2FB関数を呼び出す方法を示しています。 XrFaceExpressionWeights2FB expressionWeights{XR_TYPE_FACE_EXPRESSION_WEIGHTS2_FB};
expressionWeights.weightCount = 0;
expressionWeights.confidenceCount = 0;
XrFaceTrackingVisemesMETA visemeInfo{XR_TYPE_FACE_TRACKING_VISEMES_META};
expressionWeights.next = &visemeInfo;
XrFaceExpressionInfo2FB expressionInfo{XR_TYPE_FACE_EXPRESSION_INFO2_FB};
expressionInfo.time = GetPredictedDisplayTime();
OXR(xrGetFaceExpressionWeights2FB_(faceTracker_, &expressionInfo, &expressionWeights));
if (visemeInfo.isValid) {
for (uint32_t i = 0; i < XR_FACE_TRACKING_VISEME_COUNT_META; ++i) {
// visemeInfo.visemes[i] contains a weight of specific visemes
}
}
weightCountとconfidenceCountに0を割り当てるのではなく、有効な値をweightCount、weights、confidenceCount、confidencesに渡すと、ブレンドシェイプと口形素の両方がxrGetFaceExpressionWeights2FB関数によって返されます。| 口形素 | 音素 | 例 | 中程度 | 強調 | 回転 |
|---|---|---|---|---|---|
SIL | 中性 | ![]() | なし | ![]() | |
PP | p、b、m | put、bat、mat | ![]() | ![]() | ![]() |
FF | f、v | fat、vat | ![]() | ![]() | ![]() |
TH | th | think、that | ![]() | ![]() | ![]() |
DD | t、d | tip、doll | ![]() | ![]() | ![]() |
KK | k、g | call、gas | ![]() | ![]() | ![]() |
CH | tS、dZ、S | chair、join、she | ![]() | ![]() | ![]() |
SS | s、z | sir、zeal | ![]() | ![]() | ![]() |
NN | n、l | lot、not | ![]() | ![]() | ![]() |
RR | r | red | ![]() | ![]() | ![]() |
AA | A: | car | ![]() | ![]() | ![]() |
E | e | bed | ![]() | ![]() | ![]() |
IH | ih | tip | ![]() | ![]() | ![]() |
OH | oh | toe | ![]() | ![]() | ![]() |
OU | ou | book | ![]() | ![]() | ![]() |