You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Node.js中getRenderProxy返回对象提取Mesh的vb与ib数组?

解决方法

核心问题分析

直接访问RenderProxy.geometry不可靠,因为Autodesk Viewer内部会对几何体做延迟初始化、渲染优化等处理,导致该属性可能未定义或返回不稳定的缓冲区数据。官方推荐通过FragmentList来获取片段的几何体信息,这是更稳定的方式。

修改后的代码

function getMeshByDbID(dbID) {
    const instanceTree = getInstanceTree();
    const fragList = window.NOP_VIEWER.impl.getFragmentList();
    const meshData = [];

    instanceTree.enumNodeFragments(dbID, function(fragId) {
        // 获取当前片段的几何体对象
        const geometry = fragList.getGeometry(fragId);
        if (!geometry) return; // 跳过未加载完成的片段

        // 提取顶点缓冲区(vb)和索引缓冲区(ib)
        // vb/ib本身是TypedArray(如Float32Array/Uint32Array),可直接用于计算
        const vertexBuffer = geometry.vb;
        const indexBuffer = geometry.ib;

        // 如果需要转换为普通数组,可使用Array.from()
        const vertexArray = Array.from(vertexBuffer);
        const indexArray = Array.from(indexBuffer);

        meshData.push({
            fragId: fragId,
            vertices: vertexArray, // 或直接用vertexBuffer
            indices: indexArray,   // 或直接用indexBuffer
            geometry: geometry
        });
    }, true);

    return meshData;
}

确保模型加载完成

调用上述函数前,必须保证模型已完全加载,否则可能获取不到几何体数据。可以通过监听Viewer的AGGREGATE_END事件来触发:

window.NOP_VIEWER.addEventListener(Autodesk.Viewing.AGGREGATE_END, function() {
    // 替换为你的目标ObjectID
    const targetDbID = 123;
    const result = getMeshByDbID(targetDbID);
    console.log('提取的几何体数据:', result);
});

关于结果不一致的说明

之前三次运行RenderProxy.geometry.vb结果不一致,是因为直接访问了Viewer内部未稳定的WebGL缓冲区——Viewer会根据渲染状态动态复用或更新缓冲区数据。而通过FragmentList.getGeometry()获取的是预加载完成的、稳定的几何体副本,不会出现数据波动的问题。

内容的提问来源于stack exchange,提问作者user16570427

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 04:02:59