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 디코더로 출시되었습니다.
내용물
조립 지침은 BUILDING을 참조하세요.
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
DRACO_TRANSCODER_SUPPORTED 변수를 ON으로 설정하여 CMake를 실행할 때 생성됩니다(자세한 내용은 BUILDING 참조). 모든 애플리케이션에 대해 인수나 -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
glTF 자산에 Draco 압축을 추가하는 데 사용할 수 있습니다. 기본 명령줄은 다음과 같습니다.
./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는 형상 이외의 데이터 인코딩을 위한 메타데이터 기능을 제공합니다. 이는 형상과 함께 사용자 정의 데이터를 인코딩하는 데 사용될 수 있습니다. 예를 들어, 메타데이터 기능을 활성화하여 속성 이름, 하위 개체 이름 및 사용자 정의된 정보를 인코딩할 수 있습니다. 하나의 메시와 포인트 클라우드의 경우 하나의 최상위 지오메트리 메타데이터 클래스를 가질 수 있습니다. 그러면 최상위 메타데이터는 계층적 메타데이터를 가질 수 있습니다. 그 외에 최상위 메타데이터에는 속성 메타데이터라고 하는 각 속성에 대한 메타데이터가 있을 수 있습니다. 속성 메타데이터는 메시 내의 해당 속성 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 자바스크립트 디코더의 사전 구축된 버전은 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 라이센스 버전 2.0("라이센스")에 따라 라이센스가 부여되었습니다. 라이센스를 준수하는 경우를 제외하고는 이 파일을 사용할 수 없습니다. 다음에서 라이센스 사본을 얻을 수 있습니다.
http://www.apache.org/licenses/LICENSE-2.0
해당 법률에서 요구하거나 서면으로 동의하지 않는 한, 라이선스에 따라 배포되는 소프트웨어는 명시적이든 묵시적이든 어떠한 종류의 보증이나 조건 없이 "있는 그대로" 배포됩니다. 라이선스에 따른 허가 및 제한 사항을 관리하는 특정 언어는 라이선스를 참조하세요.
스탠포드 그래픽 부서의 토끼 모델 https://graphics.stanford.edu/data/3Dscanrep/