用於 Java 的 FileFormat.Drako
使用 Java API 簡化 Google Draco 檔案的讀取和寫入過程
輕鬆編輯壓縮的 DRC 檔案,使用 FileFormat.Drako 這個輕量級的開源 Java API,簡化 Draco 檔案的轉換和自動化
FileFormat.Drako for Java 徹底改變了您的 Draco 檔案處理體驗。在這份綜合指南中,我們深入探討了利用FileFormat.Drako(一種輕量級開源 Java API)的功能和優勢,輕鬆輕鬆地處理 Draco 檔案。
Draco是Google開發的開源壓縮函式庫,專門用於壓縮和解壓縮3D幾何網格和點雲。透過顯著減小 3D 圖形檔案的大小,Draco 可以實現更快的傳輸並降低儲存要求,同時保持視覺品質。它支援各種 3D 應用程序,包括基於 Web 和行動平台,確保高效處理複雜的 3D 資料。 Draco廣泛應用於遊戲、虛擬實境和3D視覺化等產業,以優化效能並增強用戶體驗。
FileFormat.Drako 成為無縫讀寫 Draco 檔案的強大解決方案。這個輕量級開源 Java API 簡化了 Draco 圖像操作,為開發人員和用戶提供了一個用戶友好的介面來輕鬆處理 Draco 檔案。
FileFormat.Drako 可在MIT 授權下使用。
主要特性與優點- 高壓縮比:Draco 顯著減小了檔案大小,通常將檔案大小減小了 90%,而視覺品質沒有明顯損失。這使其成為頻寬和儲存有限的應用程式的理想選擇。
- 支援各種資料類型:Draco 支援各種 3D 資料類型的壓縮,包括幾何網格和點雲。它可以有效地處理頂點位置、顏色、法線和其他屬性。
- 快速壓縮和解壓縮:該庫旨在提供高速壓縮和解壓縮,使其適合實時應用程序,例如基於網絡的 3D 檢視器和虛擬現實體驗。
- 開源且免費:享受開源解決方案的優勢,無需支付許可費用,所有級別的開發者和用戶都可以使用它。
- 與Java 應用程式無縫整合:輕鬆地將FileFormat.Drako 整合到您的Java 應用程式中,從而在您現有的工作流程中實現無縫的Draco 檔案處理。
- 高壓縮比:Draco 顯著減小了檔案大小,通常將檔案大小減小了 90%,而視覺品質沒有明顯損失。這使其成為頻寬和儲存有限的應用程式的理想選擇。
- 支援各種資料類型:Draco 支援各種 3D 資料類型的壓縮,包括幾何網格和點雲。它可以有效地處理頂點位置、顏色、法線和其他屬性。
- 快速壓縮和解壓縮:該庫旨在提供高速壓縮和解壓縮,使其適合實時應用程序,例如基於網絡的 3D 檢視器和虛擬現實體驗。
- 開源且免費:享受開源解決方案的優勢,無需支付許可費用,所有級別的開發者和用戶都可以使用它。
- 與Java 應用程式無縫整合:輕鬆地將FileFormat.Drako 整合到您的Java 應用程式中,從而在您現有的工作流程中實現無縫的Draco 檔案處理。
如何開始使用FileFormat.Drako for Java
FileFormat.Drako 入門既快速又簡單。只需按照以下步驟操作:
- InstallFileFormat.Drako:透過 Maven 或 Gradle 安裝 FileFormat.Drako 套件。
- 開始轉換:利用FileFormat.Drako提供的簡單API來讀寫Draco檔。
為 Java 安裝FileFormat.Drako 的建議方法是使用 maven。請使用以下 pom 依賴片段以順利安裝。
POM 片段
<dependency>
<groupId>dev.fileformat</groupId>
<artifactId>drako</artifactId>
<version>1.4.1</version>
</dependency>
您也可以直接從 GitHub 下載它。用Java將Draco檔案讀入DracoMesh
此程式碼片段有效載入 Draco 文件,並將其儲存在 DracoMesh 實例中以供後續操作。
- 使用
Files.readAllBytes
開啟名為「cube.drc」的 DRC 檔案。 - 將 3D 網格從位元組載入到
DracoMesh
物件中。
將下面的程式碼片段複製並貼上到主文件中並執行程式。
讀取.drc檔到DracoMesh實例
byte[] cube = Files.readAllBytes(Paths.get("cube.drc"));
DracoMesh dm = (DracoMesh)Draco.decode(cube);
用 Java 讀取 Draco 檔案並寫入 Wavefront OBJ
以下程式碼說明如何開啟現有的 3D Draco 文件,並寫入 obj 格式以進行進一步處理:
- 使用
Files.readAllBytes
開啟名為「input.drc」的 Draco 檔案。 - 將 Draco 網格從位元組載入到
DracoMesh
物件中。 - 使用
DracoMesh.getNamedAttribute
尋找位置屬性,並將其內容轉換為FloatSpan
。 - 使用 OBJ 格式將控制點寫入輸出。
- 使用
DracoMesh.readFace
讀取每個面角 - 使用
PointAttribute.mappedIndex
將面角對應到控制點索引。 - 使用 OBJ 格式將面寫入輸出。
將下面的程式碼片段複製並貼上到主文件中並執行程式。
將.drc檔讀取到DracoMesh並匯出到wavefront obj
//load draco file
byte[] bytes = Files.readAllBytes(Paths.get("input.drc"));
DracoMesh mesh = (DracoMesh)Draco.decode(bytes);
if (mesh == null)
throw new IllegalStateException("Input file is not a valid draco file.");
PointAttribute attrPos = mesh.getNamedAttribute(AttributeType.POSITION);
FloatSpan points = attrPos.getBuffer().asSpan().asFloatSpan();
try(FileOutputStream fos = new FileOutputStream("output.obj", false)) {
try (OutputStreamWriter writer = new OutputStreamWriter(fos)) {
for (int i = 0; i < points.size(); i += 3) {
writer.write(String.format("v %f %f %f\n", points.get(i), points.get(i + 1), points.get(i + 2)));
}
int[] face = new int[3];
for (int i = 0; i < mesh.getNumFaces(); i++) {
mesh.readFace(i, face);
int a = attrPos.mappedIndex(face[0]) + 1;
int b = attrPos.mappedIndex(face[1]) + 1;
int c = attrPos.mappedIndex(face[2]) + 1;
writer.write(String.format("f %d %d %d\n", a, b, c));
}
}
}
用 Java 程式設計方式將控制點、三角形編碼到 Draco 檔案
提供的程式碼示範如何以程式設計方式從控制點和三角形建立 Draco 文件,並使用 Java 將其儲存為「output.drc」。以下是具體步驟:
- 建立一個
DracoMesh
實例。 - 將控制點包裹到
PointAttribute
。 - 將
PointAttribute
加到DracoMesh
。 - 新增三角形索引。
- 使用指定的編碼參數建立一個
DracoEncodeOptions
物件。 - 使用
Draco.encode
將網格編碼為位元組。
將下面的程式碼片段複製並貼上到主文件中並執行程式。
將向量和麵編碼到 .drc 檔案
Vector3[] controlPoints = new Vector3[]
{
new Vector3( -5, 0, 5.0f),
new Vector3( 5, 0, 5.0f),
new Vector3( 5, 10, 5.0f),
new Vector3( -5, 10, 5.0f),
new Vector3( -5, 0, -5.0f),
new Vector3( 5, 0, -5.0f),
new Vector3( 5, 10, -5.0f),
new Vector3( -5, 10, -5.0f)
};
int[] indices = new int[]
{
0,1,2, 0, 2, 3, // Front face (Z+)
1,5,6, 1, 6, 2, // Right side (X+)
5,4,7, 5, 7, 6, // Back face (Z-)
4,0,3, 4, 3, 7, // Left side (X-)
0,4,5, 0, 5, 1, // Bottom face (Y-)
3,2,6, 3, 6, 7 // Top face (Y+)
};
DracoMesh mesh = new DracoMesh();
PointAttribute attrPos = PointAttribute.wrap(AttributeType.POSITION, controlPoints);
mesh.addAttribute(attrPos);
//add triangle indices
mesh.getIndices().addRange(indices);
//number of the control points, it's required for the encoder to produce correct result.
mesh.setNumPoints(8);
//You can also use following methods to deduplicate the attributes to reduce the file size
//mesh.deduplicateAttributeValues();
//mesh.deduplicatePointIds();
DracoEncodeOptions opt = new DracoEncodeOptions();
byte[] drcBytes = Draco.encode(mesh, opt);
Files.write(Paths.get("output.drc"), drcBytes);
FileFormat.Drako 提供直覺的 API、全面的格式支援以及與 Java 應用程式的無縫集成,使開發人員和使用者能夠輕鬆管理 Draco 文件。無論您是將 draco 文件轉換為其他文件,還是加載 draco 進行渲染,FileFormat.Drako 都能簡化流程,確保每一步都達到最佳效率和品質。
探索我們的GitHub 儲存庫以做出貢獻、提出改進建議並增強此開源API:FileFormat .Drako- for-Java