如何在 JavaScript 中计算两个 3D 网格上的布尔对称差异“Delat-Mesh”?

问题描述

更新(2021-06-03):澄清我的问题,因为到目前为止还没有回复

我想计算两个 3D 网格的差异(布尔对称差异,XOR),并在第二步中将确定的“增量网格”保存为 OBJ 格式的文件

是否有 JavaScript 实现来计算布尔对称差异?

为了澄清我的问题,我添加了另一张图片

enter image description here

为此,我已经在 J​​avaScript 中实现了一个代码,该代码读取两个 OBJ 文件并将它们传输到数组中。每个数组都包含顶点,顶点的索引,用于描述面等。

结果:(Shape_1 和 Shape_2 是输入网格(模型 A 和 B),Shape_3 是要计算的所需输出网格)

Shape_1_Vertices = {
    "array_3D_Mesh_1": [
        {
            "0": {
                "X": -25,"Y": -15,"Z": 0
            }
        },{
            "1": {
                "X": -25,"Z": 100
            }
        },{
            "2": {
                "X": -25,"Y": 15,{
            "3": {
                "X": -25,{
            "4": {
                "X": 25,{
            "5": {
                "X": 25,{
            "6": {
                "X": 25,{
            "7": {
                "X": 25,"Z": 100
            }
        }
    ]
}

Shape_1_Faces = {
    "array_FaceIndices_Mesh_1": [
        {
            "face0": {
                "1": 2,"2": 0,"3": 3
            }
        },{
            "face1": {
                "1": 3,"3": 1
            }
        },{
            "face2": {
                "1": 6,"2": 2,"3": 7
            }
        },{
            "face3": {
                "1": 7,{
            "face4": {
                "1": 4,"2": 6,"3": 5
            }
        },{
            "face5": {
                "1": 5,{
            "face6": {
                "1": 0,"2": 4,{
            "face7": {
                "1": 1,{
            "face8": {
                "1": 1,"2": 5,{
            "face9": {
                "1": 3,{
            "face10": {
                "1": 4,"3": 6
            }
        },{
            "face11": {
                "1": 6,"3": 2
            }
        }
    ]
}

Shape_2_Vertices = {
    "array_3D_Mesh_2": [
        {
            "0": {
                "X": -20,"Y": -40,{
            "1": {
                "X": -20,"Z": 40
            }
        },{
            "2": {
                "X": -20,"Y": 40,{
            "3": {
                "X": -20,{
            "4": {
                "X": 20,{
            "5": {
                "X": 20,{
            "6": {
                "X": 20,{
            "7": {
                "X": 20,"Z": 40
            }
        }
    ]
}

Shape_2_Faces = {
    "array_FaceIndices_Mesh_2": [
        {
            "face0": {
                "1": 0,{
            "face1": {
                "1": 1,{
            "face2": {
                "1": 2,{
            "face3": {
                "1": 3,{
            "face4": {
                "1": 6,{
            "face5": {
                "1": 7,{
            "face6": {
                "1": 4,{
            "face7": {
                "1": 5,{
            "face8": {
                "1": 7,"2": 3,{
            "face9": {
                "1": 5,"3": 2
            }
        }
    ]
}

Shape_4_Vertices = {
    "array_3D_Mesh_4": [
        {
            "0": {
                "X": -25,{
            "4": {
                "X": -20,{
            "5": {
                "X": -20,{
            "6": {
                "X": -20,{
            "7": {
                "X": -20,{
            "8": {
                "X": -20,{
            "9": {
                "X": -20,{
            "10": {
                "X": -20,{
            "11": {
                "X": -20,{
            "12": {
                "X": 20,{
            "13": {
                "X": 20,{
            "14": {
                "X": 20,{
            "15": {
                "X": 20,{
            "16": {
                "X": 20,{
            "17": {
                "X": 20,{
            "18": {
                "X": 20,{
            "19": {
                "X": 20,{
            "20": {
                "X": 25,{
            "21": {
                "X": 25,{
            "22": {
                "X": 25,{
            "23": {
                "X": 25,"Z": 100
            }
        }
    ]
}

Shape_4_Faces = {
    "array_FaceIndices_Mesh_4": [
        {
            "face0": {
                "1": 9,"2": 7,"3": 8
            }
        },{
            "face1": {
                "1": 8,{
            "face2": {
                "1": 16,"2": 14,"3": 17
            }
        },{
            "face3": {
                "1": 17,"3": 15
            }
        },{
            "face4": {
                "1": 9,"2": 17,{
            "face6": {
                "1": 8,"2": 16,"3": 9
            }
        },{
            "face7": {
                "1": 9,"2": 15,{
            "face9": {
                "1": 6,"3": 14
            }
        },{
            "face10": {
                "1": 16,"2": 22,{
            "face11": {
                "1": 14,"3": 20
            }
        },{
            "face12": {
                "1": 16,"2": 8,"3": 18
            }
        },{
            "face13": {
                "1": 18,"3": 10
            }
        },{
            "face14": {
                "1": 6,{
            "face15": {
                "1": 8,"3": 2
            }
        },{
            "face16": {
                "1": 6,"3": 4
            }
        },{
            "face17": {
                "1": 4,"3": 12
            }
        },{
            "face18": {
                "1": 6,{
            "face19": {
                "1": 7,{
            "face20": {
                "1": 15,"3": 13
            }
        },{
            "face21": {
                "1": 13,{
            "face22": {
                "1": 9,"3": 11
            }
        },{
            "face23": {
                "1": 11,"3": 19
            }
        },{
            "face24": {
                "1": 15,"2": 13,{
            "face25": {
                "1": 14,{
            "face26": {
                "1": 16,"2": 18,{
            "face27": {
                "1": 17,{
            "face28": {
                "1": 4,"2": 12,{
            "face29": {
                "1": 5,{
            "face30": {
                "1": 9,"2": 11,{
            "face31": {
                "1": 8,{
            "face32": {
                "1": 18,"2": 10,{
            "face33": {
                "1": 19,{
            "face34": {
                "1": 6,"3": 0
            }
        },{
            "face35": {
                "1": 0,{
            "face36": {
                "1": 1,{
            "face37": {
                "1": 1,"3": 21
            }
        },{
            "face38": {
                "1": 21,{
            "face39": {
                "1": 20,{
            "face40": {
                "1": 2,{
            "face41": {
                "1": 3,{
            "face42": {
                "1": 8,{
            "face43": {
                "1": 9,{
            "face44": {
                "1": 9,"3": 23
            }
        },{
            "face45": {
                "1": 9,"2": 23,{
            "face46": {
                "1": 17,"3": 22
            }
        },{
            "face47": {
                "1": 17,"3": 16
            }
        },{
            "face48": {
                "1": 20,{
            "face49": {
                "1": 21,{
            "face50": {
                "1": 1,"2": 21,{
            "face51": {
                "1": 3,"3": 23
            }
        }
    ]
}

为了澄清我的想法,我附上了一张图片

enter image description here

  1. 显示要比较的初始主体,它们以 OBJ 格式单独提供
  2. 显示两个物体的叠加位置。 (定位会在导入过程中根据需要自动更正,因此我不必担心)。
  3. 显示所需的“增量网格”,我想将其计算并输出为 OBJ 格式的文件。 (虚线框中的主体显示了交叉点,最后必须将其剪掉,但不感兴趣)。

如果你想用布尔运算来实现我的意图,你就必须执行布尔对称差或 XOR(异或)。

我附上了三个文件,你可以找到我想用算法计算的两个输入网格和所需的输出

Shape_1_Input_Model_A Shape_2_Input_Model_B Shape_4_Desired_Output http://www.filedropper.com/shape4

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)