介绍文章,,我们介绍了 Aspose.3D FOSS for .NET 是什么以及如何入门。本文将更深入地探讨构成库的关键特性,并为每个领域提供代码示例。.

所有示例均假设使用以下 using 指令::

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

以及 NuGet 包::

dotnet add package Aspose.3D --version 26.1.0

场景图

场景图是核心数据结构。一个 Scene 包含一个 RootNode,,并且每个 Node 可以拥有子节点和一个附加的 Entity (例如一个 MeshCamera).

创建与遍历节点

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

将实体附加到节点

实体是场景的可视内容——网格、相机和灯光。使用以下方式附加它们: 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");

内置原始体

.NET 版包含参数化形状类,可在无需手动构建顶点的情况下生成几何体::

原语描述
Box轴对齐盒,宽度、高度和深度可配置
Sphere参数化球体,半径可配置
Cylinder参数化圆柱体,顶部/底部半径和高度可配置

这些原语可以直接附加到节点上,或转换为一个 Mesh 通过 ToMesh():

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

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

网格构建

如果需要完全控制,可以使用控制点和多边形定义从头构建网格::

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

控制点使用 Vector4 使用 w 组件设置为 1.0f 用于标准笛卡尔坐标位置。多边形通过将控制点索引传递给 CreatePolygon().

变换

每个 Node 拥有一个 Transform 属性,用于控制其本地位置、旋转和缩放::

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

变换继承

变换通过场景层级进行组合。子节点的世界空间位置是所有祖先变换的乘积::

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

只读的 GlobalTransform 每个…的属性 Node 在组合所有祖先变换后,提供计算得到的世界空间变换矩阵。通过以下方式访问结果: node.GlobalTransform.Matrix.

材质

该库包含三种随复杂度递增的材质类型::

LambertMaterial

经典的仅漫反射材质::

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

在 Lambert 基础上添加高光的扩展::

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

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;

PBR 材质通过字符串纹理路径属性支持基色、金属度/粗糙度、法线、发光和遮蔽贴图的纹理槽。.

数学工具

该库提供了一套用于 3D 空间操作的数学原语::

向量类型

类型组件精度常见用法
Vector2X, YfloatUV 纹理坐标
Vector3X, Y, Zfloat通用 3 分量向量
Vector4X, Y, Z, Wfloat控制点,法线
FVector3X, Y, Zfloat变换属性(平移,缩放)
FVector4X, Y, Z, Wfloat顶点元素数据

四元数

四元数表示旋转且不会出现万向锁::

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

用于空间查询的轴对齐包围盒::

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

顶点元素

网格可以携带除位置之外的额外每顶点数据层::

  • VertexElementNormal – 用于光照计算的表面法线。.
  • VertexElementUV – 用于将图像映射到几何体的纹理坐标。.
  • VertexElementVertexColor – 每顶点的 RGBA 颜色数据。.

每个顶点元素都有一个 MappingMode (每个控制点、每个多边形顶点或每个多边形)以及一个 ReferenceMode (直接值或索引值)。.

动画剪辑

Scene 类通过以下方式支持具名动画剪辑: CreateAnimationClip()GetAnimationClip().。在当前的 FOSS 版中,动画剪辑的创建和查找已可用,但关键帧数据和播放尚未实现。.

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

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

接下来

下一篇文章将介绍 在 .NET 中使用 3D 文件格式 – 一个实用的、逐格式的 OBJ、STL、glTF、FBX 和 3MF 指南,包含加载/保存选项和批量转换模式。.