首页 > 解决方案 > 在对象 Autodesk forge 查看器上创建一条线

问题描述

我的地板上有对象 我需要在其上创建一条线 我知道如何将几何图形添加到 Autodesk 查看器,但我不知道如何获取现有对象的几何图形或形状,以便我可以添加一条线相同的形状

到目前为止,根据我的理解,我能够使用 db id 获得该对象的网格,使用它我有 world matix 和 world bound

我确信解决方案就在这个问题上,但不知道如何使用它

这是我的地板线的样子

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

标签: autodesk-forgeautodesk-viewerautodesk

解决方案


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

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);
}

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


推荐阅读