Dalam pos pengenalan, kami membincangkan apa Aspose.3D FOSS untuk .NET itu dan bagaimana untuk memulakan. Pos ini menyelami lebih dalam ciri utama yang membentuk perpustakaan, dengan contoh kod untuk setiap bahagian.

Semua contoh menganggap arahan using berikut:

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

Dan pakej NuGet:

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

Graf Adegan

Graf adegan adalah struktur data teras. Sebuah Scene mengandungi satu RootNode, dan setiap Node boleh mempunyai nod anak dan satu lampiran Entity (seperti sebuah Mesh atau Camera).

Mencipta dan Menavigasi Nod

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 Entiti kepada Nod

Entiti adalah kandungan visual bagi 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 Binaan

Edisi .NET termasuk kelas bentuk parametrik yang menjana geometri tanpa pembinaan vertex secara manual:

PrimitifDeskripsi
BoxKotak selari paksi dengan lebar, tinggi, dan kedalaman yang boleh dikonfigurasi
SphereSfera parametrik dengan jejari yang boleh dikonfigurasi
CylinderSilinder parametrik dengan jejari atas/bawah yang boleh dikonfigurasi dan tinggi

Primitif ini boleh dilampirkan secara langsung kepada nod atau ditukar menjadi a 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);

Pembinaan Mesh

Jika anda memerlukan kawalan penuh, bina mesh dari awal menggunakan titik kawalan 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 kawalan menggunakan Vector4 dengan w komponen ditetapkan kepada 1.0f untuk kedudukan Kartesian standard. Poligon ditakrifkan dengan menghantar indeks titik kawalan kepada CreatePolygon().

Transformasi

Setiap Node mempunyai satu Transform sifat yang mengawal kedudukan tempatan, putaran, 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 Transformasi

Transformasi digabungkan melalui hierarki adegan. Kedudukan ruang-dunia anak adalah hasil darab 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

Sifat baca-sahaja GlobalTransform sifat pada setiap Node menyediakan matriks transformasi ruang-dunia yang dikira selepas menyusun semua transformasi nenek moyang. Akses hasilnya melalui node.GlobalTransform.Matrix.

Bahan

Pustaka ini merangkumi tiga jenis bahan dengan kerumitan yang semakin meningkat:

LambertMaterial

Bahan klasik yang 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

Bahan rendering berasaskan fizikal 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;

Bahan PBR menyokong slot tekstur untuk base color, metallic/roughness, normal, emissive, dan occlusion maps melalui sifat laluan tekstur rentetan.

Utiliti Matematik

Pustaka ini menyediakan satu set primitif matematik untuk operasi ruang 3D:

Jenis Vektor

JenisKomponenKetepatanPenggunaan Umum
Vector2X, YfloatKoordinat tekstur UV
Vector3X, Y, ZfloatVektor 3-komponen tujuan umum
Vector4X, Y, Z, WfloatTitik kawalan, normal
FVector3X, Y, ZfloatSifat transformasi (Terjemahan, Skala)
FVector4X, Y, Z, WfloatData elemen vertex

Quaternion

Quaternion mewakili putaran 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

Kotak pembatas yang selari paksi untuk pertanyaan spatial:

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

Elemen Vertex

Mesh boleh membawa lapisan data per-vertex tambahan selain kedudukan:

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

Setiap elemen vertex mempunyai MappingMode (per titik kawalan, per vertex poligon, atau per poligon) dan satu ReferenceMode (nilai langsung atau nilai berindeks).

Klip Animasi

The Scene kelas menyokong klip animasi bernama melalui CreateAnimationClip() dan GetAnimationClip(). Dalam edisi FOSS semasa, penciptaan dan pencarian klip animasi berfungsi, tetapi data bingkai kunci dan playback belum dilaksanakan.

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

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

Apa Seterusnya

Pos seterusnya merangkumi bekerja dengan format fail 3D dalam .NET – panduan praktikal, format demi format kepada OBJ, STL, glTF, FBX, dan 3MF dengan pilihan muat/simpan dan corak penukaran pukal.