Skip to main content

Universal Ink Data Format

Universal Ink Model はProtocol Buffers v3 messageとしてシリアル化され、RIFF container.内でラッピングされます。 以下のセクションでは、このコンテナと protobuf のシリアル化スキームについて説明します。

RIFF Container

Universal Ink Model (UIM)は@@@内の RIFF container コンテナへとシリアル化されます。RIFF chunk UIM3. このチャンクには 2 つのサブチャンク、すなわち HEAD と DATA が含まれます。 HEAD チャンクには現在の仕様バージョンが含まれています。 このバージョンは 3 バイトを使用してエンコードされ、[major-version]-[minor-version]-[patch-version] のように定義されます。

インクモデルはセクション 8.2「Protocol Buffers のシリアル化スキーム」に記載されている Protocol Buffers メッセージとしてシリアル化され、DATA チャンクに格納されます。

インクモデルの論理的な部分

図 1:RIFF のダイアグラム

インクツリ

インクツリーは汎用的なノード構造で構築されます。 ツリーを構築する場合、ツリー内部の深さはdepth属性によって示されます。 図 3に示すように、ツリー構造のシリアル化では、深さ優先の前順序ツリーシリアル化が適用されます。

それぞれのノードには、サブジェクトの識別子としてのセマンティックステートメントに関連のある一意の識別子idが付いています。 index属性はパスまたはセンサーデータインデックスに関連しています。 groupBoundingBoxはオプションで、視覚的デバッグを容易にしたり、クリック可能なオプションの関連領域をハイライト表示したりできます。 属性chunkFromIndexおよびchunkToIndexは、ノードのtypeCHUNKである場合にのみ、サブインデックス化の対象となります。

グループの階層

図 2:赤で示した深さ優先のツリー順序:F、B、A、D、C、E、G、I、H

データ圧縮

エンコーディング

エンコードプロセスは次のように行われます。

ステップ 1. (オプション) 10 進数の精度を外部指定して、浮動小数点値を整数値に変換します。

integerValue = floatValue * (10 ^ decimalPrecision);

Note: ステップ 1 はデータタイプが整数データタイプ(など 以外の場合にのみ適用されます。UINT32, UINT64, INT32, or INT64).

ステップ 2. 変換された値にデルタエンコードを実施します。

encodedValues[0] = integerValues[0];
for(i = 1; i < n; i++)
{
encodedValues[i] = integerValues[i] - integerValues[i - 1];
}

注意: 浮動小数点値と固定小数点(整数)値との変換では、精度がある程度失われる可能性があります。 アプリケーションの機能にとって精度が極めて重要な場合は、これに対する考慮が必要です。 考えられる 1 つの解決策は、IEEE 754:の利用です。この場合、変換されるすべての値に対して適切なdecimalPrecisionと、この変換時に変更されない近似値を使用する必要があります。

デコード

元の値に戻すには、エンコードプロセスを次のように入れ替えます。

ステップ 1. デルタ復号を実施して整数値を元に戻します。

integerValues[0] = encodedValues[0];
for(i = 1; i < n; i++)
{
integerValues[i] = integerValues[i - 1] + encodedValues[i];
}

ステップ 2. (オプション) 外部で指定された小数点精度を使用して整数値を浮動小数点値に変換します。

floatValue = integerValue / (10 ^ decimalPrecision)

注意: ステップ 2 はデータタイプが整数データタイプ以外の場合にのみ適用されます。

Protobuf シリアル化スキーム

BrushPrototype

ブラシのポリゴンプロトタイプの定義。

フィールドタイプラベル説明
coordXfloatrepeatedブラシプロトタイプの x 座標のリスト。
coordYfloatrepeatedブラシプロトタイプの y 座標のリスト。
coordZfloatrepeatedブラシプロトタイプの z 座標のリスト [3D レンダリング用]。
indicesuint32repeatedブラシプロトタイプのインデックスのリスト [3D レンダリング用]。
shapeURIstringoptionalポリゴンの形状を一意に識別する URI。
sizefloatoptionalパスポイントサイズごとのプロトタイプを定義します。

Brushes

インクのラスタライゼーションに必要なブラシの説明。

フィールドタイプラベル説明
vectorBrushesVectorBrushrepeated定義されたベクターブラシのリスト。
rasterBrushesRasterBrushrepeated定義されたラスターブラシのリスト。

ChannelData

データ項目のリスト。

フィールドタイプラベル説明
sensorChannelIDstringoptionalid を介して InkSensorChannel を参照します。
valuessint32repeated指定された精度でデルタ符号化されたサンプル値。

環境

環境は、入力環境に関するすべての詳細を定義します。

  • オペレーティングシステム:名前、バージョンなど。
  • アプリケーション:名前、バージョンなど。
  • 地理情報:GPS 座標。
フィールドタイプラベル説明
idstringoptionalMD5 ハッシュ。MD5 ハッシュベースの一意識別子生成スキームに従う。
propertiesPropertyrepeatedオペレーティングシステム名、バージョンなどの環境プロパティ。

Float32

クロスプラットフォームのゼロ値の問題を回避するための浮動小数点値のラッパー。

フィールドタイプラベル説明
valuefloatoptionalメッセージ内でラップされた浮動小数点値。

InkData

すべてのインクデータを含みます。

フィールドタイプラベル説明
strokesStrokerepeatedストロークのデータホルダー。

InkInputProvider

入力プロバイダータイプの定義。

フィールドタイプラベル説明
idstringoptionalMD5 ハッシュ。MD5 ハッシュベースの一意識別子生成スキームに従う。
TypeInkInputProviderTypeoptional使用されているハードウェアのタイプ - PEN、TOUCH、MOUSE、またはコントローラー。
propertiesPropertyrepeatedPenID などの InkInputProvider プロパティ。

InkObject

すべての関連データをキャプチャするためのベース構造のインクオブジェクト。

  • 入力センサーから記録されたセンサーデータ
  • 使用される異なるブラシタイプを定義するブラシ構成
  • インクストロークの視覚的ジオメトリを持つインクデータ
  • インクデータを構造化するインクツリー
  • 著者、ドキュメントなどを記述するメタデータ
  • 意味論を持つ知識グラフ
フィールドタイプラベル説明
inputDataInputDataoptionalインク入力関連データのデータホルダー。
inkDataInkDataoptionalインク関連のインクデータのデータホルダー。
brushesBrushesoptionalラスタライゼーションツール。
inkTreeNoderepeatedインクツリー:これはインク中心のデータモデルです。
viewsViewrepeatedナレッジグラフに基づくインクツリーのビューのリスト。
knowledgeGraphTripleStoreoptionalナレッジグラフ。
transformMatrix4optionalすべてのパスに適用されるアフィン変換行列。
propertiesPropertyrepeatedDOCUMENT、AUTHOR、LAST_MODIFIED などのドキュメント関連のプロパティ。

InputContext

インクデバイスのコンテキストを環境と SensorContext への参照と共にキャプチャします。

フィールドタイプラベル説明
idstringoptionalMD5 ハッシュ。MD5 ハッシュベースの一意識別子生成スキームに従う。
environmentIDstringoptional環境への参照。
sensorContextIDstringoptionalSensorContext への参照。

InputContextData

コンテキストと入力定義のコンテナ構造。

フィールドタイプラベル説明
inputContextsInputContextrepeated入力コンテキストのリスト。
inkInputProvidersInkInputProviderrepeated入力プロバイダーのリスト。
inputDevicesInputDevicerepeated入力デバイスのリスト。
environmentsEnvironmentrepeated環境セットアップのリスト。
sensorContextsSensorContextrepeatedセンサーコンテキストのリスト。

InputData

InputData は入力をまとめます。

フィールドタイプラベル説明
inputContextDataInputContextDataoptional入力コンテキストデータ。
sensorDataSensorDatarepeatedセンサーデータのデータホルダー。

InputDevice

入力デバイスとそのプロパティ。

プロパティには以下が含まれます:

  • 通信プロトコル:USB、BTC、BLE、SPP、WIFI
  • 通信 ID:VID、PID;MAC;UID;COM_PORT
  • デバイス名:Wacom Intuos Pro M、Apple iPad 8、Samsung GalaxyTab 10
  • シリアル番号
  • ファームウェアバージョン(MCU)
  • セカンダリファームウェアバージョン(BT、WIFI)- 異なるモジュールはそれぞれのバージョンを提供します
  • 方向:PORTRAIT、LANDSCAPE、PORTRAIT_REVERSE、LANDSCAPE_REVERSE または 0、90、180、270
  • センサーサイズ
フィールドタイプラベル説明
idstringoptionalMD5 ハッシュ。MD5 ハッシュベースの一意識別子生成スキームに従う。
propertiesPropertyrepeated入力デバイスのプロパティ。

Matrix4

4x4 アフィン行列の表現

| m00 m01 m02 m03 | | m10 m11 m12 m13 | | m20 m21 m22 m23 | | m30 m31 m32 m33 |

フィールドタイプラベル説明
m00floatoptional
m01floatoptional
m02floatoptional
m03floatoptional
m10floatoptional
m11floatoptional
m12floatoptional
m13floatoptional
m20floatoptional
m21floatoptional
m22floatoptional
m23floatoptional
m30floatoptional
m31floatoptional
m32floatoptional
m33floatoptional

Node

ツリー構造の定義に使用されるノードメッセージ。

フィールドタイプラベル説明
idstringoptionalノードのユニークな識別子
depthuint32optional階層構造内の深さ
indexuint32optionalInkData.paths または InkData.sensorData データホルダー内のインデックス
TypeNodeTypeoptional(PATH & SENSOR_DATA ノードのみ) ノードタイプ
groupBoundingBoxRectangleoptionalバウンディングボックス (Group ノードのみ)
chunkFromIndexuint32optionalチャンクの始まり (CHUNK ノードのみ)
chunkToIndexuint32optionalチャンクの終わり (CHUNK ノードのみ)

PathPointProperties

変化しないパイプラインプロパティ。 可変のものは Stroke メッセージを介してシリアル化されます。

フィールドタイプラベル説明
sizeFloat32optionalブラシサイズ
redFloat32optional赤チャンネルの色値 [0, 1]
greenFloat32optional緑チャンネルの色値 [0, 1]
blueFloat32optional青チャンネルの色値 [0, 1]
alphaFloat32optionalアルファチャンネルの色値 [0, 1]
rotationFloat32optionalブラシの回転 z
scaleXFloat32optionalブラシのスケール x
scaleYFloat32optionalブラシのスケール y
scaleZFloat32optionalブラシのスケール z [3D レンダリング用]
offsetXFloat32optionalブラシのオフセット x
offsetYFloat32optionalブラシのオフセット y
offsetZFloat32optionalブラシのオフセット z [3D レンダリング用]

Property

単一のプロパティをエンコードします。

フィールドタイプラベル説明
namestringoptionalプロパティの名前
valuestringoptionalプロパティの値

RasterBrush

ラスタ画像で定義されたブラシ

フィールドタイプラベル説明
namestringoptionalブラシディスクリプター。
spacingfloatoptional隣接する粒子間の距離。
scatteringfloatoptionalカーブ法線に沿った散乱。
rotationModeRotationModeoptionalブラシの粒子回転モード。
shapeTexturebytesrepeated形状テクスチャを含む png 画像のリスト。
shapeTextureURIstringrepeated形状テクスチャに関連付けられた URI のリスト。
fillTexturebytesoptional塗りつぶしテクスチャを含む png 画像のリスト。
fillTextureURIstringoptional塗りつぶしテクスチャを識別する URI。
fillWidthfloatoptional塗りつぶしタイルの幅。
fillHeightfloatoptional塗りつぶしタイルの高さ。
randomizeFillbooloptional塗りつぶしテクスチャがランダムに変位するかどうかを指定します。
blendModeBlendModeoptional適用されるブレンドモード。

Rectangle

長方形の表現

フィールドタイプラベル説明
xfloatoptional長方形の左下 x 座標。
yfloatoptional長方形の左下 y 座標。
widthfloatoptional長方形の幅。
heightfloatoptional長方形の高さ。

SemanticTriple

意味トリプル、または単にトリプルは、主語-述語-対象の三つ組で、意味データについての文を表現します。

フィールドタイプラベル説明
subjectstringoptional
predicatestringoptional
objectstringoptional

SensorChannel

センサーチャネルに関する情報。

サポートされるチャネルタイプ:

  • will:///input/3.0/channel/X
  • will:///input/3.0/channel/Y
  • will:///input/3.0/channel/Z
  • will:///input/3.0/channel/Timestamp
  • will:///input/3.0/channel/Pressure
  • will:///input/3.0/channel/RadiusX
  • will:///input/3.0/channel/RadiusY
  • will:///input/3.0/channel/Altitude
  • will:///input/3.0/channel/Azimuth
  • will:///input/3.0/channel/Rotation
フィールドタイプラベル説明
idstringoptionalMD5 ハッシュ。MD5 ハッシュベースの一意識別子生成スキームに従う。
Typestringoptionalこのチャネルを一意に識別する URI。サポートされるタイプは次のとおりです:
metricInkSensorMetricTypeoptionalユーザー定義のチャネルはユーザー側から提供されるべきです。データ項目の解像度を計算する際に使用されるメトリックを示します。
resolutiondoubleoptionalデータ項目の増分数を示す 10 進数。
minfloatoptional物理単位ごと。たとえば、物理単位が m であり、デバイスの単位が 100000 である場合、値 150 は 0.0015 m になります。チャネルの最小値。
maxfloatoptionalチャネルの最大値
precisionuint32optionalエンコードされた浮動小数点値に必要な整数エンコーディングの精度

SensorChannelsContext

SensorChannelsContext は、同じサンプリングレートでデータを生成するセンサーチャネルをグループ化します。

フィールドタイプラベル説明
idstringoptionalMD5 ハッシュ。MD5 ハッシュベースの一意識別子生成スキームに従う。
channelsSensorChannelrepeatedこのグループのチャネルは、同じ時間に整列した値を提供します。
samplingRateHintUint32optionalチャネルの意図されたサンプリングレートのヒント [オプション]。
latencyUint32optionalミリ秒単位のレイテンシ測定 [オプション]。
inkInputProviderIDstringoptionalInkInputProvider への参照。
inputDeviceIDstringoptionalInputDevice への参照。

SensorContext

各入力デバイスには、デバイスの利用可能なセンサーを記述する SensorContext があります。 同じタイプのデバイスからの 2 つのデバイスの Ink データが共有コンテキストを持つファイルに含まれる可能性があります。

フィールドタイプラベル説明
idstringoptionalMD5 ハッシュ。MD5 ハッシュベースの一意識別子生成スキームに従う。
sensorChannelsContextSensorChannelsContextrepeatedデバイスセンサーチャネルのグループ化コンテキスト。

SensorData

SensorData は、インクセンサーからの生データを保存するための中心的なデータ構造です。

フィールドタイプラベル説明
idstringoptional
inputContextIDstringoptionalid を介して InputContext を参照します。
stateInkStateoptionalインクの状態。
timestampuint64optionalストロークの最初のサンプルのタイムスタンプ、ミリ秒単位で計測されます。
dataChannelsChannelDatarepeated(最初の X および Y が報告された時刻)。データチャネルはデータリストをエンコードします。

Stroke

視覚的なパスの構造。 Stroke は、最も単純な形式では、1 つ以上のセグメント(Catmull-Rom)を含み、 Positions としての一連の位置点を含みます。 これらのプロパティに加えて、デジタルインクストロークには、開始パラメーターと終了パラメーターが Stroke エンティティのプロパティとして含まれます。

フィールドタイプラベル説明
idstringoptional内部 ID。
startParameterfloatoptionalスプラインの開始パラメーター [0, 1]。
endParameterfloatoptionalスプラインの終了パラメーター [0, 1]。
splineXfloatrepeatedx のスプライン値。
splineYfloatrepeatedy のスプライン値。
splineZfloatrepeatedz のスプライン値 [3D レンダリング用]。
redfloatrepeated赤チャンネルの色値 [0, 1]。
greenfloatrepeated緑チャンネルの色値 [0, 1]。
bluefloatrepeated青チャンネルの色値 [0, 1]。
alphafloatrepeatedアルファチャンネルの色値 [0, 1]。
sizefloatrepeatedブラシのサイズ。
rotationfloatrepeatedブラシの回転 z。
scaleXfloatrepeatedブラシのスケール x。
scaleYfloatrepeatedブラシのスケール y。
scaleZfloatrepeatedブラシのスケール z [3D レンダリング用]。
offsetXfloatrepeatedブラシのオフセット x。
offsetYfloatrepeatedブラシのオフセット y。
offsetZfloatrepeatedブラシのオフセット z [3D レンダリング用]。
sensorDataOffsetuint32optional生データと処理済みパスの間のポイントのマッピングのインデックス。
sensorDataIDstringoptional参照センサーデータ。
sensorDataMappinguint32repeatedStroke と SensorData のインデックス間の明示的なマッピング。入力レートが非常に高く、不要なポイントが提供される場合に使用されます。
styleStyleoptionalパスに適用されるスタイル。

Style

Stroke のカスタマイズに使用されるスタイルメッセージ。

フィールドタイプラベル説明
propertiesPathPointPropertiesoptionalパスポイントごとに存在しない静的なプロパティの値
brushURIstringoptionalストロークラスタリゼーションに使用されるブラシへの参照
particlesRandomSeeduint32optionalパーティクルランダムシード、パーティクルストロークに必要
renderModeURIstringoptionalストロークの視覚化に関する追加情報の定義、消しゴムなど。

TripleStore

TripleGroup のリストをカプセル化します。

フィールドタイプラベル説明
statementsSemanticTriplerepeatedセマンティックトリプルのリスト。

Uint32

整数のゼロ値の問題を回避するための符号なし整数値のラッパー。

フィールドタイプラベル説明
valueuint32optionalメッセージ内にラップされた符号なし整数値。

VectorBrush

多角形(3D の場合はポリエドロン)で定義されたブラシ。

フィールドタイプラベル説明
namestringoptionalブラシの記述子。
prototypeBrushPrototyperepeatedブラシのための多角形プロトタイプ。
spacingfloatoptional間隔値。

View

インクツリーのビューを表すメッセージで、別のツリー形式でシリアル化されます。

フィールドタイプラベル説明
namestringoptionalビュー記述子 URI(モデルスコープで一意)。
treeNoderepeated現在のビューのツリー構造。

BlendMode

ブレンドモードの列挙型は、ラスターブラシに適用できる異なるブレンドモードを示します。

名前番号説明
SOURCE_OVER0これがデフォルト設定で、新しい形状を既存のキャンバスコンテンツの上に描画します。NORMAL とも呼ばれます。
DESTINATION_OVER1新しい形状が既存のキャンバスコンテンツの背後に描画されます。NORMAL_REVERSE とも呼ばれます。
DESTINATION_OUT2新しい形状が重ならない部分では既存のコンテンツが維持されます。ERASE とも呼ばれます。
LIGHTER3両方の形状が重なる部分の色は、色の値を加算することで決定されます。ADD とも呼ばれます。
COPY4新しい形状のみが表示されます。NONE とも呼ばれます。
MIN5結果は両方の色の最小値です。結果はより暗い色です。
MAX6結果は両方の色の最大値です。結果はより明るい色です。

InkInputProviderType

入力の異なるタイプを定義します。

名前番号説明
PEN0スタイラス、スマートペン、ペンディスプレイ、署名キャプチャデバイスなど。
TOUCH1タッチコントローラー入力:指または受動ペン。
MOUSE2マウスデバイス。
CONTROLLER33-DOFまたは6-DOF入力デバイス。

InkSensorMetricType

サポートされているメトリックのタイプ

名前番号説明
LENGTH0基本のSI単位はメートルです。
TIME1基本のSI単位は秒です。
FORCE2基本のSI単位はニュートンです。
ANGLE3基本のSI単位はラジアンです。
NORMALIZED4パーセンテージ。最大値と最小値に対する分数(1.0 = 100%)として表されます。
LOGICAL5論理値、true / false 値。
DIMENSIONLESS6センサーに対して定義されたメトリックはありません。

InkState

インクデバイスの状態は、インクデバイスの状態を定義します。WILL 3.0 は、さまざまなモードをサポートしています:

  • 平面に書く

  • 表面の上をホバリングする

  • 空中で移動する(VR/AR/MR)相互作用

  • 空中でのみホバリングする

    名前番号説明
    PLANE0インクデバイスが表面に書き込んでいます。
    HOVERING1表面の上をホバリングしています。
    IN_VOLUME2インクデバイスを空中で使用し、アクティブなインキングを行っています。
    VOLUME_HOVERING3インキングが無効になっている状態でペンを空中で移動しています。

NodeType

ノードのタイプを定義します。

名前番号説明
PATH_GROUP0PATH_GROUP は階層的にストロークノードを組み合わせます。
SENSOR_DATA_GROUP1SENSOR_DATA_GROUP は階層的にセンサーデータノードを組み合わせます。
PATH2PATH は、ノードが直接ストロークを指すノードタイプです。
SENSOR_DATA3SENSOR_DATA は、ノードが直接センサーデータサンプルシーケンスを指すノードタイプです。

RotationMode

回転モードは、パーティクルの回転を指定します。

名前番号説明
NONE0図形が回転しないことを示します。
RANDOM1描画前に図形がランダムに回転することを示します。
TRAJECTORY2図形がパスの軌跡に一致するように回転することを示します。

スカラー値のタイプ

.proto Type説明C++ タイプJava タイプPython タイプ
doubledoubledoublefloat
floatfloatfloatfloat
int32可変長エンコーディングを使用します。負の数をエンコードするのに効率が悪いです - フィールドが負の値を持つ可能性が高い場合は、代わりに sint32 を使用してください。int32intint
int64可変長エンコーディングを使用します。負の数をエンコードするのに効率が悪いです - フィールドが負の値を持つ可能性が高い場合は、代わりに sint64 を使用してください。int64longint/long
uint32可変長エンコーディングを使用します。uint32intint/long
uint64可変長エンコーディングを使用します。uint64longint/long
sint32可変長エンコーディングを使用します。符号付き整数値。これらは、通常の int32 よりも効率的に負の数をエンコードします。int32intint
sint64可変長エンコーディングを使用します。符号付き整数値。これらは、通常の int64 よりも効率的に負の数をエンコードします。int64longint/long
fixed32常に 4 バイトです。値が 2^28 よりも大きい場合は、uint32 よりも効率的です。uint32intint
fixed64常に 8 バイトです。値が 2^56 よりも大きい場合は、uint64 よりも効率的です。uint64longint/long
sfixed32常に 4 バイトです。int32intint
sfixed64常に 8 バイトです。int64longint/long
boolboolbooleanboolean
string文字列は常に UTF-8 エンコードされたテキストまたは 7 ビット ASCII テキストを含んでいる必要があります。stringStringstr/unicode
bytes任意のバイト列を含むことができます。stringByteStringstr