まえおき
Michael Abrashブログ「ジャダー」に関する記事の日本語訳をサルベージしてみました。
元になった記事が以下の3ページなのですが、現在サイトごと消えてしまっております。
じっくり読みます。 Michael Abrash①「なぜ”仮想”はリアルに感じられないのか?」 http://t.co/HLwtgRtjYg ②「ジャダー」 http://t.co/13E0xWvDj2 ③「ジャダー問題の解決」 http://t.co/wJZDYujTnV
— にくきう @ GDC行きたい (@shiftsphere) 2014, 3月 31
内容としては、VRを実現しようとするときに人間の目で見る世界が、自然界と表示デバイスとの間にどのような差があるのか、どういう解決策が考えられるのか考察されています。OculusRiftなどのVRデバイスを目と表示パネルの間でなにが起きているのかを学ぶことができ非常に参考になりました。
これが失われたままなのは非常に勿体ないと思いました。
( ゚Д゚)!
そういえば…
やったーKindle PaperwhiteにWebページ転送できたよー ここ使えた。http://t.co/NHyBZBatbD http://t.co/WBSXVz6SdY
— にくきう @ GDC行きたい (@shiftsphere) 2014, 3月 31
去年読んだ時、手持のKindleに転送してあったデータが残っていました!
ここから救出して共有したいと思います。
この記事は2014年03月頃に公開されていたものを保存したもので、書かれたのはそれ以前のテキストとなります。
データはwebページからKindle用に落として転送されていたものを、AZW->PDF変換してありますので元サイトのレイアウト等は失われておりますのでご了承ください。
ミラー記事の許可をくださったYoi様 @yoi_hibino には感謝を申し上げます。
この記事の公開についてなにか問題がありましたらTwitter@shiftsphereまでご連絡ください。
以下VRバカ一代さんブログ記事。
Michael Abrashブログ①「なぜ”仮想”はリアルに感じられないのか?」 | VRバカ一代
Yoi
米国Valve社Michael Abrash氏によるVR関連ブログ第一弾。
VR技術を使ったコンテンツ開発を成功させるにはVR技術に対する十分な基礎知識が必要です。もし
十分VRの特性を理解していれば、次にどんな技術が登場するのか、何を目指しているのか理解するこ
とも可能です。Michael Abrash氏は長年VRについて研究を重ねてきた、世界でもっともVRを理解して
いる人物の一人です。
彼はその知識をブログにまとめて公開しています。幸い、ブログの翻訳と公開の許可をいただいたので
皆さんとそれを共有したいと思います。一連のブログの内容を理解すると、OculusVRがどのような戦略
で製品開発をしているのか、あるいは展示会でのプレゼン内容をもっと理解できると思います。第一弾
は
Why virtual isn’t real to your brain
〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜*〜
自分が持つ情報をシェアする事がどんなメリットをもたらすかなどという議論からこのポストをはじめようと思ったんだけど、これから自分が書こうとしている事にちょうどJohn Carmackが至極賛同してくれたので、そのメール内容からはじめることにしよう。
Subject: なんと素晴らしき世界!
Body:
単なる趣味なんだけど、Annaがクリスマスにくれた古いApple IIc 用の高速なライン描画ルーチンについて書こうと思ったんだ。かなりいい内容に仕上げられる自信もあったけど、ちょっとしたレビューも面白いかなと。そこで君が昔書いた本をすぐに思い出したんだ。それは何度読んでも面白い本でさ。僕はランレングスの最適化のところにあった一節をすっかり忘れていたんだ。
どの一節が頭にこびりついているかというと.…「最初に告白しなきゃならない事がある。これから説明するアルゴリズムが、Bresenhamのランレングスアルゴリズムなのかはっきりしないのだ。このアルゴリズムについて学んだのは随分昔の話しだし、Bresenhamの論文をどこかにしまい込んで見つける事ができない。したがって自分自身でこのアルゴリズムをゼロから組み立てる必要があったのだ。それがBresenhamのものと同じなのか違うのかはっきりわからないけど、確かに言える事はこのアルゴリズムは高速だということだ。」
今日の日に万歳!
〜それが僕にどんな意味をもたらしたのか
確かに今日の日に万歳!だ。知恵を共有するって事はとても素晴らしい事だ。しかし、何かを書いて投稿する事はかなりの労力が必要だ。何かの問題を解決するような内容だと特に大変だ。
だからみんなで知恵を共有するんだといっても、普通、自ら何かを書いて共有するというより、誰かが書いたものを共有する事の方が多い。
これはまさに”Prisonerのジレンマ”と言えそうな話だ。しかし実際には比較的大きい、間接的で予測不可能なメリットがそこにある。いつそれが享受できるか言う事はできないし、どんな形で享受できるかもわからない。
しかし、それは確かに事実なのだ。例えば10年間僕が、みんなが寝ている間に書いた記事の事について思い浮かべると、それらがその後の20年間に起こったすべての興味深い出合いのきっかけを運んできたのは明白な事実だとわかる。
1992年、僕は小さな会社でグラフィックスソフトを開発していたけど、そろそろ次の仕事でも探そうかと考えていた。これまで僕はずっと同じような小さな会社で、まぁ、楽しい仕事をこなしてきたけど、それで世の中が変わるなんて事は決してなかった。
同じような仕事を転々としながら、そこそこいい生活をさせてもらったけど、世の中を変えるような仕事にかかわる事なんかなかった。
しかし、80年代前半、Dan Illowsky(僕のPCゲームのパブリッシャー)は、無料広告のような形態で記事を書きたいと思っていた。
僕らが書いた記事はそれほど特別な意味を持たなかったけど、自分の記事が発行されたというだけじゃなく、なにより僕はいろんな事を学ぶいい機会でもあったんだ。
そして80年代半ば、僕はProgrammer’s Journalで”速度最適化(Optimization for Speed)”というタイトルで、サイクルカウンティングによって8088でビットダブリングの高速化について記事を書く事になった。
僕はゲームコードの最適化でサイクルカウンティングが8088における重要事項ではない事を知っていた。なぜならバイト毎に4サイクル必要なメモリーアクセスがほぼすべてにおいてボトルネックになっていたからだ。
この話を気まぐれでPJに投稿したところ、この記事が発行され、これがきっかけでPJにレギュラーのコラム欄を担当することになったのだ。1992年、新しい仕事を探し始めた頃には、僕はいくつかの雑誌にレギュラーで記事を書くほどになっていた。
その中の一つの記事はTurbo Cについての最初のプレビューだった。Borlanndが間違えてPJに発表前のTurbo Cの広告コピーを送ってしまい、PJが製品を実際に見ることができるようになったのだ。
他のC言語担当コラムニストがBorland社の近くに住んでいなかったため、僕がある雨の夜にSantaCruzまでドライブをしてBorland社VPのBrad Silverbergと話す機会を得、そしてそれを速攻で記事にした(実際にその開発環境を触ってみたかった!)。速攻で書いた割には内容は正しく、実際には非常によくできた記事になった。
1992年、BradはMicrosoft社のWindows担当VPになり、僕は彼に仕事を紹介してもらえないかとメールを書いた。彼はWindowsNTのチームを紹介してくれ、僕のキャリアの中でもっとも挑戦的で満足のいく仕事をする事になった。
もしTurbo Cの記事を書く機会がなければ、Bradに出会う事もなく、NTの開発にかかわる事もなかった。
(もっとも、VideoSevenのDave Millerが、同じくNTチームを紹介してくれたJeff Newmanに引き合わせてくれてたので、記事ばかりが人生を変えたわけではないけど!)
僕はいままで大きなプロジェクトで働いた経験がなかったので、NTチームの契約スタッフとして働き始めた最初の頃、かなり苦労をした。数週間ほぼ缶詰状態だった僕に、たまたま僕の記事を読んで、僕を助ける価値があるなと考えたMike Harringtonがネットワークの設定をしてくれたり、開発ツールについて教えてくれたり、夕食に連れ出してくれたりといろいろ世話をしてくれた。
Microsoftで数年過ごした後、僕はid社に移籍する事になった。これもPCプログラミングを学んでいたJohnCarmackが僕の記事をPJで読んでいた事で開いた道だった。数年後、Mike HarringtonがValve社を立ち上げ、id社から僕の関わったQuakeのソースコードをライセンスし、その13年後僕もValve社で働く事になった。
もし、80年半ばからの事象を並べたとき、明らかなのは
1)執筆がどこで役に立ち、
2)どうやっていろいろなチャンスを運んでくるか予測不可能である
ということだ。
これは多分一般論であり、僕だけの特殊ケースではないはずだ。情報のシェアリングがもたらす結果は決定論的事象ではなく、また結果を見るまでの時間も長く、しかし、こうしたチャンスの到来はそれなしではありえなかった。これは無理矢理かもしれないが、情報の共有は自分にできる最大の投資であるといえる。
僕がこのブログを書くのも、情報のシェアリングが、予測できない、しかし実際にメリットをもたらすからだ。これによっていろんな人とコンタクトができ、ともに学び、働くきっかけとなる。
例えば、Pravin Bhatは僕のブログを読んだ後メールしてくれた人物の一人だ。彼はいまValveで働き、かなり賢いトラッキングコードを書いている。機会があればこれについても書いてみたい。
もしあなたがARやVR、あるいはビデオゲーム開発したいとか、Linux、ハードに興味あるとか、あるいはValveで働いてみたいとか思うなら、是非、Valve Handbookを読んでほしい。
もし、これを読んで自分がValve社にフィットしていると感じたら是非、履歴書を送ってくれたまえ。我々はハードとソフト両方に興味があり、特に機械工学の分野には興味がある。特定のプロジェクトではなく、幅広い分野での経験と能力を探している。
僕が記事を書いたりブログを書いたりするのは、僕の書いた事から何かしら学んだ人から、なにやら暖かいフィーリングを感じるからだ。実際のメリットはいつ結果を伴うかどうかはわからない。どんなきっかけであれ、情報のシェアリングは我々すべてにメリットをもたらす。
この精神で、僕はこれから、我々が見つけた、人間の視覚システムが仮想イメージを現実だと感じる、驚くべき複雑で深い理由について書こうと思う。
〜どうやってイメージは表示されるか
僕が以前GDCで話した通り、人がヴァーチャルシーンを見たとき、それがリアルに感じるかそうでない
かには3つの要素が関わっている。それは
1)トラッキング
2)レイテンシー
3)ディスプレイが知覚的にどう目と脳に作用するか
だ。精度の高いトラッキングと最小限のレイテンシーによって、イメージが正しい位置と時間に表示される。
レイテンシーについては以前話したし、トラッキングに関してもそのうち話すけど、とりあえず今は、レイテンシーとトラッキングについては解決可能な問題として、HMDと人間の視覚システムの相互作用、及び知覚的効果について一段掘り下げて議論してみようと思う。
題目は「なぜ、VRとARはディスプレイを目のすぐ先においてレンダリングイメージを正しい時間に正しい場所で表示する、という問題だけで収まらないのか」と書いてもいい。
この後のブログでは、みんなを”Persistance(パーシスタンス)”、”Judder(ジャダー)”、”Strobing(ストロボ)”という知覚の落とし穴に落とすつもりだけど、今日はHMDの基本的な原理と、直感的に分かりやすい、”Color Fringing”(GDCで話したテーマだけど今日はもっと掘り下げて)について語ろうと思う。
まず最初に定義すべき事は、視覚とは、網膜上に光がいつどこに到達したかということだ。これはとても明らかな事だけど、次のような直感的でない例を思い浮かべてもらいたい。
今、目がラスタースキャンディスプレイを見ているとしよう。そして、縦のラインが左から右へアニメーションしていて、目はそれをトラッキングしているとする。
さらに、ディスプレイ上のピクセルはパーシスタンスがゼロ、すなわち、それぞれのピクセルは非常に明るく、非常に短い時間のみ点灯するとする。
さて、この状態だと目にはどううつるんだろう?
ディスプレイの各フレームに表示されるパターンは縦のラインであり、それは目に見えるパターンでもあるはずだ。しかし実際に見に見えるパターンは右上から左下へのびる直線である。
その理由は以前説明した通りであるが、ここで強調したい事は、それぞれのピクセルから網膜に入射する光子のパターンは斜めのラインであるという事だ。これは珍しい事ではない。
HMDで表示される情報と目が受け取る情報が異なる事はしばしば起こる事である。そしてこの事の主たる原因は、ディスプレイで構築される光の情報が網膜に到達する方法が実世界の光のそれと異なるからである。
実世界の光子は連続的にあらゆる物質表面で反射され、あるいは表面から放射され、またその変化も一定である。一方、ディスプレイの場合は不連続な期間内に不連続な領域から一定量の光子が発射される。従って光子放射は時間的、空間的に量子化されたものになる。
さらに言うならば、HMDでは、ピクセルの位置は頭の位置に対して同じ位置にあり、しかし目あるいは実空間に対しては異なる位置に存在することになる。
上の例では、斜めのラインは、ディスプレイの走査線が下に向かって走査する間、ピクセル位置に対する目の動きによって引き起こされるものである。
光子はディスプレイから放射される3次元情報と考える事ができる。すなわち、
pixel_ color = f(display_x,display_y,display_z);
量子化が起こるのはピクセルカラーがピクセルによって定義される領域毎に一定であり(格子状であるということ)、フレーム間の時間それが保持されるからである。
そしてこのシグナルが目に到達すると、一定時間、同じ色の小さな四角い光が網膜上を走査する。フレーム毎の走査距離は、フレーム時間内に起こった、ピクセルに対する目の動きに比例する。
結果として、フレーム時間が限りなくゼロに近いか、ピクセルに対して目が動かなかったことがない限り、目にはこの点が伸びて見えるはずだ。
実際にはピクセルは真四角でもないし、均一な色でも、輝度が残像時間内一定でもないので、結果はそう単純ではないが、今のところこれで十分だ。そのうち、ピクセルではなく、ピクセルのカラーコンポーネントで考えた場合とその場合の面白い結果について語る事にしよう。
このような、不連続の光子放射のメカニズムは、この数回のブログの中心的な考え方になる。なぜならば、ほとんどのディスプレイ技術には”残像時間”が存在し、そのため、ほとんどのHMDでは”Judder”と呼ばれる現象が起こる。
このJudderは、ブラーとストローブのミックスで、画質を著しく劣化させるだけでなく、ガクガクした動きに目が疲労し、酔いの原因にもなる。
次回はこのJudderに関して詳しく議論するが、今回はまず、目とディスプレイの基本的な関係からカラーフリンジと呼ばれる現象を例に、Judderの基本を押さえていく事にする。
〜目とディスプレイの相対的位置関係が鍵
不連続な光子の放出によって作り出される人工的な映像は通常のディスプレーやプロジェクター毎に
それほど違いがあるわけではない。しかし、HMDは全く次元の異なる話になる。その主たる原因は、他の表示システムと比較して、目とディスプレー間の相対的な動きが激しいことにある。
通常のモニターで何かはっきりと見ようとしているとき、モニターに対して目が激しく動くというケースはない。なぜならばモニターの視野角が狭いからである。
30インチモニターでも、通常の距離からモニターを見た時の視野角はせいぜい60度。もし何かスクリーン上を高速に右から左へ移動したとすると、目がそれを認識し、追従をはじめたときには既にその物体はスクリーンから消えている。一方、Oculus Riftは視野角が90度もある。
モニターに対する目の動きが、HMDのものと通常のディスプレーのものと比較して、HMDの場合が圧倒的に早い最大の理由は、HMDが頭に固定されているからである。
頭は非常に早くまわす事ができる。およそ500度/秒くらいだ。頭が回転すると、目は「前庭動眼反射(Vestibulo-Ocular Reflex, VOR)」と呼ばれる生体反射によって、頭の回転方向と逆の方向に目が素早く移動する。この反射があるおかげで、頭がどんなに早く回転しても、目は焦点位置を維持する事ができるのである。
ではそれがHMDにとってどういう意味何かについて議論しよう。
あなたがある一点を見ているとき、頭が回転すると、HMD上のピクセルは目の相対位置に対して極めて高速に、通常、目が物体の動きに追従しようとする速度の軽く10倍以上のスピードで移動する。
これがことの外重要なのは、頭が回転しながらも、目は素早く物体を認識し、それを追従するようにできている事である。こうしたVORに基づく、目とピクセル間の相対的な高速移動はHMD特有のものなのである。
では、いくつかの”時空間ダイアグラム”を使って、HMDと実世界がどう違うのかはっきりさせていこう。
この図におけるx軸は、水平軸における目からの相対的な位置、y軸は時間経過を示す。この図は、モニターから発した信号が、どの時間にどう網膜に映るかをモデル化したものである。
この図は実世界で静止した物体を見ている時の状態を示している。
ここで強調したいのは、x軸は、目の位置に対する相対的な水平位置であり、実空間における酸い平一ではないという事である。
網膜にどう光が到達するかは目の位置に対する相対的位置で決まるため、この事をしっかり理解しておく事は重要なのである。したがって上の図は、目も物体も動いていない状態たけでなく、動いている物体を目が捕捉している状態も示している。
仮想現実でも、そのイメージの色が変わらない限り、仮想イメージと目が相対的に動いていない状態は、この上図とほぼ変わらない絵になる。
”色が変わらない限り”といったのは、実世界では色の変化は時間軸に対してスムーズに変化する一方、仮想現実では色の変化は、不連続に、フレーム毎にしか起こらないからだ。このことは、仮想イメージが移動し、それを目が追従している状態で大きな意味を持つ。
次に目に対して物体が相対的に移動している状態を考えてみよう。下図は、実世界の物体が一定速度で左から右へ移動している状態を示している。最もあり得るケースとして、目が何かに注視している間、その物体が左から右に移動しているといった様子だ。
では同じ事を仮想現実で表現したときどうなるだろうか?
仮想イメージが左から右へ移動する。目はまっすぐ向いたままだ。多くのタイプのディスプレイで同じ事が起こるだろうが、ここでは、色順次表示方式液晶モニタ(LCOS)を使うと仮定しよう。
しばしばHMDに使用される色順次表示方式LCOSは、赤、緑、青が順々に表示される方式で、例えば赤色LED、緑色LED、青色LEDを順次点灯しながらそれぞれの色コンポーネントに相当する透過パターンを液晶で表示する、といった仕組みの装置である。
(実際には各フェーズ毎に緑色LEDのパターンに戻るケースが多いようだけど、話を単純化するために詳細は無視していただきたい。)この事をふまえ、目がまっすぐの状態で、白い物体が左から右に移動する様子を示したのが下図である。
もう一度確認するがx軸は目に対する相対的な水平位置だ。
もし、ディスプレーが無限大のリフレッシュレートを持つならば、上に登場した実世界の図のようにプロットは線形になるはずだ。しかし有限のリフレッシュレートしかあり得ないため、とても面白い事が起こる。
ある一つのピクセルに対し、各フレームの1/3の時間、それぞれの色が表示される(実際には、色の変更に鏡を切り替えないといけないためその時間を除くと、各色毎に2ms位の発光時間となる。また色の切り替えのため、モニターが暗くなる瞬間があるが話の単純化のため、色は瞬時に切り替わり、フレームを3等分した時間、同じ輝度で表示されるものとする)。
リフレッシュレートが60Hzの場合、1フレームが16ms。これは目が光り情報を網膜に蓄積する時間より十分に短いため、各色はミックスされ、ミックスされた色情報として認識されるようになる。
下図は、白い水平ラインをLCOSで見ているとき、実際に網膜に到達する光子の状態を示したものである。
すなわち、3つの色のラインが次々に網膜に到達し、ディスプレイに対して目が動いていなければ、それぞれのラインがお互いに重なりあって、白いラインとして認識されるのである。
一つ一つのピクセルは、フレーム毎に一回しか更新されない。つまり1枚のフレームを表示している時間、同一の色情報が保持されるため、イメージはピクセルの位置と保持時間に対して量子化される事になる。結果として動きは連続ではなく、不連続となる。
上の例では、フレーム間で相当な量の移動を伴わない限り、際立って特異な現象が起こるわけではない。”相当な量”とは角度に換算して5分〜10分。それはイメージの周波数に依存する。イメージが点滅する事もある。
この場合、目は複数のイメージのコピーを同時に保持する状態と同じになる。このようなケースについては後ほど述べる事にする。
ここまでは理解できただろうか?
しかし、我々はまだ、目とディスプレイが相対的に移動した場合に踏み込んでいない。そして、このケースこそがいくつかの特異状態を出現させるのだ。
先に述べた通り、目はディスプレイに対して自由に動かす事が可能だ。動いている仮想イメージを追従したり、頭を動かしているあいだ、VORによって静止した物体を追従してそれをクリアに見る事ができる。
(目は「衝動性眼球運動:Saccade」と呼ばれる運動によってディスプレイとの相対位置が変化する場合があるが、その運動が視覚情報を取得しながら起こっているにも関わらず、目はクリアに物体を見ていない。)
特にVORに起因する眼球運動は、目ーディスプレイ間の相対速度が極めて速いためとても重要である。
では、左から右に移動する1ピクセルのサイズの仮想イメージを目が追従している場合、どうなるだろうか?
ピクセルを構成する各色コンポネントは目に対して異なる位置に並び、下図のように”カラーフリンジ”が発生する。(この図は「Judder」を理解するためのすべての情報を含んでいるがその話は後にとっておこう。)
しつこいようだが、x軸は眼球との相対位置であり、実空間の座標ではない。
あるフレームにおいて、フレームの表示開始時に赤コンポネントがピクセルにまず表示される。(ここではレイテンシーもなく、フレーム表示のタイミングは完璧に周期的であるとする。)
問題は、ピクセルを追従するために、眼球が次のフレームにおけるピクセル位置に向かって移動している一方で、次のフレーム時までの間、各色コンポーネントが同じ位置でフレーム間隔の1/3の期間表示され続けるのである。
従って各ピクセルは、上図のように同一フレームの表示期間、相対的に反対方向に移動して見えるはずである。フレーム間隔の1/3が終わると緑色コンポネントが表示され、次に青色コンポーネントの順番になる。
次のフレームが表示されるとピクセルの位置は、あるべき場所に移動し、これが繰り返されるというわけだ。
各色コンポネントは眼球に対し異なる場所に表示されるため、お互いを正しい位置に合成する事ができない。
下図は眼球が左から右に移動する時にカラーフリンジがどのように出現するかを示したものである。カラーフリンジは赤、緑、青と色コンポーネントを順番に表示する間、ピクセルに対して眼球が左から右に移動してしまうために発現するのである。
レフレッシュレートが60Hzの場合、各フレームの表示期間は16.6msにすぎず、このカラーフリンジが大きな問題になるというのは考えにくいかもしれない。
しかし頭を100度/秒くらいのゆっくりとしたスピードで動かしたとしても、すぐに簡単に数100度/秒というスピードで動かす事も可能だ。60度/秒で動かした場合、16.6msという1フレームの移動角度は1度になる。
120度/秒だと1フレーム当たり2度だ。これは小さな数字に見えるが、実はピクセルに換算すると数十ピクセルにもなる。HMDであれば2度は100ピクセルに相当する。すべてのピクセルにこれだけの幅のにじみがかかったらイメージの質はとことん落ちる事は間違いない。
色順次表示方式はプロジェクターやTVの場合、こうした問題はほとんど問題にならない。なぜならプロジェクターもTVも、
1)視野角が狭いので、高速な眼球ーディスプレイ間の相対的な移動が伴わない。
2)頭を動かして視点を変えるわけではないので、VORに関わる眼球の高速運動を伴わない。
からである。
しかしHMDでは大問題となる。
したがってARやVRに使用するHMDには色順次表示方式の表示装置を使うべきではない。
〜必要条件ではあるが十分条件ではない
ここでの議論をまとめると2点になる。
1)眼球とHMD間の相対的な移動は、重要な問題を引き起こすことは明らかであり、その基本的な発生メカニズムを理解しておかなければならない。
2)色順次表示方式のディスプレイはその動作原理によってカラーフリンジを発現させる。したがってAR/VRにおける使用は避け、3つの色コンポーネントを同時に発光するものを使用するべきである。
3つの色コンポーネントを同時に発光させることは必要条件であるが、それでも十分ではない。
そうすることでカラーフリンジの発現を押さえる事はできるが、Judderに関してはなんの解決にもならない。
この点についてもう一段踏み込んだ議論を次ぎにしよう。
www.vrbaka.com/main/reference/michael-abrash-blog-1/
OculusRift - Michael Abrashブログ②「ジャダー」救出版 - Qiita
http://qiita.com/shiftsphere/items/c2f0c1a842b519e8dfde
へ続きます!