在 介绍文章,,我们介绍了 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 (例如一个 Mesh 或 Camera).
创建与遍历节点
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 空间操作的数学原语::
向量类型
| 类型 | 组件 | 精度 | 常见用法 |
|---|---|---|---|
Vector2 | X, Y | float | UV 纹理坐标 |
Vector3 | X, Y, Z | float | 通用 3 分量向量 |
Vector4 | X, Y, Z, W | float | 控制点,法线 |
FVector3 | X, Y, Z | float | 变换属性(平移,缩放) |
FVector4 | X, Y, Z, W | float | 顶点元素数据 |
四元数
四元数表示旋转且不会出现万向锁::
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 指南,包含加载/保存选项和批量转换模式。.