چگونه مدل های 3D را در جاوا دانلود کنیم

چگونه مدل های 3D را در جاوا دانلود کنیم

Aspose.3D FOSS برای جاوا یک API ساده را برای باز کردن فایل های 3D بدون هیچ وابستگی بومی فراهم می کند. Scene شما می توانید از هیرارکی های گره عبور کنید و داده های ژئومتری خام را برای هر مچ در صحنه بخوانید.

راهنمای گام به گام

مرحله اول: اضافه کردن اعتیاد به Maven

اضافه کردن وابستگی Aspose.3D FOSS به خودتان pom.xml.هیچ کتابخانه ای دیگر نیازی به کار نیست.

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

مرحله دوم: واردات کلاس های مورد نیاز

و این 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 بسته بندی.


مرحله سوم: فایل را بارگذاری کنید

استفاده از استاتیک Scene.fromFile() روش باز کردن هر فرمت پشتیبانی شده: کتابخانه به طور خودکار از افزونه فایل، فرمه را تشخیص می دهد.

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

به جای آن، ایجاد یک Scene مثال و تماس open().این مفید است زمانی که شما می خواهید برای عبور از گزینه های بار و یا مدیریت خطا به صراحت:

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

هر دو رویکرد پشتیبانی از OBJ، STL (بینی و ASCII)، glTF 2.0 / GLB، و فایل های FBX.


مرحله چهارم: عبور از صحنه نودها

یک صحنه بارگذاری شده، درختی است که در آن 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: دسترسی به Vertex و Polygon داده ها

یک نود را به عنوان یک 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() بازگشت به A List<Vector4> کجا x, y, z موقعیت را در اختیار داشته باشید و w هماهنگی همگن (به طور معمول 1.0) است.

mesh.getPolygons() بازگشت به A List<int[]> جایی که هر مجموعه ای از شاخص های نقطه کنترل برای یک چهره است.


مرحله 6: گزینه های بار خاص فرمت را اعمال کنید

برای کنترل دقیق در مورد چگونگی تفسیر یک فایل، گزینه بار را به عنوان مثال ارسال کنید. Scene.fromFile() یا scene.open().

فایل های OBJ - 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);

فایل های STL - 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 و حالت های باینری به طور خودکار شناسایی می شوند.
GTTF.gltf, .glbglTF 2.0؛ دوگانه GLB و JSON هر دو پشتیبانی می شود
FBX.fbxFBX پشتیبانی می شود

مشکلات و اصلاحات مشترک

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) هر دو جاوا را می پذیرند. InputStream.شما هم می توانید یک FileFormat پارامتر زمانی که جریان یک تمدید را حمل نمی کند.

آیا کتابخانه ایمن است؟?

هر کدام Scene این حالت مستقل است و وضعیت متغیر را با سایر موارد به اشتراک نمی گذارد.

چگونه می توانم تعداد پلیگون را بدون تکرار هر چهره بخوانم؟?

تماس تلفنی mesh.getPolygonCount() برای یک حساب کامل مستقیم.


همچنین ببینید

 فارسی