Reality Capture API サンプルについて

既にご案内のとおり、Forge DevCon 2017 のタイミングで長らく Beta 扱いだった Reality Capture API が、正式に Forge Platform API としてサポートされるようになりました。サンプル コードも GitHub 上の https://github.com/Autodesk-Forge/photo-to-3d-sample で公開されていますが、正式サポート時の仕様変更や ReCap Photo 製品の仕様変更等もあり、そのままダウンロードしてセットアップしても、残念ながら、うまく動作しないことが分かっています。

ここでは Beta 段階の Reality Capture API との変更点などを含め説明し、とりあえず、 https://github.com/Autodesk-Forge/photo-to-3d-sample を動作させられるよう改修してみたいと思います。なお、この影響や矛盾から、このサンプルは今後改訂される可能性がありますのでご注意ください。


Reality Capture API の処理手順

ご参考まで、現在、デベロッパ ポータルで紹介されている Reality Capture API のおおまかな処理手順は次のとおりです。

  1. 画像イメージを撮影(準備): 互いに重複するよう、対象物や景観をさまざまな角度、高さから撮影して Jpeg 画像を用意
  2. Reality Capture Forge API で認証: Reality Capture API を利用する Forge クライアント(3rd Party アプリ)でユーザ認証を得る
  3. 画像イメージをアップロード: HTTPS アクセス可能なクラウド ストレージ(AWS S3)にアップロード
  4. フォトシーンの作成: 処理オプションなどを指定して新規にフォトシーンを作成
  5. フォトシーンへに画像イメージを関連付け: 既存の URL リンクを参照するか(3. による)、直接、撮影した画像イメージをアップロード
  6. フォトシーンの処理を開始: 撮影した画像イメージの合成処理をリクエストして 3D メッシュを生成開始
  7. 処理ステータスをチェック: 処理の進捗状況をリクエストしてチェック
  8. 処理完了の通知を得るコールバックを受諾: 処理終了後に Email、または、HTTP/HTTPS コールバックを介して通知を受信
  9. 生成結果を評価/ダウンロード: 生成された出力結果のリンクをリクエストして、3D メッシュやオルソ画像をダウンロード

Beta 時からの変更点 

約 3 年の間 Private Beta の扱いを受けていた Reality Capture API ですが、正式サポートにあたって次の点が変更されることになります。なお、使用する endpoint に変更はありません。

  • 写真から 3D オブジェクトの生成時、生成されたシーンは ReCap 360 サービス(https://recap.autodesk.com/上にも表示され、閲覧が出来る。
  • 同じくに含まれる RCM ファイル、OBJ ファイルなどのファイル群は、A360 ドライブ(https://a360.autodesk.com/drive上に指定したシーン名でフォルダが作成され、個別にダウンロード出来る。
  • ReCap 360、A360 ドライブ とも、ユーザの Autodesk ID でサインインしたアカウントのみアクセス可能なことから、Reality Capture API を利用するアプリは、3-leggeed OAuth で取得する Access Token が必要となる。また、そのため、デベロッパ ポータルでのアプリ登録時には正しい Callback URL の設定が必須となり、同実装も必要。
  • https://developer.api.autodesk.com/photo-to-3d/v1/photoscene endpoint 呼び出しで指定可能なオプション内容(新エンジン Taitan 時と異なる)。
  • https://developer.api.autodesk.com/photo-to-3d/v1/file endpoint 呼び出しで画像ファイルをアップロードする際には、次の点で制限があります。
    JPEG 画像ファイルのみをサポート
    ・一回の endpoint 呼び出しでアップロード出来るファイル数は最大で 20(10 を推奨)
    ・画像ファイル 1 つの最大サイズは  128 MB
    ・メモリ内に画像の非圧縮サイズ最大サイズは 512 MB

現時点では、下記の ReCap クラウド サービスで新規に写真プロジェクトを作成出来ない、との仕様変更にともない、Reality Capture API で生成されたシーンは ReCap 360、A360 ドライブには表示されなくなっています。写真プロジェクトの作成は、過去に ReCap 360 クラウドサービス(旧名 ReCap Photo)でご紹介した方法は利用出来ません。

Autodesk ReCapのウェブページ。画面上部には「AUTODESK RECAP」のロゴが表示され、下部には新しいReCap Photoについての情報が含まれている橙色のバナーがある。

紛らわしくて恐縮なのですが、この時点でAutodesk ReMake が Autodesk ReCap Pro に統合され廃止されています。ReCap Pro 内には、同 Subscription でお使いいただける ReCap Photo が用意され(旧 ReCap 360 への名称変更前の ReCap Photo クラウド サービスとは異なる)、写真プロジェクトを新規作成出来るようになっています。

つまり、Reality Capture API 利用にはユーザ アカウント領域へのアクセスは必須ではなくなっています。このため、3-leggeed OAuth やアプリ登録時の Callback URL の設定が不要になります。


サンプルの修正手順

https://github.com/Autodesk-Forge/photo-to-3d-sample サンプルは、旧仕様に基づいて作成されているため、3-leggeed OAuth を利用し、デベロッパ ポータルでのアプリ登録時の Callback URL 設定が必要です、仕様変更でこれらは必須でななくなったため、冗長な実装になりますが、最小の変更で動作させるため、ここではそのまま利用することにします。

  1. git for Windows と Node.js をインストールされていない場合には、Forge の開発環境 の内容をご確認の上、アカウント取得とインストールを完了させてください。
  2. Forge を利用するために必要な Client ID と Client Secret(別名 Consumer Key と Consumer Secret)を取得していない場合には、Forge API を利用するアプリの登録とキーの取得 の内容に沿って、キーを取得してください。この時、アプリ登録の API 指定には Reality Capture API を、Callback URL には http://localhost.autodesk.com/callback を指定してください。
  3. https://github.com/Autodesk-Forge/photo-to-3d-sample リポジトリ ページを Web ブラウザで表示して、コピー対象の URL をページ上でクリップボードにコピーします。
  4. コマンド プロンプト を起動後、cd documents と入力してカレント フォルダを Documents フォルダに変更します。
  5. git clone コマンドでクリップ ボードにコピーした URL をパラメータに指定して、リポジトリ の内容をクライアント コンピュータにコピーします。具体的には、git clone https://github.com/Autodesk-Forge/photo-to-3d-sample.git と入力してください。リポジトリのコピーが始まります。
  6. C:Users<Windows ログイン ユーザ名>Documents フォルダ(ドキュメント フォルダ)直下に photo-to-3d-sample フォルダが作成されていることを確認の上、コマンド プロンプトで cd photo-to-3d-sample と入力してカレント フォルダを変更してください。
  7. 続いて、ノード パッケージ マネージャ(npm)を利用し、package.json 内に記載された依存関係に沿って 、Node.js 機能を拡張するパッケージ(ミドルウェア)をインストールしていきます。 npm install と入力してください。
  8. Node パッケージは photo-to-3d-sample フォルダ直下に新しく作られた node_modules フォルダにインストールされます。念のため、同フォルダが作成されていることを確認してください。
  9. このサンプルでは、Web サーバーを構築する目的で Node.js を利用します。ここでは、phototo3d.js を Adobe Brackets で開いて、下記の太字部分 2. で取得済の Client ID と Client Secret で置き換えます。
var express = require('express');
var express = require('express');
var bodyParser = require('body-parser');
var favicon = require('serve-favicon');
var async = require('async');
var unirest = require('unirest');
var ejs = require('ejs');

var app = express();app.use(bodyParser.json ());
app.use(express.static (__dirname + '/www'));
app.use(favicon (__dirname + '/www/images/favicon.ico'));
app.set('view engine', 'ejs');

var client_id = '<REPLACE_WITH_FORGE_CLIENT_ID>';
var client_secret = '<REPLACE_WITH_FORGE_CLIENT_SECRET>';
var access_token = '';
var redirect_uri = 'http://localhost.autodesk.com/callback';
  1. app ルーティング定義内の赤字の JSON.parse 行を青字行で置き換えます。下記コードでは JSON.parse をコメント化しています。
app.get('/app', function (req, res) {app.get('/app', function (req, res) {
                                :            
    //var json = JSON.parse (response.body.toString().trim()); 
    var json = response.body;
                                :
});    
  1. /app/createscene ルーティング定義内のJSON.parse 行で置き換えます。下記コードでは JSON.parse をコメント化しています。また、同様に RCM ファイルの生成を指定している ‘format’: ‘rcm’ 行を検証しやすい OBJ ファイル指定に変更します。ここでは、https://developer.api.autodesk.com/photo-to-3d/v1/photoscene endpoint を呼び出して、フォトシーンを作成しています。
app.get('/app/createscene', function (req, res) {
app.get('/app', function (req, res) {
                                :        
   .send ({
                    'scenename': sceneName,
                    //'format': 'rcm'
                    'format': 'obj'
         })
                               :
                               :
           //var json = JSON.parse (response.body.toString().trim());             
           var json = response.body;
                               :
 });
  1. /app/post ルーティング定義を置き換えます。下記コードでは JSON.parse をコメント化しています。ここでは https://developer.api.autodesk.com/photo-to-3d/v1/file endpoint を呼び出して、AWS S3 にポストされている画像イメージとフォトシーンの関連付けをしています。
app.get('/app/post', function (req, res) {app.get('/app', function (req, res) {
                                    :
            //var json = JSON.parse (response.body.toString().trim());
            var json = response.body;
                                    :
});
  1. /app/results ルーティング定義内の JSON.parse 行を置き換えます。下記コードでは JSON.parse をコメント化しています。また、同様に RCM ファイルの生成有無を指定している var endpoint = BASE_ENDPOINT + ‘/photoscene/’ + sceneId + ‘?format=rcm’; 行を OBJ ファイル指定に変更します。ここでは https://developer.api.autodesk.com/photo-to-3d/v1/photoscene/:photosceneid endpoint を使って、OBJ ファイルの生成をチェックしています。(このサンプルでは通知コールバックでの処理終了検出はしていません。)
app.get('/app/results', function (req, res) {app.get('/app', function (req, res) {
                                    :
        //var endpoint = BASE_ENDPOINT + '/photoscene/' + sceneId + '?format=rcm';
        var endpoint = BASE_ENDPOINT + '/photoscene/' + sceneId + '?format=obj';
                                    :
        //var json = JSON.parse (response.body.toString().trim());
        var json = response.body;
                                    :
});
  1. お使いになるクライアント コンピュータの Node.js で Callback URL が正しく認識されるよう、Windows の Hosts ファイルにホスト名を追記します(参考:https://support.microsoft.com/ja-jp/kb/972034)。管理者権限で起動したメモ帳で C:WindowsSystem32driversetc フォルダ直下 hosts  を開いて、最後に次の 1 行 127.0.0.1 localhost.autodesk.com を追加して上書き保存します。
# Copyright (c) 1993-2009 Microsoft Corp.
#
# This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
#
# This file contains the mappings of IP addresses to host names. Each
# entry should be kept on an individual line. The IP address should
# be placed in the first column followed by the corresponding host name.
# The IP address and the host name should be separated by at least one# space.
#
# Additionally, comments (such as these) may be inserted on individual
# lines or following the machine name denoted by a '#' symbol.
#
# For example:
#
# 102.54.94.97 rhino.acme.com 
# source server# 38.25.63.10 x.acme.com 
# x client host# localhost name resolution is handled within DNS itself.
# 127.0.0.1 localhost# ::1 localhost127.0.0.1 localhost.autodesk.com
  1. (オプション)photo-to-3d-sample フォルダ直下の www フォルダ内の index.html と、views フォルダの explore.ejs には、Forge Viewer で利用していたライブラリ参照が含まれています。このサンプルでは表示はおこないませんので、それぞれを Adobe Brackets で開いて次の3 行を削除、あるいは、コメント化することをお勧めします。
<!-- Autodesk View & Data API --> 
<link rel="stylesheet" href="https://autodeskviewer.com/viewers/2.5/style.min.css" />

<!-- script src="https://autodeskviewer.com/viewers/2.5/three.min.js">
</script --> 
<script src="https://autodeskviewer.com/viewers/2.5/viewer3D.min.js"></script>

<!-- Our scripts/css -->
<link rel="stylesheet" href="./view.css">;

サンプルの利用手順 

  1.  コマンド プロンプトを起動してカレント フォルダを Documents フォルダに変更後、node phototo3d.js と入力しても Web サーバーを起動します。
  2. Google Chrome などの WebGL 互換 Web ブラウザを起動して、URL 欄に http://localhost.autodesk.com と入力、実行してください。
  3. Authorize me とリンクが表示されたら、それをクリックします。3-legded OAuth の処理が始まります。任意の Autodesk ID とそのパスワードを入力して、(実際には何もおこないませんが)アカウントのストレージ アクセスに対しての権限認可の確認画面が表示されます。[許可] をクリックしてください。
  4. explore.ejs テンプレートによって次のページが表示されたら、「Name」欄にアルファベットでシーン名を入力し、[Create] ボタンをクリックします。
  5. シーンが作成されると、「ID created」横にシーン ID を表示します。
  6. 次に [Post] ボタンをクリックして、サンプルが参照している AWS S3 上の Jpeg 画像の Reality Capture API へのダウンロードを実行します。
  7. しばらく後に、「Nb posted」横の 7 個の Jpeg 画像のダウンロードが完了した意味の 7 と表示されます。
  8. 続いて、[Launch photoscene] ボタンをクリックして 3D オブジェクトの生成を開始します。正常に生成が開始されると、ボタンの下に Launched と表示されます。
  9. 3D 生成には時間がかかります。[Get Result] ボタンをクリックすると、obj ファイルの有無を JSON で返します。エラーが表示される場合は、まだ演算中です。
  10. 時間をおいて何度か [Get Result] ボタンをクリックした際に、次のような JSON が表示されたら、3D オブジェクトの生成が終了です。
  11. この JSON に含まれる scenelink の値が、生成された 3D オブジェクトのダウンロードリンクです。このリンクは 7 日間有効です。有効期間内に、Web ブラウザで、この URL を指定してクライアント側にファイル(この場合 obj.zip ファイル)ダウンロードすることが出来ます。
  12. ダウンロードした obj.zip ファイルを A360 ドライブにアップロードすると、Viewer 上で 3D オブジェクトを表示するこが出来ます。obj.zip ファイルは、プロジェクト ベースの A360 では変換・表示されませんので注意してください。

この状態の obj.zip ファイルを独自に Model Derivative API で変換すると、Forge Viewer 上に表示することも出来ます。表示時には Viewer でのメッシュ状表示 でご紹介した方法でメッシュ状に表示させることも可能です。

3Dメッシュモデルのワイヤーフレーム表示。画像下部には操作用のツールバーが表示されている。

     


繰り返しますが、ここでご紹介したサンプルは現在、仕様変更にともなう矛盾を含んでいます。今後、内容が改訂される可能性がありますのでご注意ください。 変更、その他情報があった際には、このブログでお知らせします。

2018年2月1日追記:https://developer.autodesk.com/en/docs/reality-capture/v1/overview/basics/にある Typical Photo to 3D Workflow の  9.Review/download processed output: Request links to processed output. View generated 3D preview mesh and ortho image via mobile (remotely) via ReCap 360 Dashboard and other Forge services. の記述は、現在の Realoty Capture API には当てはまらないとのフィードバックが開発チームからありました。将来的に再度、A360 Drive や ReCap 360 からアクセス出来るようにする計画はあるようですが、実装の予定は未定だそうです。ご迷惑をお掛けして申し訳ございません。

By Toshiaki Isezaki

Discover more from Autodesk Developer Blog

Subscribe now to keep reading and get access to the full archive.

Continue reading