Java'da 3D Modeller Nasıl Yüklendi
Aspose.3D FOSS for Java, herhangi bir yerli bağımlılık olmadan 3D dosyalarını açmak için basit bir API sağlar. Scene nesne düğüm hierarşisini yürüyebilir ve sahnede her mesh için hammadde geometri verilerini okuyabilirsiniz.
Adım-Adım Rehberi
Adım 1: Maven Bağımlılığı Ekleyin
Aspose.3D FOSS bağımlılığına ekleyin pom.xml.Ek olarak, yerel kütüphaneler gerektirmez.
<dependency>
<groupId>org.aspose</groupId>
<artifactId>aspose-3d-foss</artifactId>
<version>26.5.0</version>
</dependency>Adım 2: İhtiyaç duyulan sınıfları ithal etmek
O zamanlar Scene sınıf tüm 3D veriler için üst düzey konteynerdir. ithalat ile birlikte Node, Mesh, ve ihtiyacınız olan herhangi bir format-sözleşik yük seçeneği sınıfları.
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;Tüm toplumsal sınıflar, bu com.aspose.threed paket için.
Adım 3: Dosyayı yükleme
statik kullanın Scene.fromFile() Herhangi bir destekli biçimi açma yöntemi. kütüphane dosya uzantısından otomatik olarak biçim tespit eder.
// Automatic format detection from the file extension
Scene scene = Scene.fromFile("model.obj");Alternatif olarak, bir Scene İstek ve Çağrı open().Bu, yük seçeneklerini geçmek veya hataları açıkça ele almak istediğinizde yararlıdır:
Scene scene = new Scene();
scene.open("model.obj");Her iki yaklaşım da OBJ, STL (binary ve ASCII), glTF 2.0 / GLB ve FBX dosyalarını destekler.
Adım 4: Sahne düğmeleri geçin
Bir sahne bir ağaçtır, bir Node ırkçı olan nesneler scene.getRootNode().Kullanım getChildNodes() İterat ettikçe ve tüm düğümleri ziyaret etmek için:
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);
}
}
}Her biri Node 0 veya daha fazla taşıyabilir. Entity • Fotoğraflar, fotoğraf makineleri ve ışıklar (Türkçe Altyazılı) node.getEntities() bir düğmeye bağlı her varlığı kontrol etmek veya kullanmak için, node.getEntity() Birincil birimlerin kurulması için.
5. Adım: Vertex ve Polygon verilerine erişim
Bir node’un entitesini atmak için Mesh ve çağrı getControlPoints() Vertex pozisyonları ve getPolygons() Yüz indeksi listeleri için:
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() geri döner a List<Vector4> Nerede x, y, z pozisyonunu ve w Bu koordinasyonun normalde 1.0 olarak belirlenmesi gerekir.
mesh.getPolygons() geri döner a List<int[]> Her array, bir yüz için kontrol noktası göstergelerinin sipariş edilen setidir.
Adım 6: Format-Specific Load Options uygulayın
Bir dosyanın nasıl yorumlandığını kontrol etmek için, bir yükleme seçeneği örneğini geçin. Scene.fromFile() veya scene.open().
KPSS dosyaları - 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);GLTF / GLB dosyaları - 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);STL dosyaları - 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);Desteklenen İthalat Formatı
| Format Yapıları | Genişletme | Notlar |
|---|---|---|
| OBJ | .obj | Wavefront OBJ; seçmeli .mtl Dosya dosyası; ile birlikte ObjLoadOptions.setEnableMaterials(true) |
| STL | .stl | ASCII ve biner modlar otomatik olarak tespit edilir. |
| GTTF | .gltf, .glb | glTF 2.0; ikili GLB ve JSON varyantları hem desteklenir |
| FBX | .fbx | Binary FBX desteklenmektedir. |
Toplam Sorunlar ve Çözümler
IOException yük üzerinde Dosya yolu doğru ve dosya var. geliştirme sırasında mutlak yolları kullanarak çalışma-direktori çelişkilerini ortadan kaldırın.
NullPointerException erişim kuruluşu Her düğüm geometri taşımaz. her zaman korumak için node.getEntity() instanceof Mesh İtterate veya casting önce node.getEntities() Birden fazla nesne ile bağlantılı düğümleri ele almak.
koordinasyon sistemi yanlış anlaşılır - yüklü model kaydırılmış veya döndürülmüş görünürse, kullanın. setFlipCoordinateSystem(true) uygun yük seçenekleri sınıfı (ObjLoadOptions, GltfLoadOptions,veya StlLoadOptions).
sahne yükü ama getChildNodes() boşlukta — Bazı dosyalar kök düğüm yerine alt sahneler altında geometri depolamaktadır. scene.getSubScenes() Her alt sahnenin kök düğmesini inceleyin.
Sıkça Sorulan Sorular (FAQ)
Hangi formatı yüklemek istiyorum?
OBJ, STL (binary ve ASCII), glTF 2.0 / GLB ve FBX. Format algılama aradığınızda dosya uzantısına göre otomatik olarak yapılır Scene.fromFile().
Bir akımdan yükleyebilir miyim?
Evet evet. scene.open(InputStream) ve Scene.fromStream(InputStream) Her ikisi de Java’yı kabul eder. InputStream.Ayrıca bir a geçebilirsiniz. FileFormat Parametreler, akışın bir uzantıya sahip olmadığı zaman.
Kütüphane güvenli mi?
Her biri Scene Örnek bağımsızdır ve diğer örneklerle değişken durum paylaşmaz.
Her yüzü iterasyon yapmadan poligon sayımlarını nasıl okuyacağım?
Çağrı mesh.getPolygonCount() Bir bütün sayım için.