跳到主要内容

网格转高斯泼溅

GsplatMesh 从渲染组件提取三角形,通过三角形光栅化在网格表面均匀生成高斯单元。

备注

此功能基于渲染架构。

概览​

该脚本组件:

  • 从实体层级的网格实例提取三角形。
  • 光栅化各三角形生成位置。
  • 使用自发光或漫反射材质颜色。
  • 内部创建 GSplatContainer。

适合将 3D 模型转为风格化泼溅表示。

基本用法​

// Import the script
const { GsplatMesh } = await import('path/to/gsplat-mesh.mjs');

// Add script component to an entity
entity.addComponent('script');
const meshSplat = entity.script.create(GsplatMesh);

// Build splats from another entity's mesh hierarchy
meshSplat.buildFromEntity(sourceEntity, {
splatSize: 0.02,
recursive: true
});

API​

buildFromEntity(entity, options)​

从实体网格层级构建。

参数:

参数类型默认值说明
entityEntity-提取网格的实体
options.splatSizenumber0.01单元尺寸与间距
options.recursivebooleantrue是否递归查找子节点
options.marginnumber0.65相对 splatSize 的边距系数

**尺寸:**越小生成越多、密度越高,间距按此值计算。

**边距:**控制三角形边缘不放单元的距离。0 表示延伸到边缘,较高值避免共享边重叠伪影。

clear()​

移除全部单元并销毁内部容器。

meshSplat.clear();

splatCount(只读)​

返回当前数量。

console.log(`Generated ${meshSplat.splatCount} splats`);

颜色提取​

按以下优先级取材质颜色:

  1. 非零自发光。
  2. 漫反射回退。
  3. 非 StandardMaterial 默认白色。

透明材质还提取不透明度,并减半以补偿重叠。

变换处理​

单元生成于脚本所在实体的局部空间:

  1. 获取源实体世界变换。
  2. 求逆,将顶点转入局部空间。
  3. 在该空间生成单元。

因此可用实体位置、旋转、缩放放置结果。

共享容器​

生成的容器可供多个 gsplat 组件共享:

// Build splats
meshSplat.buildFromEntity(sourceEntity, { splatSize: 0.05 });

// Get the container
const container = meshSplat.entity.gsplat.resource;

// Share with other entities
anotherEntity.addComponent('gsplat', {
resource: container
});

实时示例​

Procedural Mesh 演示将带动画云的地形场景转为泼溅。

程序化网格示例

脚本位置​

脚本位于引擎仓库:

scripts/esm/gsplat/gsplat-mesh.mjs

另请参见​