記事の目次

    前回から測域センサを用いたコンテンツの紹介がスタートしましたが、今回は番外編として、今注目の裸眼立体視用ホログラムディスプレイ「Looking Glass」を扱ってみます。

    TEXT_高田稔則 / Toshinori Takata(Codelight
    EDIT_小村仁美 / Hitomi Komura(CGWORLD)

    <1>「Looking Glass」のしくみと可能性

    こんにちは、高田です。今回は少し寄り道して、話題のホログラムディスプレイ「Looking Glass」を扱ってみます。Looking Glassは米・Looking Glass Factory社が開発した裸眼立体視用のホログラムディスプレイです。Kickstarterでゴール比1,600%以上の資金を集め、2019年初頭から一般販売がスタートしました。

    The Looking Glass: the first desktop holographic display designed for 3D creators from Looking Glass on Vimeo.

    8.9インチのStandardと15.6インチのLargeの2タイプがあり、今回手に入れたのはStandardです。親和性の高いインタラクション用のインターフェイスとしてLeapMotionがバンドルされているセットもあり、サイト上で動画を確認することができます。

    ホログラム投影には、公式サイトで紹介されているように、特許出願中の"Combination of lightfield and volumetric display"と呼ばれる技術が使われています。これは文字通りLightfield DisplayとVolumetric Displayという2つの技術を組み合わせたもので、Looking Glass Factoryのブログにその構造が紹介されています。


    それらによると45方向からのレンダリング結果を1つの画像にデコードし通常の映像信号としてHDMI経由でディスプレイに送信、レンチキュラーレンズを通しホログラム効果を実現するとのことです。LightfieldやVolumetric Displayに関しては、筆者自身理解しきれていないので詳しい説明は省きますが、名古屋大学の研究「レイヤ型LightField Displayにおけるレイヤ高解像度化の効用」や筑波大学の「多視点表示と体積表示を組み合わせた裸眼立体映像の研究」などで概要をつかめると思います。ちなみに、Looking Glassのパテントはここで読むことができます。

    Looking Glassはメガネ不要で複数人が同時に立体視を行うことができるため、様々な利用方法が考えられます。特にUnityでの表示が最初からサポートされているため、手元にあるUnityデータをそのまま表示させることができるのはとても手軽だと感じます。2月7日(木)には、バーチャルキャストがLooking Glassへの対応を発表しました。

    <2>頭部のCGモデルを表示させてみる

    筆者はこのLooking Glassを博物館的な用途で利用できないかと思い、「東京大学脳神経外科 頭部3DCGデータベース」で公開されている頭部のCGモデルをLooking Glassで表示させてみました。


    このモデルは197個のパーツから構成される詳細な頭部モデルです。これをそのままUnityにインポートしLooking Glass用のカメラを設定してみましたが、レンダリングが重すぎてまったく使えない状態でした。立体視用に45方向からのレンダリングを重ねる必要があるので重くなるのは当然です。さらに配布されているデータはかなり高解像度のメッシュなので大脳と顎部分のみの表示でも10fps以下しか出ません。

    そこで、メッシュの軽量化を試してみました。前述のように200近いメッシュファイルがあるので自動化します。ポリゴンのリダクションにはInstant Meshes、加えて穴埋めと法線のスムージングにMeshLabを使いました。

    Instant MehesはオープンソースのRemeshツールです。動作イメージは下記のビデオを観ればつかめると思います。余談ですが、開発者の1人であるWenzel Jakob氏は、オープンソースの物理ベースレンダラMitsubaの開発者でもあります。

    Instant MeshesでRemeshすると穴が開くことがあるので、MeshLabを使って穴を塞ぎます。MeshLabもオープンソースのメッシュ編集ツールです。モデリングツールではなく、スキャナなどで取得された高密度のメッシュデータに対して平滑化などのフィルタ処理を行うものです。この2つのツールを使ってPythonで一括処理をかけるスクリプトを書きました。

    
    import os
    import subprocess
    from pathlib import Path
    
    in_dir = "original_mesh"
    out_dir = "remesh"
    instantMeshesExe = "Instant Meshes.exe"
    meshlabServerExe = "C:\\Program Files\\VCG\\MeshLab\\meshlabserver.exe"
    
    def conv(in_mesh):
        out_mesh = in_mesh.replace(in_dir, out_dir)
        os.makedirs(os.path.dirname(out_mesh),exist_ok=True)    
        subprocess.run([instantMeshesExe, in_mesh, "-s", "3", "-o", out_mesh])
        subprocess.run([meshlabServerExe, "-i", out_mesh, "-o", out_mesh, "-s", "filter.mlx"])
    
    for in_mesh in Path(in_dir).glob("**/*.obj"):
        conv(str(in_mesh))
    
    

    original_meshフォルダ以下にダウンロードしたメッシュデータを置き、このスクリプトを実行すると、remeshフォルダ以下に処理されたメッシュデータが保存されていきます。やっていることは簡単で、Instant Meshでremesh処理を行い、書き出されたデータに対してMeshLabのコマンドライン版のMeshLabServerでフィルタを適用します。適用するフィルタ(filter.mlx)は下記の通りで、MeshLabで用意しました。メッシュの穴埋めを行い、法線を平滑化しています。

    
    <!DOCTYPE FilterScript>
    <FilterScript>
     <filter name="Remove Faces from Non Manifold Edges"/>
     <filter name="Close Holes">
      <Param value="30" name="MaxHoleSize" description="Max size to be closed"
      type="RichInt" tooltip="The size is expressed as number of edges composing 
      the hole boundary" / >
      <Param value="false" name="Selected" description="Close holes with selected 
      faces" type="RichBool" tooltip="Only the holes with at least one of the boundary 
      faces selected are closed" / >
      <Param value="true" name="NewFaceSelected" description="Select the newly
      created faces" type="RichBool" tooltip="After closing a hole the faces that have 
      been created are left selected. Any previous selection is lost. Useful for example 
      for smoothing the newly created holes." / >
      <Param value="true" name="SelfIntersection" description="Prevent creation of 
      selfIntersecting faces" type="RichBool" tooltip="When closing an holes it tries to 
      prevent the creation of faces that intersect faces adjacent to the boundary of the 
      hole. It is an heuristic, non intersetcting hole filling can be NP-complete." / >
     </filter >
     <filter name="Smooth Face Normals" / >
    </FilterScript >
    
    

    この処理を行なったメッシュデータをUnityにインポートした様子が下記の画像です。まだすべてのデータを表示させると重いので、一部のデータだけ表示しています。


    ちなみに、Looking Glassに出力される画像は下記のようなものになります。多視点レンダリングされている様子がわかると思います。


    レンダリングが重いこと以外に、2つ気になる点がありました。思った以上に画像が粗く見えてしまう点と、影やポストエフェクトが反映されない点です。ポストエフェクトはしくみ的に対応が難しいのかもしれません。影に関しては設定次第な気がしますが、簡単に試した限りでは反映させることができませんでした。ほかにも制限があるかもしれませんが、とても面白いデバイスだと感じており、引き続き検証を進めていきたいと思っています。次回からは、測域センサを使ったコンテンツ開発の続きを紹介していきます。



    Profile.

    高田稔則/Toshinori Takata(Codelight)
    Codelight株式会社 代表取締役・インタラクションエンジニア
    フリーランス、株式会社TBSテレビ等で映画CG制作、株式会社ソニー・コンピュータエンタテインメント(現 ソニー・インタラクティブエンタテインメント)でPS4のOSD開発などを経て2006年にCodelight株式会社を設立。インタラクティブコンテンツの制作を中核として、製造業向けのプロトタイプ開発なども行う
    www.codelight.co.jp