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:
| Primitif | Deskripsi |
|---|---|
Box | Kotak berorientasi sumbu dengan lebar, tinggi, dan kedalaman yang dapat dikonfigurasi |
Sphere | Bola parametrik dengan jari-jari yang dapat dikonfigurasi |
Cylinder | Silinder 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
| Tipe | Komponen | Presisi | Penggunaan Umum |
|---|---|---|---|
Vector2 | X, Y | float | koordinat tekstur UV |
Vector3 | X, Y, Z | float | vektor 3-komponen serbaguna |
Vector4 | X, Y, Z, W | float | Titik kontrol, normal |
FVector3 | X, Y, Z | float | Properti transformasi (Translasi, Skala) |
FVector4 | X, Y, Z, W | float | Data 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.