创建最大体积的内嵌3D框,适合点阵列

时间:2014-12-03 02:12:09

标签: javascript 3d three.js geometry

我有一个3D网格,由一组3D点(顶点)和一组面(点之间的连接)组成。

Q1 如何找到适合网格内部的最大(体积)刻录框。

[OP]

大家好,感谢您给我的任何帮助。我正在使用向量来创建三维对象。我需要帮助的是找到适合对象的最大盒子。想象一下,我们有一个球体。如何找到最适合球体的盒子?另一方面,如果我们有一个三维箭头怎么办?我怎样才能找到适合它的最大的盒子?我有用于创建对象的所有向量的数组。我正在寻找一种方法来使用这些数组来找到最适合构造对象的盒子。

1 个答案:

答案 0 :(得分:1)

  1. 如果通用点位于网格内部,则需要进行测试

  2. 现在找到网格的边界框

    • 找到每个轴的 min max 值(来自Vertex点)
    • 这会导致多边形的最大尺寸
  3. 您的任务在代数上无法解决通用网格,所以

    • 你必须使用蛮力+启发式......
    • 例如方法 genere and test
    • 因此生成所有(有效)解决方案并从中获取最大的解决方案
    • 只有通过尝试所有可能性才能找到最佳解决方案
    • 但由于无限多种可能性,这是不可能的
    • 所以你只能达到解决方案的近似值
    • 我认为使用Voxel地图将大大提高此
    • 的性能
    • 启发式意味着您只尝试一些解决方案(基于任务/数据集的知识或利用某些东西)
    • 例如,如果你有对称网格,那么你可以像网格一样开始你的盒子对称和对称(不需要尝试一些未对齐的盒子......
  4. 创建体素地图

    • 你有边框
    • 因此制作将您的网格体积剖析为立方体的3D阵列
    • 将每个体素设置为0(外部)或1(内部)网格
  5. 创建将确定通用框是否在网格内

    的函数
    • 每个盒子的体素只运行3个嵌套fors
    • 并且如果所有体素都设置为1,则框在
  6. 创建盒子生成器和测试器

    • 使用一些网格步骤(例如体素大小)生成所有有效框可能性 - 对于轴对齐框,它是6个嵌套fors
    • 在每个第一个计算卷上
    • 然后比较它实际找到的解决方案
    • 如果它不大,则跳过它并继续下一个框
    • 如果它更大则从子弹5运行功能
    • 如果它在里面,请记住它作为新的实际解决方案
  7. 最后你应该接近你的解决方案

  8. 您可以通过增加子弹7后的体素数量(使用较小的体素)来提高准确度。

    • 例如每个轴使用2倍以上的体素
    • 现在尝试使用已找到解决方案中的方框+ - 1个体素
    • 你可以递归地应用它来达到想要的精度
  9. [注释]

    • 如果您的盒子是任意方向的,那么您需要再添加3个尺寸(角度)
    • 导致疯狂的复杂性
    • 您可以尝试旋转网格,使框与轴对齐
    • 所以首先找到内部最大的线并旋转网格,使其对齐为轴x
    • 然后在yz平面中找到另一个并通过x轴旋转网格,使线变为轴y
    • 这样解决方案应该是轴对齐的(但情况并非总是如此!!!)
    • 初始体素地图填充样式确定您找到的解决方案是否会碰到表面......
相关问题