カメラ制御
カメラ制御の一連のサンプルは、ハードウェアAPIを使用する方法を示します。このサンプルは4つのパートに分かれており、各パートでAPIの異な る機能(ネイティブとJavaScriptの両方)について説明します。一連のサンプルの終わりには、APIの概要が一通り理解できます。
カメラの設定方法
このシリーズの最初の部分では、Wikitude SDKで可能なことの概要を紹介します。
カメラの位置
カメラの位置は、前面、背面、またはデフォルトのカメラを起動するかどうかを定義します。これは、ArchitectStartupConfiguration.setCameraPosition
または AR.hardware.camera.position
を使用して設定できます。
カメラフォーカスモード
カメラのフォーカスモードは、カメラが内部的に使用するフォーカスモードを定義します。 これは、ArchitectStartupConfiguration.setCameraFocusMode
または AR.hardware.camera.focusMode
を使用して設定できます。
カメラフォーカスモードは、以下のモードのいずれかになります。
- Continuous(連 続):デバイスがサポートしている場合はデフォルト。このモードではカメラは必要に応じて自動的に再フォーカスしようとします。
- ONCE(一度):現在の ビューでカメラを一度再フォーカスさせることができます。フォーカスを変更する必要が ある場合は、この値を再度設定できます。ONCEの値が設定されるたびに、カメラは現 在のシーンに再びフォーカスしようとします。
- OFF: オート フォーカスを無効にし、手動フォーカス距離で指定されていない場合は、無限遠フォーカスにフォーカスを移動します。このモードは、手動フォーカス距離を設定するための前提条件です。
手動カメラフォーカス
マニュアルカメラフォーカス
は手動でフォーカスを設定することができ、
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
}
}
また、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);
}
[Camera Control]ボタンを押すと別のパネルが表示され、その他の使用可能なコントロールが表示されます。
- Zoom(初期設定は1): ズーム倍率の範囲は1~最大値(デバイスの能力によって異なります)です。
- Autofocus: オンにすると、カメラの連続オートフォーカス機能が有効になります。オフにすると、カメラのフォーカスは現在フレーム内にある被写体に固定されます。
- Manual Focus Distance(初期設定は0): マニュアルフォーカス距離の範囲は0.0~1.0です。
- Flashlight: このボックスをオンにすると、フラッシュのオン/オフを切り替えることができます。
カメラのズームを使用するには、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;
},
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;
}
},
マニュアルフォーカス距離ににアクセスするには、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";
}
フラッシュにアクセスするには、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;
},
UIコントロールでは直接表示されない機能は、touch to focus code>と
touch to expose code>です。
この例では、
AR.hardware.camera.setFocusPointOfInterest
とAR.hardware.camera.setExposurePointOfInterest
のAPIを使用して、ユーザーの入力に基づいてカメラのフォーカスおよび露出ポイントを定義します。
このAPIの最も一般的な使用例は、AR.context.onScreenClick
コールバックに接続し、提供されたスクリーン座標を使用して、この座標でカメラを再フォーカスまたは再展開することです。
AR.context.onScreenClick = function (touchLocation) {
AR.hardware.camera.setFocusPointOfInterest = touchLocation;
AR.hardware.camera.setExposurePointOfInterest = touchLocation
}
実際のユーザーと対話せずに、座標を手動で指定することもできます。