Di posting pengantar, kami membahas apa Aspose.3D FOSS untuk .NET itu dan bagaimana memulainya. Posting ini menyelami lebih dalam fitur utama yang membentuk perpustakaan, dengan contoh kode untuk setiap area.

Semua contoh mengasumsikan direktif using berikut:

using Aspose.ThreeD;
using Aspose.ThreeD.Entities;
using Aspose.ThreeD.Shading;

Dan paket NuGet:

dotnet add package Aspose.3D.Converter --version 1.0.0

Grafik Adegan

Graf adegan adalah struktur data inti. Sebuah Scene berisi sebuah RootNode, dan setiap Node dapat memiliki node anak dan sebuah terlampir Entity (seperti sebuah Mesh atau Camera).

Membuat dan Menavigasi Node

var scene = new Scene();

// Create a hierarchy
var parent = scene.RootNode.CreateChildNode("Parent");
var child1 = parent.CreateChildNode("Child1");
var child2 = parent.CreateChildNode("Child2");

// Navigate the tree
Console.WriteLine("Root children: " + scene.RootNode.ChildNodes.Count);
Console.WriteLine("Parent children: " + parent.ChildNodes.Count);

Melampirkan Entity ke Node

Entitas adalah konten visual dari adegan – mesh, kamera, dan lampu. Lampirkan mereka menggunakan CreateChildNode:

var scene = new Scene();

// Create a box primitive and attach it to the scene
var box = new Box(2, 2, 2);
var boxNode = scene.RootNode.CreateChildNode("BoxNode", box);

// Create a sphere primitive
var sphere = new Sphere(1);
var sphereNode = scene.RootNode.CreateChildNode("SphereNode", sphere);

scene.Save("primitives.gltf");

Primitif Bawaan

Edisi .NET mencakup kelas bentuk parametrik yang menghasilkan geometri tanpa konstruksi vertex manual:

PrimitifDeskripsi
BoxKotak berorientasi sumbu dengan lebar, tinggi, dan kedalaman yang dapat dikonfigurasi
SphereBola parametrik dengan jari-jari yang dapat dikonfigurasi
CylinderSilinder parametrik dengan jari-jari atas/bawah dan tinggi yang dapat dikonfigurasi

Primitif ini dapat dilampirkan langsung ke node atau diubah menjadi sebuah Mesh melalui ToMesh():

var cylinder = new Cylinder(1, 1, 2);
var mesh = cylinder.ToMesh();

Console.WriteLine("Vertices: " + mesh.ControlPoints.Count);
Console.WriteLine("Polygons: " + mesh.PolygonCount);

Konstruksi Mesh

Jika Anda memerlukan kontrol penuh, bangun mesh dari awal menggunakan titik kontrol dan definisi poligon:

var mesh = new Mesh();

// Add vertex positions
mesh.ControlPoints.Add(new Vector4(0, 0, 0, 1.0f));
mesh.ControlPoints.Add(new Vector4(1, 0, 0, 1.0f));
mesh.ControlPoints.Add(new Vector4(0.5f, 1, 0, 1.0f));

// Define a triangle face
mesh.CreatePolygon(0, 1, 2);

// Attach to a scene
var scene = new Scene();
scene.RootNode.CreateChildNode("triangle", mesh);
scene.Save("triangle.stl");

Titik kontrol menggunakan Vector4 dengan w set komponen menjadi 1.0f untuk posisi Kartesian standar. Poligon didefinisikan dengan mengirimkan indeks titik kontrol ke CreatePolygon().

Transformasi

Setiap Node memiliki Transform properti yang mengontrol posisi lokal, rotasi, dan skala:

var scene = new Scene();

var node = scene.RootNode.CreateChildNode("Moved");
node.Transform.Translation = new FVector3(5, 0, 0);
node.Transform.Scale = new FVector3(2, 2, 2);

Pewarisan Transform

Transformasi digabungkan melalui hierarki adegan. Posisi ruang-dunia anak adalah hasil perkalian semua transformasi nenek moyang:

var scene = new Scene();

var parent = scene.RootNode.CreateChildNode("Parent");
parent.Transform.Translation = new FVector3(10, 0, 0);

var child = parent.CreateChildNode("Child");
child.Transform.Translation = new FVector3(5, 0, 0);

// Child's world position is (15, 0, 0)
// Access via child.GlobalTransform

GlobalTransform

Yang hanya-baca GlobalTransform properti pada masing-masing Node menyediakan matriks transformasi ruang-dunia yang dihitung setelah menggabungkan semua transformasi nenek moyang. Akses hasilnya melalui node.GlobalTransform.Matrix.

Material

Pustaka ini mencakup tiga tipe material dengan kompleksitas yang meningkat:

LambertMaterial

Material klasik hanya difus:

var material = new LambertMaterial("WoodMaterial");
material.Diffuse = new Vector4(0.6f, 0.4f, 0.2f, 1.0f);
material.Ambient = new Vector4(0.1f, 0.1f, 0.1f, 1.0f);
material.Transparency = 0.0f;

PhongMaterial

Memperluas Lambert dengan sorotan spekular:

var material = new PhongMaterial("ShinyMetal");
material.Specular = new Vector4(0.8f, 0.8f, 0.8f, 1.0f);
material.Shininess = 50.0f;
material.SpecularPower = 32.0f;

PbrMaterial

Material rendering berbasis fisik yang digunakan oleh glTF 2.0:

var material = new PbrMaterial("GoldPBR");
material.BaseColor = new Vector4(1.0f, 0.8f, 0.2f, 1.0f);
material.Metallic = 0.9f;
material.Roughness = 0.1f;
material.Occlusion = 1.0f;

Material PBR mendukung slot tekstur untuk warna dasar, metalik/kekasaran, normal, emisif, dan peta oklusi melalui properti jalur tekstur string.

Utilitas Matematika

Pustaka ini menyediakan sekumpulan primitif matematika untuk operasi spasial 3D:

Tipe Vektor

TipeKomponenPresisiPenggunaan Umum
Vector2X, Yfloatkoordinat tekstur UV
Vector3X, Y, Zfloatvektor 3-komponen serbaguna
Vector4X, Y, Z, WfloatTitik kontrol, normal
FVector3X, Y, ZfloatProperti transformasi (Translasi, Skala)
FVector4X, Y, Z, WfloatData elemen vertex

Quaternion

Quaternion mewakili rotasi tanpa gimbal lock:

var rotation = new Quaternion(0, 0, 0, 1); // Identity
node.Transform.Rotation = rotation;

Matrix4

4x4 transformation matrices for composing transforms:

// Matrix operations are used internally by Transform
// and GlobalTransform for world-space computation

BoundingBox

Bounding box yang sejajar sumbu untuk kueri spasial:

// BoundingBox stores Minimum and Maximum FVector3 corners
// Used for frustum culling and spatial partitioning

Elemen Vertex

Mesh dapat membawa lapisan data per-vertex tambahan selain posisi:

  • VertexElementNormal – normal permukaan untuk perhitungan pencahayaan.
  • VertexElementUV – koordinat tekstur untuk memetakan gambar ke geometri.
  • VertexElementVertexColor – data warna RGBA per-vertex.

Setiap elemen vertex memiliki MappingMode (per titik kontrol, per vertex poligon, atau per poligon) dan sebuah ReferenceMode (nilai langsung atau nilai terindeks).

Klip Animasi

Kelas Scene kelas mendukung klip animasi bernama melalui CreateAnimationClip() dan GetAnimationClip(). Dalam edisi FOSS saat ini, pembuatan klip animasi dan pencarian berfungsi, tetapi data keyframe serta pemutaran belum diimplementasikan.

var scene = new Scene();
var clip = scene.CreateAnimationClip("Walk");

// Retrieve by name
var found = scene.GetAnimationClip("Walk");
Console.WriteLine("Clip found: " + (found != null));

Apa Selanjutnya

Posting berikutnya membahas bekerja dengan format file 3D di .NET – panduan praktis, format demi format untuk OBJ, STL, glTF, FBX, dan 3MF dengan opsi muat/simpan serta pola konversi batch.