可以使用 gltf-transform 从 GLTF 中删除隐藏的纹理吗?

Possible to remove hidden textures from GLTF using gltf-transform?

假设我在同一场景中合并了 2 个不透明材质的模型。在某些情况下,其中一个模型很小,而在 completely/partially hidden/encapsulated 中是大模型。例如(球内球)。有没有一种方法可以识别隐藏部分并删除与隐藏部分相关的纹理,以便可以删除未使用的纹理并减小尺寸?

以前我有关于合并各种模型的问题 使用 gltf-transform 解决了。

看看是否可以针对该区域进行优化。

这个问题较难的部分是决定如何定义“部分隐藏”之类的东西,然后如何检测场景的哪些部分符合该标准。 RapidCompact 等商业工具可能会在这方面做得很好,但如果没有它们,我希望您需要技术美工针对您的特定模型进行一些自定义工作和调整。

如果你能以某种方式识别出不需要的网格 那么是的,gltf-transform 可以用来移除或缩小这些纹理......一个相当天真的实现看起来有点像像这样:

import { bounds } from '@gltf-transform/functions';

// Compute max dimension of scene.

const scene = document.getRoot().listScenes().pop();
const sceneSize = boundsToSize(bounds(scene));

// Find all nodes <1/100th that size.

const smallNodes = new Set();
for (const node of document.getRoot().listNodes()) {
  if (!node.getMesh()) continue;
  
  const nodeSize = boundsToSize(bounds(node));
  if (sceneSize > nodeSize * 100) {
    smallNodes.add(node);
  }
}

// Find all materials for small nodes.
//
// NOTE: It's common for materials to be reused by many
// primitives, but this code does not check for that.

const materialsToModify = new Set();
for (const node of Array.from(smallNodes)) {
  for (const prim of node.getMesh().listPrimitives()) {
    materialsToModify.add(prim.getMaterial());
  }
}

// Remove textures identified.
//
// NOTE: It's common for textures to be reused by many
// materials, but this code does not check for that.

for (const texture of document.getRoot().listTextures()) {
  const shouldDispose = texture.listParents()
    .some((material) => materialsToModify.has(material));
  if (shouldDispose) {
    texture.dispose();
  }
}

/** Helper to get max dimension from bounding box. */
function boundsToSize(bounds) {
  const dims = [
    Math.abs(bounds.max[0] - bounds.min[0]),
    Math.abs(bounds.max[1] - bounds.min[1]),
    Math.abs(bounds.max[2] - bounds.min[2])
  ];
  return Math.max(...dims);
}

希望这些信息足以帮助您入门。检查更高级的标准(如遮挡和封装)更加复杂——而 glTF-Transform 本身不包含执行此操作的算法。对于少量模型,在 Blender 中清理它们可能比实现所有模型更容易。如果您确实想对此进行编程,并且在实施过程中遇到问题,那么在此处的讨论部分提问可能是一个不错的选择:https://github.com/donmccurdy/glTF-Transform/discussions.