littlewing

人間とコンピューターとメディアの接点をデザインするために考えたこと

Hologram Stability (ホログラムの安定性) の日本語訳

1年ぶりとなりますが、HoloLens / Windows Mixed Realityのドキュメントの中から「Hologram Stability」を自分の勉強のために翻訳(意訳)しました。

win10-HoloLens_front

元のドキュメントはこちらです。

以前からあったドキュメントですが、Immersive HMDに関する記述もあるので、内容は最近更新されているかもしれません。 2017/11/11現在の内容を基に作成しています。

コードとかUnityの知識に関しては記述されておらず、アプリ設計段階で必読の基本的な動作原理とFPSの維持がなぜ重要か?の話となります。

注意事項として、 Color sequential displayのハードウェアの仕組みと、輻輳角などの眼に関する前提知識がそれほど無いため、 そのあたりの翻訳の正確性が低い可能性があります。是非、原文も参照してください。

あと、ホログラム警察の方、ごめんなさい。多少変えていますが、原文を尊重して記述しています。 ホログラムは3Dオブジェクトと読み替えてください。


目次

ホログラムの安定性

  1. ホログラム安定性にかかわる用語
    • Accuracy (正確性)
    • Jitter (ジッター/ゆらぎ)
    • Judder (ジャダー /振動)
    • Drift(ドリフト/ずれ)
    • Jumpness (ジャンプ)
    • Swim (およぐ) 
    • Color separation(色分離)
  2. フレームレート
  3. ホログラムを配置する距離
  4. 安定化平面
  5. 色分離
  6. 関連ドキュメント

1. Hologram quality terminology (ホログラム安定性にかかわる用語)

高い品質のホログラムアプリケーションは良い環境と正しいアプリ開発によって生み出されます。

HoloLensが正しく位置トラッキングができる環境で60FPSを維持するアプリは、空間座標とホログラムの位置が正しく同期されます。

環境の影響や、低いレンダリングレートなどにより、不安定なアプリの挙動が発生する場合は、以下の用語が役に立ちます。

Accuracy (正確性)

ホログラムがワールドロックされて現実世界に配置されたのであれば、ホログラムはユーザの動きや、わずかな環境の変化とは無関係に配置された場所に留まるべきでです。

ホログラムが後になって、思わぬ場所に出現する現象は、正確性の問題です。 このようなシナリオは、2つの異なる部屋が同じに見える場合に起こります。

Jitter (ジッター | ゆらぎ)

ホログラムが高周期で揺れる状況は、環境追跡能力の低下している場合に発生します。 利用者にとっては、この場合の解決策はセンサーのチューニングを実行することです。

Judder(ジャダー | 振動)

レンダリングのフレームレートが低いと、不均一な動きが発生したりホログラムの二重像が生じます。 これは、動きのあるホログラムにおいて特に顕著です。 開発者は60 FPSを維持する必要があります。

Drift(ドリフト|ずれ)

ドリフトが発生すると、ホログラムが最初に配置された場所から離れていくように見えます。 これは、特に完全にマッピングされていない環境で、ホログラムが空間アンカーから遠くに配置された場合に発生します。 空間アンカーに近い場所にホログラムを作成することは、ドリフトの可能性を低下させます。

Jumpness(ジャンプ)

ホログラムがその場所からジャンプして他の場所に移動することがあります。これは環境トラッキングとその後の空間認識の結果に一致するようにホログラムが調整される時に発生します。

Swim (およぐ) 

ホログラムがユーザの頭部の動きに連動して揺れるように動くケースです。 これは、HoloLensが利用者にあわせてキャリブレーションされていなかったり、ホログラムが安定化平面上に配置されていいない場合などに発生します。 ユーザーはキャリブレーションアプリを実行することでこれを修正することができます。 アプリ開発者は安定化平面を更新することで、安定性を高めることができます。

Color separation(色分離)

HoloLensのディスプレイはColor sequential displayでRGBGの色を60Hzで点滅させています。(これは独立した色でいうと240Hzという事です。)

動いているホログラムを視線で追跡しているとき、ホログラムの先頭と末端部分において色分離が発生し、虹のような効果が発生します。 色の分離を減らすにはホログラムの動くスピードを遅くすることも効果があります。

また、レアケースですが、静止しているホログラムを頭部を激しく振りながら見た時にも虹のような色が見えることもあります。これはColor separation(色分離・後述)と呼ばれるものです。


2. Frame rate(フレームレート)

フレームレートはホログラム安定性の最も重要な要素です。 ホログラムが実空間に安定して正しく配置されているように利用者に見せるには、両目の映像が正しい視点で描画されなければいけません。ホロレンズのディスプレイは4つのカラーフィールド(RGBG)を1秒間に240回更新することで、利用者に60FPSの映像を提供しています。最高の体験を提供するためには、アプリケーション開発者は60FPSを維持しなければなりません。これは言い換えると、16ms毎に新しい映像を生成するという事です。(補足1000ms ÷ 60FPS = 16.666…)

60 FPS

ホログラムが現実世界に存在しているように描画を行なうために、HoloLensはユーザの実空間に基づいて描画を行う必要があります。描画にはどうしても時間がかかるため、HoloLensはユーザーの頭部の位置がどう動くかを予測して画像を表示しています。この予測アルゴリズムはいわゆる「近似」です。

HoloLensは予測される頭部の位置と実際の頭部の位置の間の不一致を補正して描画するようなハードウェアが内蔵されています。 これにより、利用者はホログラムが安定して、正しい位置に描画される体験を得ることができているのです。 描画される映像は変更量が少ない方が好ましく、運動視差などを完全に調整することは難しいです。

60FPSで安定したホログラムを表示するためには、通常以下の3つの事が行われます。

1. 画像の描画から利用者が見るまでのトータルでの遅延を最小化する。

ゲームスレッドとレンダリングスレッドがロックステップで実行されている仕組みでは、30FPSで実行すると33.3msという余分な遅延が発生することになります。 遅延を減らすことによって、予測の失敗を抑えることができます。それによってホログラムの安定性が増します。

2. ユーザーの目に届くすべての映像はある一定の遅延が発生しています。

アプリケーション30FPSで描画を行っても、デバイスのディスプレイ自体は60FPSで描画をしています。これはつまり、同じ映像が2回描画されることを意味します。その際の第2フレームは第1フレームよりも16.6msの遅延が発生するので、より多くのエラー訂正を行わなければならなくなります。この誤差の大きさの不一致は、望ましくないJadderの発生を引き起こす場合があります。

3. Jadderの発生を減らす。

素早いホログラムの動きと、低いFPSは主なJadder発生原因となります。従って、60FPSを維持することは、ホログラムの移動とそれに伴うJadderの発生を回避することに役立つのです。

フレームレートの一貫性

フレームレートの一貫性は、フレームレートと同様に重要です。 リッチコンテンツ・アプリケーションにおいては、フレームの欠落は起こりうることですが、HoloLensには、まれに発生してしまうフレーム欠落から回復するための高度なアルゴリズムが実装されています。 しかし、断続的にフレームレートが変化する状況というのは、継続的に低フレームレートになっている状況よりも利用者にとって気づきやすいものでです。

例えば、60フレームのうち、最初の5フレームが60FPSでスムーズに描画され、その後10フレームが30FPS相当のタイミングでしか描画されないアプリケーションは30FPSのアプリケーションとして実行されます。

これと関連する補足として、Mixred Reality Capture(MRC)録画中はアプリケーションはの動作は30FPSに制限がされます。

Performance analysis (パフォーマンス解析)

FPSベンチマークは以下のようなアプリケーションで取得可能です。


3. Hologram render distances (ホログラムを配置する距離)

www.youtube.com

人間の視覚システムは、物体に焦点を固定するときに、複数の距離に依存した情報を統合して処理しています。

  • Accommodation(調節)  (独立した目の焦点を調節する)
  • Convergence) (輻輳) 物体を見るために、両眼を外側もしくは内側に移動する
  • Binocular vision (視差) 焦点から離れた物体の距離に依存する左目画像と右目画像の視差
  • その他Shading(陰影),相対角度、単眼での情報など

輻輳と調節は、異なる距離の物体を知覚するために、目がどのように変化するかに関連する網膜上の別の機能であり、独立したものとなります。

自然に見ているときには、輻輳と調節は同調しています。 両目が(例えば自分の鼻の頭など)近くの物を見ているとき、視線は交差し焦点は近くの物を見るように調節されます。

両目でとても遠くのものを見ているとき、視線は平行になり、焦点は無限になります。

HoloLensディスプレイの光学的な最適距離は約2メートルに固定されているため、HoloLensを装着した利用者の目は、鮮明な画像を得るために2メートルの距離に調節されます。

アプリ開発者は、さまざまな深度にコンテンツやホログラムを配置して、利用者の視線が収束する場所を制御します。 利用者の目の輻輳と調節が異なる距離に収束してしまうと、二つの手がかりの間の自然なつながりが壊れ、特にその差が大きい場合、視覚的な不快感や疲労につながる可能性があります。

輻輳、調整競合による不快感は、可能であれば、興味のあるコンテンツをできるだけ2.0メートル付近に配置・維持することによって、回避したり、最小限に抑えることができます。

コンテンツを2.0メートル付近に配置することができない場合、輻輳による不快感はユーザーの視点が前後に大きく変化する場合に最大になります。

言い換えると、50cmの距離に安定して配置されているホログラムの方が、50cmの距離からあなたに向かった動いたり離れたりするホログラムよりも、はるかに快適です。 2メートルの距離にコンテンツを配置することは、HoloLensの両目のディスプレイがこの距離で最適化されているため、とても有利です。

この平面から外れたオブジェクトの場合、それらがディスプレイのフレームから外れていく時、片方の目のディスプレイから消えて、他方のディスプレイにはまだ写っている状態になります。この両目の映像のずれは利用者の奥行知覚を壊してしまう可能性があります。

https://az835927.vo.msecnd.net/sites/mixed-reality/Resources/images/DistanceGuideRendering.png

Clip Planes (クリッププレーン)

私たちが、快適な体験のために最もお勧めするカメラ描画のクリッピングは、1mの距離からフェードアウトをして85cmの距離で消えるような描画方法です。

オブジェクトも利用者もほとんど移動しないようなアプリケーションの場合は50cmくらいの距離でも快適に見ることはできます。 このようなアプリの場合には、クリッププレーンを30cm以内に配置し、フェードアウトはクリップ平面から少なくとも10cm離れた位置に配置をする必要があります。

コンテンツが85cmより近くにある時は、ユーザーがホログラムに頻繁に近付かないようにする事と、ホログラムが頻繁にユーザーから遠ざかったり離れたりしないようにすることが重要です。これらの状況は知覚の破壊を起こしてしまいます。

コンテンツが利用者から85cmよりも近い位置にある場合は、ユーザーとのインタラクションの必要性を最小限に抑えるように設計する必要があり、またユーザーやホログラムが25%以上の深さで移動しないようなシナリオを設定することも重要です。

Best practices (ベストプラクティス)

ホログラムを2m付近に配置することができず、輻輳と調節の矛盾を回避することができない場合は、ホログラム配置の最適ゾーンは1.25m~5mとなります。 いずれの場合でも設計者は(そのために必要な最適サイズと距離を考慮して)ユーザーが操作するオブジェクトは1メートル以上離れた場所に配置するよう設計すべきです。


4. Stabilization plane (安定化平面)

HoloLensは洗練されたハードウェア補助に基づく、ホログラム安定化技術によって動作しています。これは多くの場合は自動的に動作しします。

この安定化を最大化するために、Stabilization plane(安定化平面)と呼ばれる単一平面が選択されます。 シーン内の全てのホログラムはある程度安定化の恩恵を受けているのですが、この安定化平面内のホログラムはハードウェアによる最大の安定化の恩恵を受けることができます。

https://az835927.vo.msecnd.net/sites/mixed-reality/Resources/images/stab-plane.jpg

デバイスは自動的に、この平面を選択・実行しますが、アプリケーション側でシーン内でフォーカスポイントを選択することで、この動作を制御することができます。

HoloLens上で動作するUnityアプリケーションの場合は、シーン内でSetForcusPoint()を利用することで最適なフォーカスポイントを設定するのが良いでしょう。

DirectXでフォーカスポイントを設定する例は、デフォルトの回転キューブテンプレートに含まれています。

UnityアプリケーションがデスクトップPCで動作するImmersiveヘッドセット上で動作する場合は、UnityはデプスバッファーをWindows側に送信することで、ピクセル単位の再投影を可能にしています。これは通常、アプリケーション側からの明示的な設定が無くてもさらに優れた画質を提供してくれます。

フォーカスポイントを指定するとPixcel単位の再投影が上書きされるため、これはHoloLens上で実行されている時のみ実施する必要があります。

注釈 つまり、ImmersiveHMDの場合はSetForcusPoint()は実行しない方が良い

// SetFocusPoint informs the system about a specific point in your scene to
// prioritize for image stabilization. The focus point is set independently
// for each holographic camera.
// You should set the focus point near the content that the user is looking at.
// In this example, we put the focus point at the center of the sample hologram,
// since that is the only hologram available for the user to focus on.
// You can also set the relative velocity and facing of that content; the sample
// hologram is at a fixed point so we only need to indicate its position.
renderingParameters.SetFocusPoint(
    currentCoordinateSystem,
    spinningCubeRenderer.Position
    );

フォーカスポイントの配置は、見るべきホログラムの配置によって大きく依存します。

アプリには参照すべき視線ベクトルがあり、アプリ設計者はユーザーがどのコンテンツを見たいか把握しておく必要があります。

アプリ開発者がホログラムを安定させるためにできる最も重要なことは、60FPSでレンダリングすることです。

60FPSを下回ると、安定化平面の最適化に関係なく、ホログラムの安定性が大幅に低下します。

Best practices (最適解)

安定化平面を設定する普遍的な方法はなく、アプリ固有のものなので、あなたのシナリオに最適なものを試してみることをお勧めします。

しかし、この平面上のにあるコンテンツが最も安定するため、できるだけ多くのコンテンツはこの安定化平面上に並べるようにしてください。

例えば、

  • 平面コンテンツ(読書アプリや、ビデオ再生アプリ)のみがある場合は、安定化平面をコンテンツがある平面に揃えます。

  • ワールドロックされた3つの球がある場合は、現在ユーザの視界にあるすべての球の中心をとおるように安定化平面を切り取り(配置)します。

  • シーン中に実質的に異なる深度のコンテンツを持っている場合は、さらにオブジェクトを追加しましょう。

注釈 3つ目の項目についてですが、(原文が、「favor further objects.」となっているので、このように訳しましたが、これが「favor farther objects.」であった場合、「シーン内に異なる深度のコンテンツを持っている場合は、遠くのオブジェクトに合わせましょう」と訳すこともできると思います。誤字なのかもしれません。。

ユーザーが見ているホログラムと一致するように、フレームごとに安定化点を調整するようにしましょう。

Things to Avoid (やめた方が良い事)

安定化平面は、ホログラムを安定化させるための重要なツールですが、誤用すると逆に不安定になってしまいます。

• ユーザーの背後に存在したり視界に入っていないオブジェクトに安定化平面をアタッチすることもできるため、安定化平面を設定した場合は消すことも忘れないでください。安定化平面の法線がカメラの正面と反対側の設定されていることを確認してください。

• 安定化平面を極端に、前後に素早く変更しないでください。

• 安定化平面を一定の距離方向に設定したままにしないでください。

• 安定化平面がユーザーを横切らないようにしてください。

  • Immersive HMDなど、デスクトップPCで動作させている場合は、フォーカスポイントを設定せずに、代わりにPixcel毎の再投影を利用してください。

5. Color separation(色分解)

HoloLensディスプレイの性質上、「色分解」と呼ばれる現象がしばし発生することがあります。

これは、赤・緑・青の基本色が分離した状態の画像として現れます。

この現象は特に、(RGBの輝度が最大になっている)白色のオブジェクトを表示した際に表れやすいものになります。その他、ユーザーが素早く動くオブジェクトを追跡するように見ているときにも現れやすいです。また、その他には、オブジェクトが歪んだり変形する際にも表れます。

もし、オブジェクトがハイコントラストであったり、RGBの原色で構成されている場合は、色分解はオブジェクトの他の部分の歪みとしても発生します。

このような、色分解を完全に無くすことは、中々難しいのですが、以下のようなテクニックを利用することである程度抑制することはできます。

色分解は以下のような場合に発生します。

  • カーソルのようなヘッドロックされたオブジェクトも含めて、素早く動くオブジェクト
  • 安定化平面から物理的に離れた場所にあるオブジェクト

色分解の現象を減らすためには

  • オブジェクトをユーザーの視線の動きに対して、あたかもバネのように慣性があるように動作を遅らせる。これによりカーソルの動きは遅くなり、ユーザーの視線に少し遅れてついていくようになります。ユーザーの視線の動きが止まったことを素早く検知して動作を制御すれば、これは自然な動きとして感じられます。

  • もし、ユーザーが目で追跡するようなオブジェクトを回転させる場合は、5度/秒以下の速度で動かしてください。

  • カーソルには形状のはっきりしたオブジェクトではなく、ライト(発光)のような表現を利用してください。視線に追随する仮想光源はポインタカーソルとして利用できますが、色分解は発生しません。

  • 利用者が注視する対象のホログラムに合わせて安定化平面を調整してください。

  • オブジェクトを赤・緑・青などの原色で作成してください。

  • カーソルなどのオブジェクトをぼやけた形状に変えてください。例えば丸い白色のカーソルは、動きの向きに合わせて変化する、「ぼやけた線」に変更するのも良いかもしれません。

このように、60FPSでのレンダリングと安定化平面の設定はホログラムの安定性にとって非常に重要な技術です。

色分解が頻繁に発生する場合は、まず、最初にフレームレートが期待値に達しているかを確認してください。


6. See Also (関連ドキュメント)


あわせて読みたい (11/18追記)

翻訳は以上ですが、この内容に関連した情報として以下のページも合わせて読むと理解が深まると思います。

tips.hecomi.com

panora.tokyo


今まで翻訳したのはこちら

littlewing.hatenablog.com

littlewing.hatenablog.com

littlewing.hatenablog.com

マイクロソフト 13W 電源アダプター ブラック 3YY-00007

マイクロソフト 13W 電源アダプター ブラック 3YY-00007