カメラ制御

カメラ制御の一連のサンプルは、ハードウェアAPIを使用する方法を示します。このサンプルは4つのパートに分かれており、各パートでAPIの異な る機能(ネイティブとJavaScriptの両方)について説明します。一連のサンプルの終わりには、APIの概要が一通り理解できます。

カメラの設定方法

このシリーズの最初の部分では、Wikitude SDKで可能なことの概要を紹介します。

カメラの位置

カメラの位置は、前面、背面、またはデフォルトのカメラを起動するかどうかを定義します。これは、ArchitectStartupConfiguration.setCameraPosition または AR.hardware.camera.positionを使用して設定できます。

カメラフォーカスモード

カメラのフォーカスモードは、カメラが内部的に使用するフォーカスモードを定義します。 これは、ArchitectStartupConfiguration.setCameraFocusMode または AR.hardware.camera.focusModeを使用して設定できます。 カメラフォーカスモードは、以下のモードのいずれかになります。

手動カメラフォーカス

マニュアルカメラフォーカス は手動でフォーカスを設定することができ、 ArchitectStartupConfiguration においてcamera2が有効で、かつデバイスがサポートしている場合にのみ使用できます。 手動 フォーカスが使用可能かどうかをチェックするには、AR.hardware.camera.manualFocusAvailableを 使用します。 焦点距離は0から1の範囲であり、0は最も近い焦点 、1は無限遠焦点です。 これは、 ArchitectStartupConfiguration.setCameraManualFocusDistanceまたは AR.hardware.camera.focusDistanceを使用して設定できます。

Camera2 API の使用

SDKでは、従来のカメラAPI(非推奨のGoogle Sind Android 5.0以降)または新しいCamera2 APIのいずれかを使用できます。 camera2 APIは、手動フォーカスのような多くの手動カメラ機能を可能にします。 camera2 APIは一部のデバイスでは完全に動作していないため、デフォルトでは無効になっており、NativeStartupConfiguration.setCamera2Enabledを使用して有効にすることができます。

現在、排他的なcamera2の機能は次のとおりです。

カメラの解像度

 ArchitectStartupConfiguration.setCameraResolution を使用して設定でき、実行時に変更することはできません。 推奨値は次のとおりです。

推奨値 Geo Image Tracking Extended Tracking Cloud Recognition Instant Tracking
CameraSettings.CameraResolution AUTO AUTO SD_640x480 SD_640x480 SD_640x480

この設定はarmv8デバイスでのみ使用され、他のすべてのアーキテクチャはデフォルトでSD_640x480になります。

カメラズーム

デジタルズームは、AR.hardware.camera.zoomを使用して制御できます。

フラッシュライト

フラッシュライトは、AR.hardware.camera.flashlight使用してオンとオフを切り替えることができます。

フロントカメラの使用方法

対応するサンプルタイトル名「Front Camera」

サンプルの最初のパートでは、デバイスのフロントカメラ(搭載されている場合)を使用して8つのコンパス方位にPOIデータを表示します。各POI データはローカルリソースのJSONファイルからロードし、POIデータごとに異なるオフセット値を使用してユーザーの周囲の異なる方向に配置しま す。

POIデータをローカルリソースからロードしてARchitectViewに表示する方法は、 基 となるPOIデータの取得方法 サンプルですでに説明しました。

このサンプルは、デバイスのフロントカメラを使用してARchitectViewを初期化する方法を示します。

onCreate()メソッドのパラメーターとしてStartupConfigurationを 使用して、起動時にフロントカメラをアクティブにするようSDKを構成できます。実装例を以下に示します。

     @Override
    public void onCreate( final Bundle savedInstanceState ) {
        super.onCreate( savedInstanceState );
        final StartupConfiguration config = new StartupConfiguration(
            licenseKey,
            StartupConfiguration.Features.Geo,
            StartupConfiguration.CameraPosition.FRONT
        );
        this.architectView.onCreate( config );
    }

デバイスにフロントカメラがない場合、デフォルトのシステムカメラが使用されます。

カメラの切り替え方法

対応するサンプルタイトル名「Camera Switching」

2番目のパートでも同じPOIデータを使用しますが、ARchitectViewはデフォルト構成で起動します。

ユーザーは[Switch Camera]ボタンを押してフロントカメラとバックカメラを切り替えることができます。ボタンはindex.htmlで 定義されており、クリック時にWorld.switchCam()を呼び出します。

    /*
     * Switch between front and back camera
     */
    switchCam: function switchCamFn() {
        if (AR.hardware.camera.position == AR.CONST.CAMERA_POSITION.FRONT) {
            AR.hardware.camera.position = AR.CONST.CAMERA_POSITION.BACK
        } else {
            AR.hardware.camera.position = AR.CONST.CAMERA_POSITION.FRONT            
        }
    }
ソースコードをGitHubで 見る

また、Markerコンストラクター関数により、マーカーのタイトルおよび説明のmirroredフ ラグが設定されます。実装方法の詳細については、marker.jsを参照してください。奇数番のPOIデータはタイトル が鏡像反転し、偶数番のPOIデータは説明が鏡像反転します。

このフラグは、バックカメラを通してARchitect Worldを見たときには効果がありません。フロントカメラを使用すると、Labelオ ブジェクトとHTMLDrawableオ ブジェクトを除くすべてのオブジェクトがカメラ画像のように鏡像反転します。mirroredフラグを設定することで、こ のデフォルトの動作をオーバーライドできます。

高度なカメラ機能の使用方法

対応するサンプルタイトル名「Camera Control」

3番目のサンプルは、ハードウェアアクセスAPIの残りの機能の使用方法を示します。

[Camera Info]ボタンを押すと、デバイスのカメラで使用可能なハードウェア機能に関する情報が表示されます。

    // display camera info panel
    showCamInfo: function showCamInfoFn() {
        // update panel values
        var features = AR.hardware.camera.features;
        $("#camera-focus-modes").html(features.focusModes.join());
        $("#camera-positions").html(features.positions.join());
        $("#camera-zoom-max").html(Math.round(features.zoomRange.max));
        // show panel
        $("#panel-caminfo").panel("open", 123);
    }
ソースコードをGitHubで 見る

[Camera Control]ボタンを押すと別のパネルが表示され、その他の使用可能なコントロールが表示されます。

カメラのズームを使用するには、AR.hardware.camera.zoomの 値を取得または変更します。

    // udpates values shown in "control panel"
    updateRangeValues: function updateRangeValuesFn() {
        // get current slider value (0..100);
        var slider_value = $("#panel-zoom-range").val();
        // zoom level (1 up to max available)
        var maxRangeValue = Math.round((AR.hardware.camera.features.zoomRange.max - 1) * (slider_value / 100) + 1);
        // update UI labels accordingly
        $("#panel-zoom-value").html(maxRangeValue);
        AR.hardware.camera.zoom = maxRangeValue;
    },
ソースコードをGitHubで 見る

AR.hardware.camera.focusModeの 値はカメラのフォーカスモードを表しており、AR.CONST.CAMERA_FOCUS_MODE.CONTINUOUSま たはAR.CONST.CAMERA_FOCUS_MODE.ONCEに設定できます。

デバイスが連続モードをサポートしている場合は、このモードがデフォルトになります。このモードでは、必要なときにフォーカスが自動調整されます。

フォーカスモードをONCEに設定すると、フォーカスが現在のビューに合わせて一度だけ調整されます。フォーカスを変更 する場合は、この値をもう一度設定します。値ONCEを設定するたびに、フォーカスが現在のシーンに合わせて調整されま す。

    // udpates values shown in "control panel"
    updateFocusMode: function updateFocusModeFn() {
        // get current checkbox status
        var check_value = $("#panel-focus-auto").is(":checked");
        if (check_value) {
            AR.hardware.camera.focusMode = AR.CONST.CAMERA_FOCUS_MODE.CONTINUOUS;
        } else {
            AR.hardware.camera.focusMode = AR.CONST.CAMERA_FOCUS_MODE.ONCE;
        }
    },
ソースコードをGitHubで 見る

マニュアルフォーカス距離ににアクセスするには、AR.hardware.camera.manualfocusdistanceの値を取得または変更します。

AR.hardware.camera.manualFocusDistance = parseInt(slider_value) / 100;

すべてのデバイスがこの機能をサポートしているわけではないので、AR.hardware.camera.manualFocusAvailable を使用して手動フォーカスが利用可能かどうかを調べることができます。 このサンプルでは、必要に応じてスライダーを隠すためにこれを使用しています。

if (!AR.hardware.camera.manualFocusAvailable) {
    document.getElementById("panel-focus-distance").style.display = "none";
}
ソースコードをGitHubで 見る

フラッシュにアクセスするには、AR.hardware.camera.flashlightの 値を取得または変更します。

    // updates values shown in "control panel"
    updateFlashlight: function updateFlashlightFn() {
        // get current checkbox status
        var check_value = $("#panel-flashlight").is(":checked");
        AR.hardware.camera.flashlight = check_value;
    },
ソースコードをGitHubで見る

UIコントロールでは直接表示されない機能は、touch to focustouch to exposeです。 この例では、AR.hardware.camera.setFocusPointOfInterestAR.hardware.camera.setExposurePointOfInterestのAPIを使用して、ユーザーの入力に基づいてカメラのフォーカスおよび露出ポイントを定義します。 このAPIの最も一般的な使用例は、AR.context.onScreenClickコールバックに接続し、提供されたスクリーン座標を使用して、この座標でカメラを再フォーカスまたは再展開することです。

AR.context.onScreenClick = function (touchLocation) {
    AR.hardware.camera.setFocusPointOfInterest = touchLocation;
    AR.hardware.camera.setExposurePointOfInterest = touchLocation
}

実際のユーザーと対話せずに、座標を手動で指定することもできます。