GanosBase のサーフェスモデルは、Well-Known Binary(WKB)フォーマットで表現できます。WKB はデータの精度を保証し、伝送を容易にします。
仕組み
WKB は、GanosBase SFMesh オブジェクトのデータを型付き数値列に抽出し、指定されたバイトオーダーでそれらの値を直列化することでエンコードします。
サポートされるバイトオーダーは以下の 2 種類です:
| バイトオーダー | 定数 | 値 |
|---|---|---|
| リトルエンディアン | NDR(Network Data Representation) | 1 |
| ビッグエンディアン | XDR(External Data Representation) | 0 |
数値型
すべてのフィールドサイズおよびエンコーディングは、以下の型定義に従います。これらの定義は NDR および XDR の両方のバイトオーダーに適用されます。
| 型 | サイズ | 説明 |
|---|---|---|
Uint1 | 1 バイト(8 ビット) | 符号なし整数 |
Byte | 1 バイト(8 ビット) | 符号付き整数 |
Uint16 | 2 バイト(16 ビット) | 符号なし整数 |
Uint32 | 4 バイト(32 ビット) | 符号なし整数 |
Float | 4 バイト(32 ビット) | 浮動小数点数(IEEE 754) |
Double | 8 バイト(64 ビット) | 浮動小数点数(IEEE 754) |
幾何学的型
GanosBase は、Open Geospatial Consortium(OGC)Simple Feature モデルから定義されるすべてのジオメトリ型をサポートしており、さらにサーフェスメッシュ表現用に拡張された 3 種類の型もサポートしています:
IndexSurface — インデックス付き頂点サーフェス(型コード 22)
TriangleStrip — トライアングルストリップサーフェス(型コード 20)
TriangleFan — トライアングルファンサーフェス(型コード 21)
これらの型による 3D ジオメトリのモデリング方法の詳細については、「サーフェスメッシュモデルにおけるデータモデル」をご参照ください。
SRID のサポート
Extended Well-Known Text(EWKT)は、Spatial Reference System Identifier(SRID)を含む Well-Known Text(WKT)の拡張です。WKB 構造では、/* if WKBSRIDFLAG */ とマークされたフィールドは、SRID が指定されている場合にのみ存在します。
定義
一般定義
// 基本型定義
// byte : 1 バイト
// uint8 : 1 バイト
// uint16: 2 バイト
// uint32: 32 ビット符号なし整数(4 バイト)
// float : 単精度数(4 バイト)
// double: 倍精度数(8 バイト)
enum WKBByteOrder {
wkbXDR = 0, // ビッグエンディアン
wkbNDR = 1 // リトルエンディアン
}
// ポイント型
Point2D {
double x;
double y;
}
Point3D {
double x;
double y;
double z;
}
Point4D {
double x;
double y;
double z;
double m;
}
Point {
union
{
Point2D point2d;
Point3D point3d;
Point4D point4d;
};
}
// LinearRing
LinearRing {
uint32 numPoints;
Point points[numPoints];
}
// 法線ベクター
NormalPoint {
float x;
float y;
float z;
}
NormalPointArray {
uint32 numPoints;
NormalPoint points[numPoints];
}
// テクスチャ座標
TexcoordPoint {
float x;
float y;
}
TexcoordPointArray {
uint32 numPoints;
TexcoordPoint points[numPoints];
}
// 文字列
String
{
uint32 stringLength;
byte string[stringLength];
}
// 可変長整数
enum IntType {
Int8 = 1;
Int16 = 2;
Int32 = 4;
}
varint {
union {
uint8 uint8;
uint16 uint16;
uint32 uint32;
};
}
varintArray {
uint32 numInt;
byte intType; // WKBIntType
varint values[numInt];
}拡張ジオメトリ型
TriangleStrip
WKBTriangleStrip {
byte byteOrder;
static uint32 wkbType = 20;
/*
#define WKBZOFFSET 0x80000000
#define WKBMOFFSET 0x40000000
#define WKBSRIDFLAG 0x20000000
*/
uint32 srid; /* if WKBSRIDFLAG */
uint32 numRings = 1;
LinearRing ring;
}TriangleFan
WKBTriangleFan {
byte byteOrder;
static uint32 wkbType = 21;
/*
#define WKBZOFFSET 0x80000000
#define WKBMOFFSET 0x40000000
#define WKBSRIDFLAG 0x20000000
*/
uint32 srid; /* WKBSRIDFLAG が設定されている場合 */
uint32 numRings = 1;
LinearRing rings;
}IndexSurface
WKBIndexsurface {
byte byteOrder;
static uint32 wkbType = 22;
/*
#define WKBZOFFSET 0x80000000
#define WKBMOFFSET 0x40000000
#define WKBSRIDFLAG 0x20000000
*/
uint32 srid; /* if WKBSRIDFLAG */
LinearRing ring;
varintArray VertexIndex;
varintArray VertexNum;
}GeometryCollection
WKBGeometry {
Union {
WKBPoint point;
WKBLineString linestring;
WKBPolygon polygon;
WKBMultiPoint mpoint;
WKBMultiLineString mlinestring;
WKBMultiPolygon mpolygon;
WKBTriangleStrip strip;
WKBTriangleFan fan;
WKBIndexsurface indexsurface;
};
};
WKBGeometryCollection {
byte byte_order;
static uint32 wkbType = 7;
uint32 numGeometries;
WKBGeometry geometries[numGeometries];
}テクスチャ
enum wkbTFormat
{
wkbTFRaw = 0;
wkbTFJPG = 1;
wkbTFPNG = 2;
}
enum wkbTType
{
wkbTTFile = 1;
wkbTTDB = 2;
wkbTTBytes = 3;
wkbTTWeb = 4;
}
WKBTexture {
byte byteOrder;
static byte version = 1;
byte compress = 0;
byte format; /* wkbTFormat */
static byte wrap = 0;
byte type; /* wkbTType */
byte depth; /* 1, 2, または 4 */
uint32 width;
uint32 height;
uint32 dataLength;
byte data[dataLength];
String name;
}マテリアル
WKBMaterial {
byte byteOrder;
static byte version = 1;
uint1 type;
uint4 numTextures;
WKBTexture textures[numTextures];
WKBString name;
WKBString data;
}MeshGeom
WKBMeshGeom
{
byte byteOrder;
uint32 wkbType;
/*
#define WKBZOFFSET 0x80000000
#define WKBMOFFSET 0x40000000
#define WKBSRIDFLAG 0x20000000
#define WKBGEOMFLAG 0x04000000
#define WKBNORMALFLAG 0x02000000
#define WKBTEXCOORDFLAG 0x01000000
#define WKBREFFLAG 0x00400000
#define WKBSOLIDFLAG 0x00200000
*/
uint32 srid; /* if WKBSRIDFLAG */
WKBGeometryCollection patches; /* if WKBGEOMFLAG */
uint32 numNormalPointArray; /* if WKBNORMALFLAG */
NormalPointArray normalPoints[numNormalPointArray]; /* if WKBNORMALFLAG */
uint32 numTexcoordPointArray; /* if WKBTEXCOORDFLAG */
TexcoordPointArray texcoordPoints[numTexcoordPointArray]; /* if WKBTEXCOORDFLAG */
String path; /* if WKBREFFLAG */
}SFMesh
WKBMatrix {
double matrix[12];
}
WKBNode
{
uint8 flags;
/*
#define WKBPRIMITIVEFLAG 0x01u<<0
#define WKBMATRIXFLAG 0x01u<<2
#define WKBIDFLAG 0x01u<<3
*/
uint32 primitive; /* if WKBPRIMITIVEFLAG */
varintArray children; /* if not WKBPRIMITIVEFLAG */
WKBMatrix matrix; /* if WKBMATRIXFLAG */
uint32 id; /* if WKBIDFLAG */
}
WKBPrimitive {
uint8 flags;
uint8 reserved;
uint16 materialId;
uint32 index;
}
SFMesh
{
byte byteOrder;
static byte magic = 'M';
static byte version = 1;
uint16 flags;
/*
#define WKBMESHZFLAG 0x0001u /* have z */
#define WKBMESHMFLAG 0x0001u<<1 /* have M */
#define WKBMESHREFFLAG 0x0001u<<4 /* is ref */
#define WKBMESHGEOMFLAG 0x0001u<<5 /* have meshgeom */
#define WKBMESHMESHFLAG 0x0001u<<6 /* have mesh */
#define WKBMESHTEXTUREFLAG 0x0001u<<7 /* have texture */
#define WKBMESHMATERIALFLAG 0x0001u<<8 /* have material */
#define WKBMESHLODFLAG 0x0001u<<9 /* have lod */
#define WKBMESHSRIDFLAG 0x0001u<<11 /* have srid */
#define WKBMESHUSERFLAG 0x0001u<<12 /* have user data */
#define WKBMESHBINFLAG 0x0001u<<13 /* have bin data */
#define WKBMESHEXFLAG 0x0001u<<14 /* have exflags */
#define WKBMESHSYSFLAG 0x0001u<<15 /* have system data */
*/
uint32 exflags; /* if WKBMESHEXFLAG */
uint32 srid; /* if WKBMESHSRIDFLAG */
uint16 lod; /* if WKBMESHLODFLAG */
uint32 root; /* if not WKBMESHREFFLAG */
uint32 numMeshgeom; /* if WKBMESHGEOMFLAG */
WKBMeshgeom meshgeoms[numMeshgeom]; /* if WKBMESHGEOMFLAG */
uint32 numSFMesh; /* if WKBMESHMESHFLAG */
WKBSFMesh sfmesh[numSFMesh]; /* if WKBMESHMESHFLAG */
uint32 numTexture; /* if WKBMESHTEXTUREFLAG */
WKBTexture textures[numTexture]; /* if WKBMESHTEXTUREFLAG */
uint32 numNode; /* if not WKBMESHREFFLAG */
WKBNode nodes[numNode]; /* if not WKBMESHREFFLAG */
uint32 numPrimitives; /* if not WKBMESHREFFLAG */
WKBPrimitive primitives[numPrimitives]; /* if not WKBMESHREFFLAG */
String path; /* if WKBMESHREFFLAG */
String userdata; /* if WKBMESHUSERFLAG */
String bindata; /* if WKBMESHBINFLAG */
String sysdata; /* if WKBMESHSYSFLAG */
}型コード一覧
| 型 | wkbType 値 |
|---|---|
WKBTriangleStrip | 20 |
WKBTriangleFan | 21 |
WKBIndexsurface | 22 |
WKBGeometryCollection | 7 |
フラグ一覧
MeshGeom フラグ
| フラグ | 値 | 説明 |
|---|---|---|
WKBZOFFSET | 0x80000000 | Z ディメンションを有する |
WKBMOFFSET | 0x40000000 | M ディメンションを有する |
WKBSRIDFLAG | 0x20000000 | SRID を有する |
WKBGEOMFLAG | 0x04000000 | ジオメトリコレクションを有する |
WKBNORMALFLAG | 0x02000000 | 法線ベクターを有する |
WKBTEXCOORDFLAG | 0x01000000 | テクスチャ座標を有する |
WKBREFFLAG | 0x00400000 | 外部パスへの参照である |
WKBSOLIDFLAG | 0x00200000 | ソリッドである |
SFMesh フラグ
| フラグ | 値 | 説明 |
|---|---|---|
WKBMESHZFLAG | 0x0001u | Z 座標を有する |
WKBMESHMFLAG | 0x0001u<<1 | M 座標を有する |
WKBMESHREFFLAG | 0x0001u<<4 | 参照である |
WKBMESHGEOMFLAG | 0x0001u<<5 | MeshGeom を有する |
WKBMESHMESHFLAG | 0x0001u<<6 | サブメッシュを有する |
WKBMESHTEXTUREFLAG | 0x0001u<<7 | テクスチャを有する |
WKBMESHMATERIALFLAG | 0x0001u<<8 | マテリアルを有する |
WKBMESHLODFLAG | 0x0001u<<9 | レベル・オブ・ディテール(LOD)を有する |
WKBMESHSRIDFLAG | 0x0001u<<11 | SRID を有する |
WKBMESHUSERFLAG | 0x0001u<<12 | ユーザーデータを有する |
WKBMESHBINFLAG | 0x0001u<<13 | バイナリデータを有する |
WKBMESHEXFLAG | 0x0001u<<14 | 拡張フラグを有する |
WKBMESHSYSFLAG | 0x0001u<<15 | システムデータを有する |
WKBNode フラグ
| フラグ | 値 | 説明 |
|---|---|---|
WKBPRIMITIVEFLAG | 0x01u<<0 | ノードがプリミティブである |
WKBMATRIXFLAG | 0x01u<<2 | 変換マトリックスを有する |
WKBIDFLAG | 0x01u<<3 | ID を有する |