Wacom WebPlugin Feel™ Multi-Touch API

LINEで送る

更新情報

2011年9月24日 V1.0 初版公開 RCC
2012年5月9日 V1.1 Modesプロパティに関する記述を追加 RCC


INDEX


詳細

1 概要

このドキュメントでは、Wacom WebPluginコンポーネントのWacom Feel™ Multi-Touchサポート用APIについて説明します。WebPluginモジュールは、Wacom Feel™ Multi-Touch API [Loftus2011]のサブセットです。Loftus2011では、サポートされているWacom Feel™ Multi-Touch対応タブレットからフィンガータッチデータにアクセスできます。すべてのWacomブランドのタブレットが、Feel™ Multi-Touch機能をサポートしているわけではありません。Feel™ Multi-Touch API対応のタブレットは、WebPlugin APIによって認識されます。開発者は、そのタブレットのマルチタッチプロパティをクエリし、フィンガータッチデータを取得できます。 Feel™ Multi-Touch APIは、同じプラグインでサポートされているWintabペンインタフェースAPIと合わせて使用できます。タブレットが同時にペンデータとタッチデータをサポートしている場合、ペンが近い場合でもWebアプリケーションはタッチデータを取得し続けます。タブレットがこれをサポートしていない場合、ペンはタッチよりも優先されます。つまり、ペンが近い場合でもタッチデータは送信されません。WebPlugin Feel™ Multi-Touch APIは、ペンの近接性について処理または通知を行いません。アプリケーションがペンストロークによって解釈されたタッチストロークに対して特殊な処理を行う必要がある場合、アプリケーションは両方のAPIを監視する必要があります。

1.1 サポートされているバージョン

WebPlugin Feel™ Multi-Touch APIは、次のコンポーネントでサポートされています。

  • WebPlugin:バージョン2.0以降
  • タブレットドライバ:バージョン5.2.5以降
  • WebPluginは、次のブラウザとオペレーティングシステムでサポートされています(記載バージョンは最低限です)。
Windows 7、Vista、XP Mac OSX 10.5.8、10.6
Firefox v4 はい はい
Safari v5 はい はい
Chrome v10 はい n/a
Internet Explorer v8 はい n/a

1.2 WebPluginの使用法

簡単に言うと、WebPluginは、Feel™ Multi-Touch APIプロパティとイベントにアクセスするためにjavascriptプログラムで使用されます。その上で、javascriptプログラムを含むHTMLページを、サポートされているブラウザコンポーネント(Canvasなど)、他のプラグイン(Adobe Flashなど)、フレームワーク(Silverlightなど)で使用できるようになります。WebPluginを使用すると、Feel™ Multi-Touch APIの初期化の大半は自動的に実行されるので、開発者はアプリケーションに集中できます。WebPluginの詳細な使用方法については、[Cohn2011]を参照してください。 このドキュメントでは、さまざまなFeel™ Multi-Touch APIのプロパティ、データ、およびイベント処理を示すjavascriptコードのスニペットを記載しています。

1.3 サンプルデモと関連リソース

WebPlugin Feel™ Multi-Touch APIサンプルコードと関連ドキュメントについては、http://www.wacomeng.com/ を参照してください。

2 WebPlugin Feel™ Multi-Touch APIプロパティ

2.1 TouchRawFingerData

最初に見つかったタッチデバイスからユーザーに最新の未処理フィンガータッチデータを返します。

2.1.1 パラメータ:
deviceID Int

TouchDeviceCapabilitiesもしくは、TouchDeviceIDListから取得したdeviceIDを指定します。
有効なID以外のdeviceIDを指定すると、FB::VariantMapのStatusフラグはエラーを示します。

2.1.2 戻り値:

FB::VariantMapは下記のメンバーで構成されています。

NumFingers	Int			// このデータパケットのフィンガー数
DeviceID	Int			// データの送信元デバイス
Status		Int			// データが有効かどうかを示す(下記を参照)
FingerList	FB::VariantList		// フィンガーデータのリスト
		FingerList[0]
			FB::VariantMap	// Finger1のデータ
			FingerID	Int	// データパケットで指定
			PosX		float	// APIから渡されたX座標(下記を参照)
			PosY		float	// APIから渡されたY座標(下記を参照)
			Width		float	// フィンガーコンタクトエリアの論理的な幅
			Height		float	// フィンガーコンタクトエリアの論理的な高さ
			Orientation	float	// フィンガーコンタクトの垂直線からの楕円の角度
			Confidence	Int	// ドライバが有効なタッチと判断した場合はtrue
			Sensitivity	Short	// コンタクトの強さ
			FingerState	Int	// 現在の指の最後の動き(下記を参照)
		FingerList[1]
			FB::VariantMap	// Finger2のデータ
			FingerID	Int
			PosX		float
			PosY		float
			Width		float
			Height		float
			Orientation	float
			Confidence	Int
			Sensitivity	Short
			FingerState	Int
		...

返されたFB::VariantMapのサイズは、最後のタッチデータパケットの指の数によって決まります。動的なFB::VariantMapがサポートされていない場合、プラグインは10本の指用にマップを事前に割り当て、最新のタッチAPIデータパケットからデータの指の数を指定します。

NumFingers – 最新のデータパケットで検出された指の数。WebPluginは、指ごとのタッチデータを指定します。
DeviceID – タッチデータの入力元タブレットの固有のID
Status – 返されたFB::Variantに有効なデータが含まれているかどうかを示します。データが有効な場合、Statusはゼロになります。データが無効な場合、Statusは-1になります。
PosXおよびPosY -
不透明タブレットに対する0~1.0の論理単位です。
統合タブレットに対する仮想デスクトップ範囲のピクセル画面座標です。**
WidthおよびHeight – フィンガーコンタクトの論理的な幅と高さを表します。*
Sensitivity – コンタクトの強さ。これは筆圧ではありません。これは、コンタクトポイントの強さを示すデバイス/ユーザー固有の指標です。同じフレーム/ジェスチャー内の他の指に関連する場合にのみ有効です。*
Orientation – フィンガーコンタクトの垂直線からの楕円の角度*
FingerState = 0(不明)、1(Down = 指が下りた)、2(Hold = 指が触れたまま)、3(Up = 指が上がった)
Move(移動)状態はないので注意してください。Hold状態は、指の位置が変わると移動として解釈されることがあります。

2.1.3 サンプルJavascriptの使用:
var deviceID = plugin.touchAPI.TouchDeviceIDList[0];
var fingerdata  = plugin.touchAPI.TouchRawFingerData(deviceID);
var numFingers = fingerdata.NumFingers;
var status = fingerdata.Status;
if ( status == 0 )
{
	var finger1= FingerData.FingerList[0];
	var finger1ID = finger1.FingerID;
	if (finger1.Confidence == 1 && finger1.FingerState != 0)
	{
		var finger1PosX = finger1.PosX;
		var finger1PosY = finger1.PosY;
		...
	}
	var finger2 = FingerData.FingerList[1];
	etc...
}
2.1.4 設計上の注:

FB::VariantMapとFB::VariantListは、サポートされているFirebreathバリアント型です。 プラグインの初期化に際し、プラグインは次の操作を実行します。

  • タッチAPIとWacomMTInitialize()の接続を初期化します
  • アタッチされているタッチデバイスをWacomMTRegisterAttachCallback()で登録します。その際、すべてのプラグインタッチAPI構造を初期化します。
  • デタッチされているタッチデバイスをWacomMTRegisterDetachCallback()で登録します。その際、すべてのプラグインタッチAPI構造を削除/消去します。
  • WebPluginクライアントは、データをポールするか、TouchDataEventを使用します(下記を参照)。

プラグインの破棄に際し、プラグインは次の操作を実行します。

  • WacomMTQuit()を呼び出し、タッチドライバサービスとの接続を閉じ、すべてのプラグインタッチAPI構造を削除/消去します。

プラグインの破棄に際し、プラグインは次の操作を実行します。

  • WacomMTQuit()を呼び出し、タッチドライバサービスとの接続を閉じ、すべてのプラグインタッチAPI構造を削除/消去します。

2.2 TouchDeviceCapabilities

指定したタッチデバイスの機能を返します。

2.2.1 パラメータ:
deviceID Int

TouchDeviceIDListから取得したdeviceIDを指定してください。

2.2.2 戻り値:

FB::VariantMapは下記のメンバーで構成されています。

Version		Int	// データ構造バージョン
DeviceID		Int	// このデバイスのID
DeviceType		Int	// WacomMTDeviceType値		
MaxFingers		Int	// デバイスでサポートされている指の最大数
ReportedSizeX		Int	// X方向のタッチポイントの数
ReportedSizeY		Int	// Y方向のタッチポイントの数
PhysicalSizeX		float	// デバイスのアクティブタッチ面の幅(mm)
PhysicalSizeY		float	// デバイスのアクティブタッチ面の高さ(mm)
LogicalOriginX	float	// デバイスの最小X。デバイスが表示よりも大きい場合はマイナスになる可能性があります
LogicalOriginY	float	// デバイスの最小Y。デバイスが表示よりも大きい場合はマイナスになる可能性があります
LogicalWidth		float	// デバイスの論理的な幅。MaxX = LogicalOriginX + LogicalWidth
LogicalHeight		float	// デバイスの論理的な高さ。MaxY = LogicalOriginY + LogicalHeight

呼び出しに失敗した場合、返されたFB::VariantMapはVersion == -1になります。

2.2.3 サンプルJavascriptの使用:
var deviceID = plugin.touchAPI.TOuchDeviceIDList[0];
var touchDeviceCaps = plugin.TouchAPI.TouchDeviceCapabilities(deviceID);
var maxNumFingers = touchDeviceCaps.MaxFingers;
var maxXTouchPoints = touchDeviceCaps.ReportedSizeX;
var maxYTouchPoints = touchDeviceCaps.ReportedSizeY;
etc...
2.2.4 設計上の注:

上記の通り、このAPIの初期リリースは正当なdeviceIDとして-1のみを認識します。そのため、返された機能は、deviceID = -1が使用されているときに最初に見つかったタッチデバイス用です。この構造で返されたDeviceID値は、deviceIDを必要とする別のタッチAPIプロパティ(TouchRawFingerData、Open、Close)で使用できます。

2.3 TouchDeviceIDList

アタッチされたタッチデバイスIDのリストを返します。

2.3.1 パラメータ:

なし

2.3.2 戻り値:

アタッチされたタッチデバイスIDのFB::VariantList。タッチデバイスIDがアタッチされていない場合、配列のサイズはゼロです。

2.3.3 サンプルJavascriptの使用:
_touchDeviceIDList = plugin.touchAPI.TouchDeviceIDList;
2.3.4 設計上の注:

返されたリストは、アクティブなタッチデバイスのリストから構築されます。リストはプラグインで保持されます。その際、プラグインがタッチAPIからAttachメッセージを受信したときに新しくアタッチされたデバイスを追加するか、プラグインがタッチAPIからDetachメッセージを受信したときにタッチデバイスをリストから削除します。

2.4 Open

指定したデバイスにアタッチし、そのデバイスのデータがクライアントに送信されるようにクライアントのタッチAPIを初期化するメソッドです。クライアントは、タッチデータがシステムに渡されないように接続することも、タッチデータがクライアントに渡され、システムにデータが送信されるように接続することもできます。

2.4.1 パラメータ:
deviceID	Int	// 指定したdeviceIDのタッチデバイスを開きます
			deviceIDはTouchDeviceIDListもしくは、TouchDeviceCapabilitiesから渡されます 
passThru	Int	// 1:データがシステムに渡されます。0:データはシステムに渡されません
2.4.2 戻り値:

成功の場合は0、エラーの場合は0以外

2.4.3 サンプルJavascriptの使用:
var caps = plugin.TouchAPI.TouchDeviceCapabilities(-1);// 最初のタッチデバイスの機能を取得します

次のいずれかが機能します。

var status = plugin.touchAPI.Open(caps.DeviceID, 0);	// 指定デバイスを開きます
var status = plugin.touchAPI.Open(plugin.touchAPI.TouchDeviceIDList[0], 0);
2.4.4 設計上の注:

このメソッドが呼び出されると、プラグインは次の操作を実行します。

  • 次の引数を指定したWacomMTRegisterFingerReadCallback()で、タッチデータを登録します。
hitRect = NULL – タブレット面をすべて使用します
mode = passThru = 0 -> ProcessingModeAPIOnly; passThru = 1 -> ProcessModeOS
ProcessingModeAPIOnly = クライアントのみがタッチデータを取得します
ProcessModeOS = クライアントとシステムの両方がタッチデータを取得します
fingerCallback = WebPlugin APIで使用するためにタッチデータをキャッシュするプラグインハンドラ
userData = NULL(この使用についてはまだ考えていません)
  • 現在のところ、あらゆるデータをユーザーに渡す予定です(-1が使用されているためです)が、将来的には、指定したdeviceIDに合致するデータのみを転送します

2.5 Close

このメソッドは、指定したデバイスからクライアントをデタッチし、そのデバイスからもタッチデバイスからも、データがこれ以上クライアントに送信されないようにします。

2.5.1 パラメータ:
deviceID Int	// -1 -> すべてのタッチデバイスを閉じます。または、deviceIDで指定したタッチデバイスを閉じます
		TouchDeviceCapabilitiesから渡されます
2.5.2 戻り値:

成功の場合は0、エラーの場合は0以外

2.5.3 サンプルJavascriptの使用:

次のいずれかが機能します。

var status = plugin.touchAPI.Close (-1);			// すべてのデバイスを閉じます
var status = plugin.touchAPI.Close (caps.DeviceID);	// 指定したデバイスを閉じます
2.5.4 設計上の注:
  • WacomMTRegisterFingerReadCallback()でfingerCallback引数をNULLに設定し、タッチデータの登録を解除します。

2.6 Modes

このメソッドでは、さまざまな条件に対してプラグインを設定できます。現時点でサポートされている条件は次のとおりです。

  1. CHILD_BIT:プラグインをブラウザの子プロセスまたはブラウザのメインスレッドで実行するようにAPIに指示します。この設定を使用すると、子プロセスでプラグインを開始するか、メインスレッドでプラグインを開始するブラウザでプラグインが実行されるようAPIに設定を指示できます。現在、ほとんどのブラウザ(Internet Explorer、Firefox、Chromeなど)は、別のプロセスでプラグインを開始します。これにより、失敗したプラグインでブラウザ全体がクラッシュすることを防ぐことができます。プラグインAPIは、デフォルトでは子プロセスで実行されることを想定していますが、その動作をオフにし、WebPluginをメインスレッドで実行するように切り替えることができます。

  2. OBSERVER_BIT:タッチコンシューマまたはタッチオブザーバとして実行されるようにプラグインを設定します。この設定を使用すると、オブザーバモードまたはコンシューマモードで実行されるようにプラグインを設定できます。オブザーバモードで、プラグインはタッチデータを処理し、タッチデータをシステムに渡します。渡されたタッチデータは、別のアプリケーションやシステムでジェスチャーやカーソル移動を実行するために使用できます。コンシューマモードでは、プラグインはタッチデータを処理しますが、システムにはデータを渡しません。
2.6.1 パラメータ:
mode Int	// 条件のビット単位のOR:
		// CHILD_BIT:	0x00000001 -> プラグインが子ブラウザプロセスにあることを前提としています
		// OBSERVER_BIT:0x00000010 -> プラグインはデータをシステムに渡します(オブザーバ)
		// デフォルトでは、プラグインはコンシューマとして子ブラウザプロセスで実行されます。
2.6.2 戻り値:

成功の場合は0、エラーの場合は0以外

2.6.3 サンプルJavascriptの使用:
// プラグインがブラウザのメインスレッドで実行され、コンシューマになるようにAPIに指示します
var status = plugin.touchAPI.Modes (0);
var status = plugin.touchAPI.Modes (1);	// プラグインが子プロセスで実行され、コンシューマになるようにAPIに指示します
var status = plugin.touchAPI.Modes (3);	// プラグインが子プロセスで実行され、オブザーバになるようにAPIに指示します
2.6.4 設計上の注:

大半のブラウザでは、メインブラウザスレッドでプラグインを実行するためにモードを変更する必要はありません(現時点で認識している限りではOperaが唯一の例外です)。
アプリケーションのブラウザウィンドウにフォーカスがあるときにタッチデータを処理するために他のアプリケーションまたはシステムが不要な場合は、オブザーバビットを設定します。

3 WebPlugin Feel™ Multi-Touch APIイベント

3.1 TouchDataEvent

タッチデータを受信したときに生成されます。クライアントのハンドラは、このイベントを受信すると、データをクエリできます(下記を参照)。

3.1.1 プラグインイベント名
“onTouchDataEvent”
3.1.2 サンプルJavascriptの使用

イベントの登録:

if (window.addEventListener)
{
	obj.addEventListener("TouchDataEvent", touchDataHandler, false);
}
else
{
	obj.attachEvent("onTouchDataEvent", touchDataHandler);
}

イベントの関数ハンドラ:

function touchDataHandler()
{
	// TouchRawFingerDataを使用してキャッシュデータをクエリします
	// クライアント表示エリアでフィンガーデータを処理/描画します
}
3.1.3 設計上の注

プラグインは、下記を使用してこのイベントを登録します。

registerEvent(“onTouchDataEvent”);

プラグインは、受信側FingerReadイベントのタッチAPIから通知を受信すると、 下記を使用してクライアントに通知を発行します。

this->FireEvent(“onTouchDataEvent “);

3.2 TouchDeviceAttachEvent

3.2.1 プラグインイベント名
“onTouchDeviceAttachEvent”
3.2.2 サンプルJavascriptの使用

イベントの登録:

if (window.addEventListener)
{
	obj.addEventListener("TouchDeviceAttachEvent", touchDeviceAttachHandler, false);
}
else
{
	obj.attachEvent("onTouchDeviceAttachEvent ", touchDeviceAttachHandler);
}

イベントの関数ハンドラ:

function touchDeviceAttachHandler ()
{
	// タッチデバイスの現在のリストを取得し、最初のデバイスを開きます。
	_touchDeviceIDList = plugin.touchAPI.TouchDeviceIDList;
	_touchDeviceID = _touchDeviceIDList[0];
	plugin.touchAPI.Open(_touchDeviceID, 0);
}
3.2.3 設計上の注

プラグインは、下記を使用してこのイベントを登録します。

registerEvent(“onTouchDeviceAttachEvent “);

プラグインは、AttachイベントのタッチAPIから通知を受信すると、 下記を使用してクライアントに通知を発行します。

this->FireEvent(“onTouchDeviceAttachEvent”);

3.3 TouchDeviceDetachEvent

3.3.1 プラグインイベント名
“onTouchDeviceDetachEvent”
3.3.2 サンプルJavascriptの使用

イベントの登録:

if (window.addEventListener)
{
	obj.addEventListener("TouchDeviceDetachEvent", touchDeviceDetachHandler, false);
}
else
{
	obj.attachEvent("onTouchDeviceDetachEvent", touchDeviceDetachHandler);
}

イベントの関数ハンドラ:

function touchDeviceDetachHandler ()
{
	// 現在のタッチデバイスへの接続を閉じます
	plugin.touchAPI.Close(_touchDeviceID);
}
3.3.3 設計上の注

プラグインは、下記を使用してこのイベントを登録します。

“onTouchDeviceDetachEvent”

プラグインは、DetachイベントのタッチAPIから通知を受信すると、 下記を使用してクライアントに通知を発行します。

this->FireEvent(“onTouchDeviceDetachEvent”);

4 参照

[Cohn2011] Robert Cohn, EN-0265:WebPlugin User Notes, Version 1.0, 5/29/2011.
[Loftus2011] Ken Loftus, EN-0269:Branded Multi-Touch API Document, Version 1.0, 9/26/2011.

Top