GStatic ユーザーへの注意: Draco チームは、Draco GStatic コンテンツにアクセスするためにバージョン付き URL を使用することを強く推奨します。 URL 内にv1/decoders
サブストリングを含む URL を使用している場合、エッジ キャッシュと GStatic 伝播の遅延により、新しい Draco リリースの起動時に診断が困難な一時的なエラーが発生する可能性があります。この問題を回避するには、サイトをバージョン付きリリースに固定します。
src/draco/tools
のinstall_test
ディレクトリを参照してください。https://github.com/google/draco/releases
Draco は、3D 幾何学的メッシュと点群を圧縮および解凍するためのライブラリです。 3D グラフィックスのストレージと送信を改善することを目的としています。
Draco は、圧縮の効率と速度を重視して設計および構築されています。このコードは、ポイント、接続情報、テクスチャ座標、カラー情報、法線、およびジオメトリに関連付けられたその他の一般的な属性の圧縮をサポートしています。 Draco を使用すると、3D グラフィックスを使用するアプリケーションを、視覚的な忠実度を損なうことなく大幅に小型化できます。これはユーザーにとって、アプリのダウンロードが高速になり、ブラウザーの 3D グラフィックスの読み込みが高速になり、VR および AR シーンを帯域幅の一部で送信して高速にレンダリングできることを意味します。
Draco は、3D グラフィックスの圧縮に使用できる C++ ソース コードとしてリリースされるほか、エンコードされたデータの C++ および Javascript デコーダとしても使用できます。
コンテンツ
構築手順については、「構築」を参照してください。
Draco での Unity の使用に関する最良の情報については、https://github.com/atteneder/DracoUnity をご覧ください。
Draco で Unity を使用する簡単な例については、Unity フォルダーの README を参照してください。
Draco WASM および JavaScript デコーダーは常に以下からプルすることをお勧めします。
https://www.gstatic.com/draco/v1/decoders/
より多くのサイトが静的 URL を使用し始めると、ユーザーは Draco デコーダーをキャッシュに保持することで恩恵を受けることになります。
ビルド ファイルから作成されるデフォルトのターゲットは、 draco_encoder
およびdraco_decoder
コマンド ライン アプリケーションになります。さらに、DRACO_TRANSCODER_SUPPORTED 変数を ON に設定して CMake を実行すると、 draco_transcoder
が生成されます (詳細については「ビルド」を参照)。すべてのアプリケーションについて、引数または-h
指定せずに実行すると、アプリケーションは使用法とオプションを出力します。
draco_encoder
OBJ、STL、または PLY ファイルを入力として読み取り、Draco でエンコードされたファイルを出力します。テスト用に Stanford の Bunny メッシュが含まれています。基本的なコマンドラインは次のようになります。
./draco_encoder -i testdata/bun_zipper.ply -o out.drc
量子化パラメータの値を0
にすると、指定された属性に対して量子化は実行されません。 0
以外の値を指定すると、指定された属性の入力値がそのビット数に量子化されます。例えば:
./draco_encoder -i testdata/bun_zipper.ply -o out.drc -qp 14
位置を 14 ビットに量子化します (位置座標のデフォルトは 11)。
一般に、属性を量子化すればするほど、より良い圧縮率が得られます。どの程度の逸脱を許容するかはプロジェクト次第です。一般に、ほとんどのプロジェクトでは、品質に目立った違いはなく、約11
の量子化値を設定できます。
圧縮レベル ( -cl
) パラメーターは、さまざまな圧縮機能をオン/オフにします。
./draco_encoder -i testdata/bun_zipper.ply -o out.drc -cl 8
一般に、最高の設定である10
圧縮率が最も高くなりますが、解凍速度は最悪になります。 0
圧縮率が最も低くなりますが、解凍速度は最高になります。デフォルト設定は7
です。
-point_cloud
パラメーターを指定すると、 draco_encoder
で点群データをエンコードできます。メッシュ入力ファイルで-point_cloud
パラメータを指定すると、 draco_encoder
接続データを無視し、メッシュ ファイルからの位置をエンコードします。
./draco_encoder -point_cloud -i testdata/bun_zipper.ply -o out.drc
このコマンド ラインは、入力が他の点群を表す圧縮を生成しない場合でも、メッシュ入力を点群としてエンコードします。特に、より大きく密度の高い点群では、圧縮率が大幅に向上することが期待できます。
draco_decoder
Draco ファイルを入力として読み取り、OBJ、STL、または PLY ファイルを出力します。基本的なコマンドラインは次のようになります。
./draco_decoder -i in.drc -o out.obj
draco_transcoder
使用して、Draco 圧縮を glTF アセットに追加できます。基本的なコマンドラインは次のようになります。
./draco_transcoder -i in.glb -o out.glb
このコマンド ラインは、 in.glb
ファイル内のすべてのメッシュにジオメトリ圧縮を追加します。さまざまな glTF 属性の量子化値は、 draco_encoder
ツールと同様に指定できます。たとえば、 -qp
使用して、位置属性の量子化を定義できます。
./draco_transcoder -i in.glb -o out.glb -qp 12
アプリケーションにデコードを追加したい場合は、 draco_dec
ライブラリを含める必要があります。 Draco デコーダを使用するには、圧縮データを使用してDecoderBuffer
初期化する必要があります。次に、 DecodeMeshFromBuffer()
を呼び出してデコードされたメッシュ オブジェクトを返すか、 DecodePointCloudFromBuffer()
を呼び出してデコードされたPointCloud
オブジェクトを返します。例えば:
draco::DecoderBuffer buffer;
buffer.Init(data.data(), data.size());
const draco::EncodedGeometryType geom_type =
draco::GetEncodedGeometryType (&buffer);
if (geom_type == draco::TRIANGULAR_MESH) {
unique_ptr<draco::Mesh> mesh = draco::DecodeMeshFromBuffer (&buffer);
} else if (geom_type == draco::POINT_CLOUD) {
unique_ptr<draco::PointCloud> pc = draco::DecodePointCloudFromBuffer (&buffer);
}
完全なMesh
クラス インターフェイスについては src/draco/mesh/mesh.h を、完全なPointCloud
クラス インターフェイスについては src/draco/point_cloud/point_cloud.h を参照してください。
Javascript エンコーダはjavascript/draco_encoder.js
にあります。エンコーダ API を使用して、メッシュと点群を圧縮できます。エンコーダーを使用するには、まずDracoEncoderModule
のインスタンスを作成する必要があります。次に、このインスタンスを使用してMeshBuilder
とEncoder
オブジェクトを作成します。 MeshBuilder
は、後でEncoder
によって圧縮できるジオメトリ データからメッシュを構築するために使用されます。まず、 new encoderModule.Mesh()
を使用してメッシュ オブジェクトを作成します。次に、 AddFacesToMesh()
使用してインデックスをメッシュに追加し、 AddFloatAttributeToMesh()
を使用して属性データ (位置、法線、色、テクスチャ座標など) をメッシュに追加します。メッシュが構築された後、 EncodeMeshToDracoBuffer()
使用してメッシュを圧縮できます。例えば:
const mesh = {
indices : new Uint32Array ( indices ) ,
vertices : new Float32Array ( vertices ) ,
normals : new Float32Array ( normals )
} ;
const encoderModule = DracoEncoderModule ( ) ;
const encoder = new encoderModule . Encoder ( ) ;
const meshBuilder = new encoderModule . MeshBuilder ( ) ;
const dracoMesh = new encoderModule . Mesh ( ) ;
const numFaces = mesh . indices . length / 3 ;
const numPoints = mesh . vertices . length ;
meshBuilder . AddFacesToMesh ( dracoMesh , numFaces , mesh . indices ) ;
meshBuilder . AddFloatAttributeToMesh ( dracoMesh , encoderModule . POSITION ,
numPoints , 3 , mesh . vertices ) ;
if ( mesh . hasOwnProperty ( 'normals' ) ) {
meshBuilder . AddFloatAttributeToMesh (
dracoMesh , encoderModule . NORMAL , numPoints , 3 , mesh . normals ) ;
}
if ( mesh . hasOwnProperty ( 'colors' ) ) {
meshBuilder . AddFloatAttributeToMesh (
dracoMesh , encoderModule . COLOR , numPoints , 3 , mesh . colors ) ;
}
if ( mesh . hasOwnProperty ( 'texcoords' ) ) {
meshBuilder . AddFloatAttributeToMesh (
dracoMesh , encoderModule . TEX_COORD , numPoints , 3 , mesh . texcoords ) ;
}
if ( method === "edgebreaker" ) {
encoder . SetEncodingMethod ( encoderModule . MESH_EDGEBREAKER_ENCODING ) ;
} else if ( method === "sequential" ) {
encoder . SetEncodingMethod ( encoderModule . MESH_SEQUENTIAL_ENCODING ) ;
}
const encodedData = new encoderModule . DracoInt8Array ( ) ;
// Use default encoding setting.
const encodedLen = encoder . EncodeMeshToDracoBuffer ( dracoMesh ,
encodedData ) ;
encoderModule . destroy ( dracoMesh ) ;
encoderModule . destroy ( encoder ) ;
encoderModule . destroy ( meshBuilder ) ;
完全な API については、src/draco/javascript/emscripten/draco_web_encoder.idl を参照してください。
Javascript デコーダは javascript/draco_decoder.js にあります。 Javascript デコーダはメッシュと点群をデコードできます。デコーダを使用するには、まずDracoDecoderModule
のインスタンスを作成する必要があります。次に、このインスタンスを使用してDecoderBuffer
とDecoder
オブジェクトが作成されます。エンコードされたデータをDecoderBuffer
に設定します。次に、 GetEncodedGeometryType()
を呼び出して、メッシュや点群などのジオメトリのタイプを識別します。次に、 DecodeBufferToMesh()
またはDecodeBufferToPointCloud()
を呼び出します。これにより、メッシュ オブジェクトまたは点群が返されます。例えば:
// Create the Draco decoder.
const decoderModule = DracoDecoderModule ( ) ;
const buffer = new decoderModule . DecoderBuffer ( ) ;
buffer . Init ( byteArray , byteArray . length ) ;
// Create a buffer to hold the encoded data.
const decoder = new decoderModule . Decoder ( ) ;
const geometryType = decoder . GetEncodedGeometryType ( buffer ) ;
// Decode the encoded geometry.
let outputGeometry ;
let status ;
if ( geometryType == decoderModule . TRIANGULAR_MESH ) {
outputGeometry = new decoderModule . Mesh ( ) ;
status = decoder . DecodeBufferToMesh ( buffer , outputGeometry ) ;
} else {
outputGeometry = new decoderModule . PointCloud ( ) ;
status = decoder . DecodeBufferToPointCloud ( buffer , outputGeometry ) ;
}
// You must explicitly delete objects created from the DracoDecoderModule
// or Decoder.
decoderModule . destroy ( outputGeometry ) ;
decoderModule . destroy ( decoder ) ;
decoderModule . destroy ( buffer ) ;
完全な API については、src/draco/javascript/emscripten/draco_web_decoder.idl を参照してください。
Javascript デコーダは動的メモリを使用して構築されています。これにより、デコーダはすべての圧縮データを処理できるようになります。ただし、このオプションは最速ではありません。メモリを事前に割り当てると、デコーダの速度が約 2 倍向上します。プロジェクトのメモリ要件をすべて把握している場合は、それに応じてCMakeLists.txt
変更することで静的メモリを有効にすることができます。
v1.0 以降、Draco はジオメトリ以外のデータをエンコードするためのメタデータ機能を提供します。これを使用して、ジオメトリとともにカスタム データをエンコードできます。たとえば、メタデータ機能を有効にして、属性の名前、サブオブジェクトの名前、カスタマイズされた情報をエンコードできます。 1 つのメッシュと点群に対して、1 つのトップレベル ジオメトリ メタデータ クラスを持つことができます。最上位のメタデータには階層的なメタデータを含めることができます。それ以外に、トップレベルのメタデータには、属性メタデータと呼ばれる各属性のメタデータを含めることができます。属性メタデータは、メッシュ内の対応する属性 ID で初期化する必要があります。メタデータ API は、C++ と Javascript の両方で提供されます。たとえば、C++ でメタデータを追加するには、次のようにします。
draco::PointCloud pc;
// Add metadata for the geometry.
std::unique_ptr<draco::GeometryMetadata> metadata =
std::unique_ptr<draco::GeometryMetadata>( new draco::GeometryMetadata());
metadata-> AddEntryString ( " description " , " This is an example. " );
pc.AddMetadata(std::move(metadata));
// Add metadata for attributes.
draco::GeometryAttribute pos_att;
pos_att.Init(draco::GeometryAttribute::POSITION, nullptr , 3 ,
draco::DT_FLOAT32, false , 12 , 0 );
const uint32_t pos_att_id = pc.AddAttribute(pos_att, false , 0 );
std::unique_ptr<draco::AttributeMetadata> pos_metadata =
std::unique_ptr<draco::AttributeMetadata>(
new draco::AttributeMetadata(pos_att_id));
pos_metadata-> AddEntryString ( " name " , " position " );
// Directly add attribute metadata to geometry.
// You can do this without explicitly add |GeometryMetadata| to mesh.
pc.AddAttributeMetadata(pos_att_id, std::move(pos_metadata));
C++ でジオメトリからメタデータを読み取るには:
// Get metadata for the geometry.
const draco::GeometryMetadata *pc_metadata = pc.GetMetadata();
// Request metadata for a specific attribute.
const draco::AttributeMetadata *requested_pos_metadata =
pc.GetAttributeMetadataByStringEntry( " name " , " position " );
完全な API については、src/draco/metadata および src/draco/point_cloud を参照してください。
Draco NPM NodeJS パッケージは javascript/npm/draco3d にあります。詳しい使用方法については、フォルダー内のドキュメントを参照してください。
以下は、 three.js
レンダラを使用して Javascript デコーダ経由でロードされた Draco で幾何学的圧縮された例です。
詳細については、javascript/example/README.md ファイルを参照してください。
Emscripten で構築された Draco JavaScript デコーダの事前構築済みバージョンは、www.gstatic.com のバージョン ラベル付きディレクトリにホストされています。
https://www.gstatic.com/draco/versioned/decoders/VERSION/*
v1.4.3 リリースの時点で、利用可能なファイルは次のとおりです。
v1.5.1 リリース以降、アサーションが有効になった次のファイルのビルドが利用可能になります。
ご質問やご意見がございましたら、[email protected] までメールでお問い合わせください。
このライブラリでエラーを見つけた場合は、https://github.com/google/draco/issues で問題を報告してください。
パッチは推奨されており、このプロジェクトをフォークし、GitHub 経由でプル リクエストを送信することで送信できます。詳細については、「貢献」を参照してください。
Apache License バージョン 2.0 (「ライセンス」) に基づいてライセンスされています。ライセンスに準拠する場合を除き、このファイルを使用することはできません。ライセンスのコピーは次の場所で入手できます。
http://www.apache.org/licenses/LICENSE-2.0
適用される法律で義務付けられている場合または書面による同意がない限り、ライセンスに基づいて配布されるソフトウェアは、明示または黙示を問わず、いかなる種類の保証や条件もなく、「現状のまま」で配布されます。ライセンスに基づく許可と制限を規定する特定の言語については、ライセンスを参照してください。
スタンフォード大学グラフィック部門のバニーモデル https://graphics.stanford.edu/data/3Dscanrep/