APS Viewer:スクリーンキャプチャ

APS Viewer でカンバス上に表示中の状態をキャプチャ画像として取得したい場面があります。

キーボード ショートカット(Windows  の場合、例えば [Alt]+[Print Screen] キーなど)やキャプチャー ツールでアプリの表示画面をキャプチャすることが出来ますが、ウィンドウ タイトルやフレームも映り込んでしまいます。Viewer 内のツールバーやパネルも同様です。

カンバスのインターフェイスとツール設定が表示されたViewerの画面。左側には操作ボタン、右側には設定メニューがあり、バスルームのモデルが描かれている。

ツールバーやパネルなどのユーザインタフェースを排除して、純粋にカンバスの表示内容だけをキャプチャしたい場合には、getScreenShot メソッドを利用することが出来ます。

_viewer.getScreenShot(_viewer.container.clientWidth, _viewer.container.clientHeight,);

上記のように使用すると、ブラウザ上に新しいタブが開かれて、キャプチャした画像が表示されます。なお、上記コード中の _viewer は Viewer インスタンスを格納する変数です。NOP_VIEWER に置き換えて考えることも可能です。

キャプチャ画像をファイルとして入手したい場合には、第3パラメータにコールバックを設定して Blob URL からダウンロードすることも出来ます。

_viewer.getScreenShot(_viewer.container.clientWidth, _viewer.container.clientHeight, function (blobURL) {
const a = document.createElement('a');
document.body.appendChild(a);
a.href = blobURL;
console.log(a.href);
a.download = 'captured screen.png';
a.click();
document.body.removeChild(a);
});

使用する「環境」にもよりますが、先のバスルームのように、「周囲光の影」(Ambient Occlusion)が投げかける影によって表現したいモデルがくすんで見えたり、強調したい微細な箇所が明瞭にならない場合も出てきます。次の例は、[グリッドライト] 環境選択時に「周囲光の影」をオンにした状態の Viewer 画面です。

3Dモデリングアプリケーションのインターフェースが表示されている画面。時計の内部メカニズムのデザインが示され、左側に操作ボタンや設定メニューが配置されている。

「周囲光の影」設定は、setQualityLevel メソッドの第1パラメータで指定することが出来ます。このパラメータ値を false で「周囲光の影」をオフにしてから、キャプチャすると、オン時よりも明瞭な形状確認が出来る場合があります。

_viewer.setQualityLevel(false, true);
精密な機械式時計のクローズアップ画像。時計の内部機構が見える透明な文字盤と、複雑な歯車が特徴的。背景はぼかされている。

Forge Viewer:簡単なシーン カスタマイズ でもご紹介したように、Viewer 内の「環境」はプログラムからもコントロールすることが出来るので、環境変更後にキャプチャすることも可能です。次の例は、先のパスルームについて、[寒色ライト] 環境に、また、「周囲光の影」をオフに、それぞれ設定を変更してからキャプチャした画像です。

バスルームの3D表示で、バスタブ、洗面台、窓、棚に置かれた小物が見えるシーン。

なお、Autodesk.Viewing.MarkupsCore エクステンションを利用したマークアップは、getScreenShot メソッドのみではキャプチャされませんのでご注意ください。

3Dモデルのバスルームの表示画面。カスタムマークアップツールが表示され、画面上には「要別色味提案」と「他コック形状あり?」というテキストが記載されています。

カンバス上の内容と同時にマークアップもキャプチャしたい場面では、MarkupsCore エクステンションの renderToCanvas メソッドを併用する必要があります。

let screenshot = new Image();
screenshot.onload = async function () {
let canvas = document.createElement('canvas');
canvas.width = _viewer.container.clientWidth;
canvas.height = _viewer.container.clientHeight;
let ctx = canvas.getContext('2d');
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.drawImage(screenshot, 0, 0, canvas.width, canvas.height);
_markup = _viewer.getExtension('Autodesk.Viewing.MarkupsCore');
_markup.show();
_markup.loadMarkups(_markupsPersist, "layer1");
_markup.renderToCanvas(ctx, function () {
const a = document.createElement('a');
document.body.appendChild(a);
a.href = canvas.toDataURL();
console.log(a.href);
a.download = 'captured screen.png';
a.click();
document.body.removeChild(a);
_markup.hide();
}, true);
};
_viewer.getScreenShot(_viewer.container.clientWidth, _viewer.container.clientHeight, function (blobURL) {
screenshot.src = blobURL;
});
バスタブのデザインが表示されている3Dシーン。タオル掛け、洗面台、さらなる色の提案と異なる蛇口の形状に関する矢印が描かれている。

Viewer なので、標準の「一人称視点」ツールで周囲を見回したり、歩き回ってしたりして、ビューを調整してからキャプチャすることも可能です。

アプリのキャプチャツールでカンバス表示中のインターフェースを含む画面を表示しているシーン

この他にも、個々のオブジェクトの非表示状態(「ゴースト非表示オブジェクト」)に加えて、「断面解析」ツールや「分解モデル」ツールの操作内容もキャプチャされるので、特定の視点を記録する機能として便利です。ただし、「計測」ツールでツールチップ上に表示される計測値はキャプチャ出来ません。

左側に3D建築モデルのワイヤーフレーム表示、右側に分解された機械部品の視覚化。

By Toshiaki Iezaki

Discover more from Autodesk Developer Blog

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

Continue reading