Внимание пользователей GStatic: команда Draco настоятельно рекомендует использовать версионные URL-адреса для доступа к контенту Draco GStatic. Если вы используете URL-адреса, которые включают подстроку v1/decoders
в URL-адресе, пограничное кэширование и задержки распространения GStatic могут привести к временным ошибкам, которые может быть трудно диагностировать при запуске новых выпусков Draco. Чтобы избежать этой проблемы, прикрепите свои сайты к версии версии.
install_test
файла src/draco/tools
.https://github.com/google/draco/releases
Draco — это библиотека для сжатия и распаковки 3D-геометрических сеток и облаков точек. Он предназначен для улучшения хранения и передачи 3D-графики.
Draco был спроектирован и создан с учетом эффективности и скорости сжатия. Код поддерживает сжатие точек, информацию о связности, координаты текстуры, информацию о цвете, нормали и любые другие общие атрибуты, связанные с геометрией. Благодаря Draco приложения, использующие 3D-графику, могут быть значительно меньше без ущерба для визуальной точности. Для пользователей это означает, что приложения теперь могут загружаться быстрее, 3D-графика в браузере может загружаться быстрее, а сцены VR и AR теперь могут передаваться с использованием меньшей пропускной способности и быстро отображаться.
Draco выпущен в виде исходного кода C++, который можно использовать для сжатия трехмерной графики, а также в виде декодеров C++ и Javascript для закодированных данных.
Содержание
Инструкции по сборке см. в разделе «СТРОИТЕЛЬСТВО».
Для получения дополнительной информации об использовании Unity с Draco посетите https://github.com/atteneder/DracoUnity.
Простой пример использования Unity с Draco см. в README в папке Unity.
Рекомендуется всегда скачивать декодеры Draco WASM и JavaScript из:
https://www.gstatic.com/draco/v1/decoders/
Пользователи получат выгоду от наличия декодера Draco в кеше, поскольку все больше сайтов начнут использовать статический URL-адрес.
Целью по умолчанию, созданной из файлов сборки, будут приложения командной строки draco_encoder
и draco_decoder
. Кроме того, draco_transcoder
генерируется, когда CMake запускается с переменной DRACO_TRANSCODER_SUPPORTED, установленной в значение ON (дополнительную информацию см. в разделе ПОСТРОЕНИЕ). Для всех приложений, если вы запустите их без каких-либо аргументов или -h
, приложения выведут данные об использовании и параметрах.
draco_encoder
будет читать файлы OBJ, STL или PLY в качестве входных данных и выводить файлы в кодировке Draco. Мы включили для тестирования сетку Stanford's 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
.
Вы можете закодировать данные облака точек с помощью draco_encoder
, указав параметр -point_cloud
. Если вы укажете параметр -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()
, который вернет объект Mesh или облако точек. Например:
// 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
.
Начиная с версии 1.0, Draco предоставляет функциональные возможности метаданных для кодирования данных, отличных от геометрии. Его можно использовать для кодирования любых пользовательских данных вместе с геометрией. Например, мы можем включить функцию метаданных для кодирования названий атрибутов, названий подобъектов и настраиваемой информации. Для одной сетки и облака точек может быть один класс метаданных геометрии верхнего уровня. Метаданные верхнего уровня тогда могут иметь иерархические метаданные. Помимо этого, метаданные верхнего уровня могут иметь метаданные для каждого атрибута, которые называются метаданными атрибута. Метаданные атрибута должны быть инициализированы соответствующим идентификатором атрибута внутри сетки. 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. Подробное описание использования см. в документе в папке.
Вот пример геометрического сжатия с Draco, загруженного через декодер Javascript с использованием средства рендеринга three.js
.
Дополнительную информацию см. в файле javascript/example/README.md.
Готовые версии декодеров JavaScript Draco, созданных Emscripten, размещены на сайте www.gstatic.com в каталогах с пометкой версии:
https://www.gstatic.com/draco/versioned/decoders/VERSION/*
Начиная с версии 1.4.3 доступны следующие файлы:
Начиная с версии 1.5.1, доступны сборки следующих файлов с поддержкой утверждений:
Если у вас есть вопросы/комментарии, отправьте электронное письмо на адрес [email protected].
Если вы обнаружили ошибку в этой библиотеке, сообщите о проблеме на странице https://github.com/google/draco/issues.
Патчи приветствуются и могут быть отправлены путем разветвления этого проекта и отправки запроса на вытягивание через GitHub. Подробнее см. ВКЛАД.
Лицензия Apache версии 2.0 («Лицензия»); вы не можете использовать этот файл, кроме как в соответствии с Лицензией. Вы можете получить копию Лицензии по адресу:
http://www.apache.org/licenses/LICENSE-2.0
Если это не требуется действующим законодательством или не согласовано в письменной форме, программное обеспечение, распространяемое по Лицензии, распространяется на условиях «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ ИЛИ УСЛОВИЙ, явных или подразумеваемых. См. Лицензию для определения конкретного языка, регулирующего разрешения и ограничения в рамках Лицензии.
Модель кролика из графического отдела Стэнфорда https://graphics.stanford.edu/data/3Dscanrep/