如何从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
相关产品推荐
相关产品推荐

