Cara Mengisi Model 3D dalam Java
Aspose.3D FOSS untuk Java menyediakan API yang mudah untuk membuka file 3D tanpa ketergantungan asli. Scene objek Anda dapat berjalan hierarki nod dan membaca data geometri mentah untuk setiap mesh di adegan.
Panduan Langkah-Langkah
Langkah 1: Tambah ketergantungan Maven
Tambahkan Aspose.3D FOSS ketergantungan ke Anda pom.xml.Tidak ada perpustakaan asli tambahan yang diperlukan.
<dependency>
<groupId>org.aspose</groupId>
<artifactId>aspose-3d-foss</artifactId>
<version>26.5.0</version>
</dependency>Langkah 2: Mengimport kelas yang diperlukan
yang Scene kelas adalah konten tingkat atas untuk semua data 3D. mengimpor bersama dengan Node, Mesh, dan setiap format-specifik opsi kelas yang Anda butuhkan.
import com.aspose.threed.Scene;
import com.aspose.threed.Node;
import com.aspose.threed.Mesh;
import com.aspose.threed.Entity;
import com.aspose.threed.ObjLoadOptions;
import com.aspose.threed.GltfLoadOptions;
import com.aspose.threed.StlLoadOptions;Semua kelas publik hidup di bawah com.aspose.threed Pakaian yang.
Langkah 3: Mengisi file
Gunakan statik Scene.fromFile() Cara untuk membuka format yang didukung. perpustakaan secara otomatis mengidentifikasi format dari file extension.
// Automatic format detection from the file extension
Scene scene = Scene.fromFile("model.obj");Sebagai alternatif, membuat sebuah Scene Contoh dan panggilan open().Ini berguna ketika Anda ingin melewati opsi beban atau menangani kesalahan secara eksplisit:
Scene scene = new Scene();
scene.open("model.obj");Kedua pendekatan mendukung OBJ, STL (binary dan ASCII), glTF 2.0 / GLB, dan file FBX.
Langkah 4: Mengatasi Node Adegan
Sebuah tempat yang penuh beban adalah sebuah pohon dari Node Objek yang berakar pada scene.getRootNode().Gunakan getChildNodes() untuk iterasi berulang dan mengunjungi semua nod:
import com.aspose.threed.Scene;
import com.aspose.threed.Node;
public class SceneWalker {
public static void main(String[] args) throws Exception {
Scene scene = Scene.fromFile("model.obj");
walkNode(scene.getRootNode(), 0);
}
static void walkNode(Node node, int depth) {
String indent = " ".repeat(depth);
System.out.println(indent + "Node: " + node.getName());
for (Node child : node.getChildNodes()) {
walkNode(child, depth + 1);
}
}
}Setiap Node dapat membawa nol atau lebih Entity objek (mesh, kamera, lampu) untuk melihat node.getEntities() untuk memeriksa setiap entitas yang terikat pada nod, atau menggunakan node.getEntity() untuk mengembalikan entitas utama.
Langkah 5: Akses Vertex dan Polygon Data
Menggunakan entitas node untuk Mesh dan panggilan getControlPoints() untuk posisi vertex dan getPolygons() Untuk daftar indeks wajah:
import com.aspose.threed.Scene;
import com.aspose.threed.Node;
import com.aspose.threed.Entity;
import com.aspose.threed.Mesh;
Scene scene = Scene.fromFile("model.obj");
for (Node node : scene.getRootNode().getChildNodes()) {
Entity entity = node.getEntity();
if (entity instanceof Mesh) {
Mesh mesh = (Mesh) entity;
System.out.printf("Mesh '%s': %d vertices, %d polygons%n",
node.getName(),
mesh.getControlPoints().size(),
mesh.getPolygonCount());
// First vertex position (Vector4: x, y, z, w)
if (!mesh.getControlPoints().isEmpty()) {
var v = mesh.getControlPoints().get(0);
System.out.printf(" First vertex: (%.4f, %.4f, %.4f)%n", v.x, v.y, v.z);
}
// First polygon: array of control-point indices
if (!mesh.getPolygons().isEmpty()) {
int[] poly = mesh.getPolygons().get(0);
System.out.println(" First polygon indices: " + java.util.Arrays.toString(poly));
}
}
}mesh.getControlPoints() Kembali ke A List<Vector4> Di mana x, y, z Mengambil posisi dan w adalah koordinat homogen (biasanya 1.0).
mesh.getPolygons() Kembali ke A List<int[]> di mana setiap array adalah set yang dipesan dari indeks titik kontrol untuk satu wajah.
Langkah 6: Menggunakan opsi pengisian spesifik format
Untuk kontrol yang halus tentang bagaimana file ditafsirkan, lulus contoh opsi beban untuk Scene.fromFile() atau scene.open().
File yang berisi - ObjLoadOptions:
import com.aspose.threed.Scene;
import com.aspose.threed.ObjLoadOptions;
ObjLoadOptions options = new ObjLoadOptions();
options.setFlipCoordinateSystem(true); // Convert right-hand Y-up to Z-up
options.setScale(0.01); // Convert centimetres to metres
options.setEnableMaterials(true); // Load the .mtl material file alongside
options.setNormalizeNormal(true); // Normalize all normals to unit length
Scene scene = Scene.fromFile("model.obj", options);File GLTF / GLB - GltfLoadOptions:
import com.aspose.threed.Scene;
import com.aspose.threed.GltfLoadOptions;
GltfLoadOptions options = new GltfLoadOptions();
options.setFlipCoordinateSystem(true); // Flip the coordinate system if needed
Scene scene = Scene.fromFile("model.glb", options);File yang terdaftar - StlLoadOptions:
import com.aspose.threed.Scene;
import com.aspose.threed.StlLoadOptions;
StlLoadOptions options = new StlLoadOptions();
options.setFlipCoordinateSystem(true);
options.setRecalculateNormal(true); // Recompute normals from face geometry
Scene scene = Scene.fromFile("model.stl", options);Format Import yang Disokong
| Formatnya | Perpanjangan | catatan |
|---|---|---|
| OBJ | .obj | Wavefront OBJ; opsi .mtl file; dapat dengan ObjLoadOptions.setEnableMaterials(true) |
| STL | .stl | ASCII dan mode biner secara otomatis dikesan. |
| GTTF | .gltf, .glb | glTF 2.0; varian biner GLB dan JSON kedua disokong |
| FBX | .fbx | Binary FBX didukung |
Masalah dan Fixes Umum
IOException pada load - Periksa jalur file yang benar dan file ada. gunakan jaluran mutlak selama pengembangan untuk menghilangkan ambiguitas kerja-direktori.
NullPointerException entitas akses Tidak semua nod membawa geometri.Selalu menjaga dengan node.getEntity() instanceof Mesh sebelum ditempatkan atau iterate node.getEntities() Untuk mengendalikan nodus dengan beberapa objek yang terikat.
Sistem koordinasi yang salah Jika model yang diisi terlihat berlapis atau berputar, gunakan setFlipCoordinateSystem(true) Untuk kategori yang sesuai (ObjLoadOptions, GltfLoadOptions,atau StlLoadOptions).
Adegan yang menakjubkan tapi getChildNodes() kosongnya Beberapa file menyimpan geometri di bawah sub-scenes bukannya nod akar. scene.getSubScenes() dan memeriksa nod akar setiap sub-scene.
Pertanyaan yang sering ditanyakan (FAQ)
Format apa yang bisa saya muat?
OBJ, STL (binary dan ASCII), glTF 2.0 / GLB, dan FBX. Deteksi format secara otomatis berdasarkan ekstensi file ketika Anda memanggil Scene.fromFile().
Bisakah saya mengisi dari satu aliran?
Ya ya. scene.open(InputStream) dan Scene.fromStream(InputStream) Kedua-duanya menerima Java. InputStream.Anda juga bisa melewati A. FileFormat parameter ketika arus tidak membawa perpanjangan.
Apakah perpustakaan ini aman?
Setiap Scene instans adalah independen dan tidak berbagi status yang berubah dengan instansi lain.
Bagaimana saya membaca polygon count tanpa iterasi setiap wajah?
panggilan mesh.getPolygonCount() untuk jumlah keseluruhan langsung.