在对象Autodesk Forge Viewer上创建一条线

问题描述

我的地板上有物体,我需要在其上创建一条线 我知道如何将几何图形添加到Autodesk Viewer,但是我对如何获取几何图形或现有对象的形状感到困惑,以便可以在其上添加具有相同形状的线

直到现在我的理解 我可以使用具有世界Matix和世界绑定的db ID来获取该对象的网格物体

我确定解决方案可以解决此问题,但不确定如何使用

这是我的底线样子

蓝线是地板,现在需要在其上添加一条黄线,以显示一个示例,我已使用Paint添加了黄线

image

解决方法

您可以使用FragmentList结构在Forge模型中检索特定元素的几何形状:

function listTriangles(geometry) {
    console.log('Triangle count',geometry.polyCount);
    const stride = geometry.vbstride;
    const vbPositionOffset = geometry.attributes.position.itemOffset;
    for (let tri = 0; tri < geometry.polyCount; tri++) {
        let i1 = geometry.ib[tri * 3],i2 = geometry.ib[tri * 3 + 1],i3 = geometry.ib[tri * 3 + 2];
        let v1 = new THREE.Vector3(
            geometry.vb[i1 * stride + vbPositionOffset],geometry.vb[i1 * stride + vbPositionOffset + 1],geometry.vb[i1 * stride + vbPositionOffset + 2]
        );
        let v2 = new THREE.Vector3(
            geometry.vb[i2 * stride + vbPositionOffset],geometry.vb[i2 * stride + vbPositionOffset + 1],geometry.vb[i2 * stride + vbPositionOffset + 2]
        );
        let v3 = new THREE.Vector3(
            geometry.vb[i3 * stride + vbPositionOffset],geometry.vb[i3 * stride + vbPositionOffset + 1],geometry.vb[i3 * stride + vbPositionOffset + 2]
        );
        console.log('Triangle vertices',v1,v2,v3);
    }
}

function listMeshes(model,dbid) {
    const tree = model.getInstanceTree();
    const frags = model.getFragmentList();
    tree.enumNodeFragments(dbid,function (fragid) {
        let mesh = frags.getVizmesh(fragid); // Note: the mesh object will be reused next time we call getVizmesh!
        listTriangles(mesh.geometry);
    },true);
}

请注意,这只会为您提供单个三角形,它们的顶点等。如果您想以某种方式将三角形列表映射到折线中,那将是一项不平凡的任务,需要一定的计算图形专业知识。