כיצד להעלות מודלים 3D ב- Java

כיצד להעלות מודלים 3D ב- Java

Aspose.3D FOSS for Java מספק API פשוט לפתיחת קבצים 3D ללא כל תלות מקומית. Scene אובייקט אתה יכול ללכת על הירוקרגיה של הכפתורים ולקרוא נתוני גיאומטריה ירוק עבור כל מילה על הבמה.

הדרכה שלב אחר צעד

שלב 1: הוסף את ההסתמכות Maven

הוסף את Aspose.3D FOSS תלות שלך pom.xml.אין צורך בספריות מקומיות נוספות.

<dependency>
  <groupId>org.aspose</groupId>
  <artifactId>aspose-3d-foss</artifactId>
  <version>26.5.0</version>
</dependency>

שלב 2: ייבוא הכיתות הנדרשות

את Scene מדרגה היא המכולת ברמה העליונה עבור כל הנתונים 3D. ייבוא זה יחד עם Node, Mesh, וכל סוג של אפשרויות העומס ספציפי שאתה צריך.

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;

כל המעמדות הציבוריים חיים תחת com.aspose.threed חבילה →.


שלב 3: להעלות קובץ

השתמשו במצב סטטי Scene.fromFile() שיטת פתיחת כל פורמט תומך.הספרייה מזהה את הפורמט באופן אוטומטי מתוך הרחבת הקובץ.

// Automatic format detection from the file extension
Scene scene = Scene.fromFile("model.obj");

אחרת, יצירת A Scene מקרה וקול open().זה שימושי כאשר אתה רוצה לעבור אפשרויות העומס או להתמודד עם שגיאות באופן ברור:

Scene scene = new Scene();
scene.open("model.obj");

שני הגישות תומכות OBJ, STL (בינארי ו ASCII), glTF 2.0 / GLB, ואת קבצי FBX.


שלב 4: מעבר נוטים סצנה

עץ שורש הוא עצי Node אובייקטים שורשים ב scene.getRootNode().שימוש getChildNodes() כדי לתרגל מחדש ולבקר בכל העמודים:

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);
        }
    }
}

כל אחד Node ניתן להביא אפס או יותר. Entity אובייקטים (מסיבות, מצלמות, אור) צפו node.getEntities() כדי לבדוק כל הישות המצורפת לחוט, או להשתמש בו node.getEntity() כדי להשיג את האופי העיקרי.


שלב 5: גישה לנתונים וורטקס ופוליגון

להדביק את האנטישמיות של נוטה ל Mesh וקוראים getControlPoints() עבור עמדות וורטקס ו getPolygons() עבור רשימות אינדיקטורים פנים:

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() חוזר א List<Vector4> איפה x, y, z לקחת את המיקום ואת w זהו הקואורדינט הומוגני (בדרך כלל 1.0).

mesh.getPolygons() חוזר א List<int[]> שם כל רצועה היא הקבוצה המוזכרת של אינדיקטורים נקודת בקרה עבור פנים אחת.


שלב 6: יישום אפשרויות טעינה ספציפיות פורמט

כדי לשלוט בצורה מעולה על האופן שבו מתפרש קובץ, עבר דוגמה של אפשרויות טעינה ל- Scene.fromFile() או scene.open().

קבצים אובייקטיביים - 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 - 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);

קבצים סטל - 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);

פורמטים תומכים ייבוא

פורמטהרחבההערות
OBJ.objWavefront OBJ; אופציונלי .mtl קובץ מסך; מאפשר עם ObjLoadOptions.setEnableMaterials(true)
STL.stlASCII ומצב בינארי נמצאים באופן אוטומטי.
GLTF.gltf, .glbglTF 2.0; בינארי GLB ו- JSON הן תומכות
FBX.fbxתמיכה ב-Binary FBX

בעיות נפוצות ותקנות

IOException על הלחץ – בדוק את מסלול הקובץ הוא נכון והקובצין קיים.השתמש במסלולים מוחלטים במהלך הפיתוח כדי לחסל את אי-שוויון העבודה-מנהל.

NullPointerException גישה לאובייקט לא כל נוטים נושאים גיאומטריה.תמיד לשמור על node.getEntity() instanceof Mesh לפני הקצאת או איטרה node.getEntities() כדי לטפל בכפתורים עם מספר אובייקטים מקושרים.

מערכת הקואורדינטה לא תואמת אם המודל הנעלם מופיע מעוגל או מסובב, השתמשו setFlipCoordinateSystem(true) על פי ההערכות המתאימות (ObjLoadOptions, GltfLoadOptions,או StlLoadOptions).

המופע מחזיק אבל getChildNodes() ריק - חלק מהקבצים מאוחסנים גיאומטריה תחת סתרים במקום את הקוטר השורש. scene.getSubScenes() ובדק את הקוטב השורש של כל סצנה.


שאלות נפוצות (FAQ)

אילו פורמטים אני יכול להעלות?

OBJ, STL (בינארי ו- ASCII), glTF 2.0 / GLB, ו FBX. זיהוי פורמט הוא אוטומטי בהתבסס על הרחבת הקובץ כאשר אתה מתקשר Scene.fromFile().

האם אני יכול להעלות את זה מהזרם?

כן כן. scene.open(InputStream) ו Scene.fromStream(InputStream) שניהם מקבלים Java. InputStream.אתה יכול גם לעבור את A FileFormat הפרימטרים כאשר זרם אינו נושא הרחבה.

האם הספרייה בטוחה?

כל אחד Scene המצב הוא עצמאי ואינו חולק מצב משתנה עם מקרים אחרים.

איך אני קורא את מספר הפוליגון בלי לגרד כל פנים?

שיחת טלפון mesh.getPolygonCount() על חשבון מלא ישיר.


ראה גם

 עברית