首先,我道歉,如果有一个解决方案,但我已经做了很多挖掘Three.js和A-Frame文档以及Stack Overflow并且没有找到我的东西寻找。
我想要做的是从一组我已经知道的共面的Vector3创建一个最适合的A-Frame平面。如果平面的角度是90的倍数,这很容易做到,但是其他任何东西和Box3s的.setFromPoints()算法都不能按我需要的方式工作。
从Three.js转换为A-Frame我很可能会处理自己,但是如果有人想解决这个问题,我们非常欢迎他们。我只需要创建一个实际上有意义的矩形平面。
基本上,我想创建一个执行此操作的算法:
创建粗体平面,而不是浪费太多空间的打火机盒/平面。
我不想创建完全符合要点的自定义几何体,这是我已经完成的。我实际上只想要一个只有高度,宽度,位置和旋转属性的A-Frame平面。我知道这不太精确,但它对我正在做的事情来说更为理想。
答案 0 :(得分:2)
好的,也许我以前的答案难以实施。这是另一个想法:计算点的凸包(https://en.wikipedia.org/wiki/Graham_scan提供一个简单有效的伪代码算法)。内在点无关紧要。最佳矩形必须与凸包的至少一个侧面重合。随着凸包侧面的所有角度计算具有该角度的矩形的尺寸。然后采取最低限度。
答案 1 :(得分:1)
首先找到通过这些点的最佳线。这被称为" line fit",就像这里:http://stackoverflow.com/questions/2352256/fit-a-3d-line-to-3d-point-data-in-java一样,应该很容易在两个维度而不是三个维度中执行此操作。另见:https://en.wikipedia.org/wiki/Deming_regression 该线给出了角度,点的垂直距离的minmax是矩形的高度,垂直脚点到线的位置的minmax是矩形的宽度。 或者您通过线的负角度旋转所有点,并简单地计算矩形的宽度和高度的点的x和y分量的最小值。
答案 2 :(得分:0)
对于搜索在threejs中计算共面点的最佳拟合矩形的人来说,这里有一个简单的解决方案,实施起来相当快:
然后planeNormal = crossVectors(A-B, B-C);
。或者,如果您有面孔,则取所有面孔的平均法线。
Vector3(0,0,1)
对于所有点:point.applyMatrix4(new Matrix4().makeRotationFromQuaternion(new Quaternion().setFromUnitVectors(new Vector3(0,0,1), planeNormal).invert()))
size = new BoundingBox().setFromPoints(points).getSize(new Vector3());
这将给出 x
和 y
组件中的矩形宽度和高度。 z
应该是 0
,如果所有点都共面。
现在我们有了足以创建平面几何的矩形法线、宽度和高度。